一、什么是 /var/lib/container
/var/lib/container 是 TKE 节点数据盘挂载的默认特殊路径。当你将数据盘的挂载路径设置为 /var/lib/container 时,系统会自动将以下关键目录统一挂载到该数据盘上:
| 目录 | 挂载点 | 用途 |
| /var/lib/kubelet | /var/lib/container/kubelet | Kubelet 工作目录,存储 Pod 元数据和挂载信息 |
| /var/lib/containerd | /var/lib/container/containerd | 容器运行时数据目录,存储容器镜像和运行时数据 |
| /var/log/pods | /var/lib/container/log | Pod 日志目录,存储各 Pod 的标准输出和标准错误日志 |
| /var/lib/docker | /var/lib/container/docker | Docker 运行时数据目录(使用 Docker 运行时的集群) |
注意:说明:
注意:/var/lib/container 不是 /var/lib/containerd 的缩写或拼写错误,二者是不同的路径。/var/lib/container 是 TKE 定义的一个统一存储路径,用于同时承载 Kubelet 和容器运行时的全部数据。
二、Bind Mount 机制
当你配置数据盘挂载路径为 /var/lib/container 时,TKE 节点初始化脚本执行以下操作:
1. 格式化数据盘:将数据盘格式化为指定的文件系统(如 ext4)。
2. 挂载到 /var/lib/container:将格式化后的数据盘挂载到 /var/lib/container 目录。
3. 创建子目录:在 /var/lib/container 下创建 kubelet、containerd(或 docker)、log 等子目录。
4. Bind Mount 绑定挂载:通过 Linux bind mount 将各子目录绑定到对应的系统路径。例如:
·/var/lib/container/kubelet → /var/lib/kubelet
·/var/lib/container/containerd → /var/lib/containerd
·/var/lib/container/log → /var/log/pods
·/var/lib/container/docker → /var/lib/docker
注意:说明:
注意:Bind mount 是一种 Linux 内核机制,它将一个目录挂载到另一个路径上,使得两个路径访问的是同一份数据。通过 bind mount,Kubelet 和容器运行时的配置文件无需修改默认路径,即可将数据实际存储到数据盘上。
三、为什么不直接修改配置文件
TKE 选择使用 bind mount 而不是直接修改 Kubelet 或容器运行时的配置文件路径,原因如下:
·兼容性:无需修改 Kubelet 和容器运行时的默认配置,避免因配置路径变更导致的兼容问题。
·统一管理:通过单一数据盘路径同时管理 Kubelet 和容器运行时的数据。
·运维一致性:操作系统层面的路径保持标准一致,便于统一运维和排障。
四、高级设置中“容器目录”配置的变化
当你在数据盘挂载路径中填写 /var/lib/container 后,高级设置中的容器目录配置项将自动隐藏。这是正常行为,不是系统异常。
原因说明:/var/lib/container 路径已经包含了容器目录的挂载逻辑。系统会自动将容器运行时的数据目录(/var/lib/containerd 或 /var/lib/docker)通过 bind mount 挂载到 /var/lib/container 下,因此不再需要单独配置容器目录。
五、注意事项
·路径验证:配置数据盘挂载路径为 /var/lib/container 后,你可以通过 SSH 登录节点执行 mount 或 df -h 命令,查看 bind mount 绑定关系。此时虽然实际数据存储在数据盘上,但 /var/lib/containerd 等路径仍然可以正常访问。
·仅需修改运行时路径的场景:如果你只需要将容器运行时的数据存储到数据盘上,而不需要同时迁移 Kubelet 数据,可以将挂载路径设置为其他自定义路径(例如 /data),然后在高级设置中将容器目录指向该路径。
·路径混淆排查:如果你在节点上执行 ls /var/lib/containerd 能看到容器数据,同时发现数据盘挂载在 /var/lib/container 目录下,这是 bind mount 的正常效果,两个路径指向的是同一份数据。