Kubernetes 节点从 Docker 迁移到 containerd

适用场景

Kubernetes 1.24+ 移除了 dockershim,节点需要从 Docker Engine 切换到 containerd(或其他 CRI 运行时)。适用于 kubeadm 自建集群和部分托管节点。

前置条件

步骤

  1. 记录当前运行时和节点状态:
kubectl get nodes -o wide
systemctl status docker kubelet
cat /var/lib/kubelet/kubeadm-flags.env
  1. 驱逐节点:
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
  1. 安装并配置 containerd:
apt install containerd.io
containerd config default > /etc/containerd/config.toml

确保启用 systemd cgroup:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

配置镜像仓库/加速和 sandbox 镜像后重启:

systemctl enable --now containerd
systemctl restart containerd
crictl info
  1. 修改 kubelet 使用 CRI socket:
# /var/lib/kubelet/kubeadm-flags.env
--container-runtime-endpoint=unix:///run/containerd/containerd.sock
systemctl daemon-reload
systemctl restart kubelet
  1. 验证并恢复调度:
kubectl get nodes -o wide
kubectl uncordon <node>
kubectl get pods -A -o wide | grep <node>

验证

回滚

常见坑

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 迁移开始前必须确认哪些前置条件?
  2. 切换运行时后,如何验证节点可用并恢复调度?
  3. 回滚到 Docker 的关键步骤和注意事项是什么?
答案
  1. 确认 Kubernetes 版本、kubelet 配置和 CNI 插件,准备 containerd 包及镜像仓库/加速配置,安排逐节点维护窗口,并备份 kubelet 配置和节点状态。
  2. 先确认 crictl info 正常、节点 Ready、Pod 能创建和拉取镜像、Service/Ingress/跨节点网络正常且 kubelet 日志无 CRI 错误,再执行 kubectl uncordon。
  3. 保留 Docker 包和旧 kubelet 配置,重新 drain 后恢复 docker socket、启动 Docker、重启 kubelet 并 uncordon;注意镜像存储不共享,可能需要重新拉取镜像。