Kubernetes v1.24 版本移除 DockerShim 后如何配置 containerd

文章导读
Kubernetes v1.24 版本正式移除了 Dockershim 组件,这意味着集群节点不再能直接使用 Docker Engine 作为容器运行时,必须迁移到符合 CRI 标准的运行时,如 containerd 或 CRI-O。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

Kubernetes v1.24 版本正式移除了 Dockershim 组件,这意味着集群节点不再能直接使用 Docker Engine 作为容器运行时,必须迁移到符合 CRI 标准的运行时,如 containerd 或 CRI-O。

先说结论:升级至 1.24 及以上版本前,必须将节点运行时从 Docker 迁移至 containerd,否则 kubelet 无法管理容器。

Kubernetes v1.24 版本移除 DockerShim 后如何配置 containerd
  • 适合:Kubernetes 1.24 及更高版本集群,或计划升级至此版本的场景。
  • 先准备:备份节点数据,确认工作负载不依赖节点上的 Docker 命令构建镜像。
  • 验收:检查节点运行时状态为 containerd,且业务 Pod 正常运行。

命令速用版

# 生成 containerd 默认配置
containerd config default | sudo tee /etc/containerd/config.toml

# 配置 kubelet 使用 containerd socket
`--container-runtime-endpoint`=unix:///run/containerd/containerd.sock

# 查看节点运行时信息
kubectl get nodes -o wide

为什么会这样

在 Kubernetes v1.24 之前,集群通过内置的 Dockershim 组件与 Docker Engine 通信。Dockershim 充当了 Kubernetes CRI 接口与 Docker API 之间的适配层。随着容器化标准的发展,直接使用符合 CRI 规范的运行时(如 containerd)更加高效且维护成本更低。因此,社区在 1.20 版本宣布弃用,并在 1.24 版本正式移除了 Dockershim。

Kubernetes v1.24 版本移除 DockerShim 后如何配置 containerd

分步处理

迁移过程建议先在测试环境验证,生产环境建议在业务低峰期操作。

Kubernetes v1.24 版本移除 DockerShim 后如何配置 containerd
  1. 安装 containerd:在节点上安装 containerd 服务,并生成默认配置文件。
  2. 配置 kubelet:修改 kubelet 启动参数,指定 `--container-runtime-endpoint` 为 containerd 的 socket 路径(通常是 unix:///run/containerd/containerd.sock)。
  3. 停止 Docker 服务:确认配置无误后,停止并禁用 Docker 服务,避免端口或资源冲突。
  4. 重启 kubelet:使新配置生效,节点重新加入集群。

怎么验证是否生效

执行 kubectl get nodes -o wide,观察输出中的运行时信息是否显示为 containerd。登录节点执行 crictl ps 应能查看到运行的容器列表,而 docker ps 可能无法显示 Kubernetes 管理的容器。

常见坑

  • 镜像构建依赖:containerd 不具备 Docker Build 功能,请勿在节点上使用 docker build 构建镜像,建议改用 CI/CD 流程或构建工具。
  • 节点池升级风险:部分云厂商的节点池升级方案可能会重置系统盘,需提前备份数据或采用新建节点池轮转的方式。
  • 亲和性配置:若负载设置了节点亲和性,迁移后需确认新节点池的标签是否匹配,避免调度失败。

参考来源

  • 阿里云帮助中心 - 如何将节点容器运行时从 Docker 迁移到 containerd
  • Kubernetes 官方文档 - 从 Dockershim 迁移
  • Kubernetes 官方文档 - 检查移除 Dockershim 是否对你有影响
  • 华为云 CCE - 将节点容器引擎从 Docker 迁移到 Containerd