本文详细介绍了将容器运行时从 Docker 迁移到 Containerd 的完整流程和操作步骤。由于 Kubernetes 自 v1.24 起移除了 dockershim,不再原生支持 Docker Engine,因此用户必须迁移至受支持的 CRI 兼容运行时。本文通过实际的三节点集群环境演示,从节点驱逐、服务停止、Containerd 部署、kubelet 配置调整到最终验证的每一步操作,确保迁移过程平滑无中断,保障业务连续性。
一、背景
Kubernetes 自 v1.24 起移除了 dockershim,不再原生支持 Docker Engine,用户需迁移至受支持的 CRI 兼容运行时,如:
Containerd 轻量级、高性能的行业标准运行时,由 Docker 衍生而来
CRI-O 专为 Kubernetes 设计的轻量级运行时,Red Hat 主导开发
Docker Engine + cri-dockerd(兼容方案,但需额外维护)
迁移原因:
兼容性保障 - 确保集群能升级到 Kubernetes 1.24+ 版本
安全维护 - 获得持续的安全更新和漏洞修复
性能优化 - Containerd 相比 Docker 更轻量,资源占用更少
社区支持 - Docker 运行时在 Kubernetes 社区中的支持已逐步减少
二、迁移步骤
迁移过程需要谨慎执行,建议遵循"逐个节点、滚动迁移"的原则,确保业务不中断。以下步骤将指导您完成从 Docker 到 Containerd 的平滑过渡。
1.前置准备
迁移前,首先需要将目标节点从集群中隔离,确保该节点上的工作负载能够安全地迁移到其他节点。这通过 Kubernetes 的 drain 命令实现,该命令会驱逐节点上的所有 Pod(除 DaemonSet 管理的 Pod 外),并将其重新调度到其他可用节点。
当前是3个node节点,都是docker运行时,现在驱逐node-3节点
#移除节点 [root@master-1 ~]# kubectl drain node-3 --ignore-daemonsets #停止相关服务 [root@node-3 ~]# systemctl stop kubelet [root@node-3 ~]# systemctl stop docker [root@node-3 ~]# systemctl disable docker --now [root@node-3 ~]# systemctl stop kube-proxy关键注意事项:
--ignore-daemonsets参数允许忽略 DaemonSet 管理的 Pod(如网络插件、监控代理等)确保节点上运行的关键业务有多个副本,避免服务中断