安全变更容器数据盘路径
本文介绍如何安全的对容器的数据盘路径进行变更。
Docker 运行时
注意事项
如果节点上容器运行时是 Docker,想要变更 Docker Root Dir,需要谨慎一点。如果操作不慎,可能造成采集不到容器监控数据,因为容器监控数据由 kubelet 的 cadvisor 模块提供,而由于 docker 没有实现 CRI 接口,cadvisor 会对 Docker 有一些特殊处理: 在刚启动时,通过 docker info
获取 Docker Root Dir
路径,后续逻辑会依赖这个路径。
如果在 kubelet 运行过程中,改了 Docker Root Dir
,cadvisor 并不会更新路径,仍然认为路径是之前的,就会造成 kubelet 不能正常返回监控指标并且报类似如下的错:
Mar 21 02:59:26 VM-67-101-centos kubelet[714]: E0321 02:59:26.320938 714 manager.go:1086] Failed to create existing container: /kubepods/burstable/podb267f18b-a641-4004-a660-4c6a43b6e520/03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03: failed to identify the read-write layer ID for container "03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03". - open /var/lib/docker/image/overlay2/layerdb/mounts/03164d8f0d1f55a285b50b2117d6fdb2c33d2fa87f46dba0f43b806017607d03/mount-id: no such file or directory
变更步骤
- 驱逐节点(
kubectl drain NODE
),让存量 Pod 漂移到其它节点上,参考 安全维护或下线节点。 - 修改 dockerd 配置文件
/etc/docker/daemon.json
:{
"graph": "/data/docker"
} - 重启 dockerd:
systemctl restart docker
# systemctl restart dockerd - 重启 kubelet
systemctl restart kubelet
- 节点恢复为可调度状态:
kubectl uncordon NODE
。
其它运行时
其它运行时都实现了 CRI 接口,变更容器 Root Dir 就不需要那么严谨,不过安全起见,还是建议先安全的将节点上存量 Pod 驱逐走(参考 安全维护或下线节点),然后再修改运行时配置并重启容器运行时。
配置修改方式参考对应运行时的官方文档,这里以常用的 containerd
为例:
- 修改
/etc/containerd/config.toml
:root = "/data/containerd"
- 重启 containerd:
systemctl restart containerd
- 节点恢复为可调度状态:
kubectl uncordon NODE
。