TIPS之 Kubernetes Container 数据盘设置

Kubernetes Container 数据盘设置经验

Posted by 董江 on Sunday, March 21, 2021

变更 Kubernetes Container 数据盘路径

避免 Linux 系统盘 no space left on device 问题,主要是容器images容器log

Docker 运行时

注意事项

如果节点上容器运行时是 Docker,想要变更 Docker Root Dir,需要谨慎一点。如果操作不慎,可能造成采集不到容器监控数据,因为容器监控数据由 kubeletcadvisor 模块提供,而由于 docker 没有实现 CRI 接口,cadvisor 会对 Docker 有一些特殊处理: 在刚启动时,通过 docker info 获取 Docker Root Dir 路径,后续逻辑会依赖这个路径。

如果在 kubelet 运行过程中,改了 Docker Root Dircadvisor 并不会更新路径,仍然认为路径是之前的,就会造成 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

变更步骤

  1. 驱逐节点(kubectl drain NODE),让存量 Pod 漂移到其它节点上,参考 Kubernetes 安全维护下线/上线节点
  2. 修改 dockerd 配置文件 /etc/docker/daemon.json:
    {
      "graph": "/data/docker"
    }
    
  3. 重启 dockerd:
    systemctl restart docker
    #systemctl restart dockerd
    systemctl status docker
    
  4. 重启 kubelet
    systemctl restart kubelet
    
  5. 节点恢复为可调度状态: kubectl uncordon NODE

其它运行时

其它运行时都实现了 CRI 接口,变更容器 Root Dir 就不需要那么严谨,不过安全起见,还是建议先安全的将节点上存量 Pod 驱逐走(参考 Kubernetes 安全维护下线/上线节点),然后再修改运行时配置并重启容器运行时。

配置修改方式参考对应运行时的官方文档,这里以常用的 containerd 为例:

  1. 修改 /etc/containerd/config.toml:
    root = "/data/containerd"
    
  2. 重启 containerd:
    systemctl restart containerd
    
  3. 节点恢复为可调度状态: kubectl uncordon NODE

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付