Kubernetes v1.24 版本正式移除了 Dockershim 组件,这意味着集群节点不再能直接使用 Docker Engine 作为容器运行时,必须迁移到符合 CRI 标准的运行时,如 containerd 或 CRI-O。
先说结论:升级至 1.24 及以上版本前,必须将节点运行时从 Docker 迁移至 containerd,否则 kubelet 无法管理容器。
- 适合: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。
分步处理
迁移过程建议先在测试环境验证,生产环境建议在业务低峰期操作。
- 安装 containerd:在节点上安装 containerd 服务,并生成默认配置文件。
- 配置 kubelet:修改 kubelet 启动参数,指定
`--container-runtime-endpoint`为 containerd 的 socket 路径(通常是unix:///run/containerd/containerd.sock)。 - 停止 Docker 服务:确认配置无误后,停止并禁用 Docker 服务,避免端口或资源冲突。
- 重启 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
原文链接:https://www.zjcp.cc/ask/10292.html
