一、迁移前准备
在开始迁移前,需要确保以下几点:
- 所有节点(master和worker)运行Ubuntu 18.04/20.04/22.04
- 备份所有重要数据,尤其是etcd集群
- 确认Kubernetes版本≥1.24(Docker shim已移除)
- 准备好维护窗口,迁移期间集群可能不可用
二、安装containerd
在所有节点上执行以下操作:
- 配置Docker仓库并安装依赖
# 添加Docker仓库GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新包索引并安装containerd
sudo apt-get update
sudo apt-get install -y containerd.io
- 配置containerd使用systemd cgroup驱动
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置使用systemd cgroup驱动
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
三、主节点迁移步骤
- 标记主节点不可调度
kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data
- 停止kubelet服务
sudo systemctl stop kubelet
- 卸载Docker相关组件
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
- 配置kubelet使用containerd
# 创建或修改kubelet配置文件
cat <<EOF | sudo tee /etc/default/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
- 重启kubelet服务
sudo systemctl restart kubelet
- 验证主节点状态
kubectl get nodes
四、工作节点迁移步骤
- 标记工作节点不可调度并驱逐Pods
kubectl drain <worker-node-name> --ignore-daemonsets --delete-emptydir-data
- 停止kubelet服务
sudo systemctl stop kubelet
- 卸载Docker相关组件
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
- 配置kubelet使用containerd
# 创建或修改kubelet配置文件
cat <<EOF | sudo tee /etc/default/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
- 重启kubelet服务
sudo systemctl restart kubelet
- 标记节点可调度
kubectl uncordon <worker-node-name>
五、验证迁移结果
- 检查节点状态
kubectl get nodes
- 检查Pod状态
kubectl get pods --all-namespaces
- 验证容器运行时
kubectl describe node <node-name> | grep -i runtime
- 运行测试Pod验证功能
kubectl run nginx --image=nginx
kubectl get pods
六、常见问题及解决方法
- 容器无法启动
- 检查containerd服务状态:
sudo systemctl status containerd
- 确认配置文件中cgroup驱动设置正确
- 镜像拉取失败
- 检查镜像仓库访问权限
- 配置containerd使用国内镜像源:
sudo nano /etc/containerd/config.toml
# 在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]部分添加:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.docker-cn.com"]
- 节点NotReady状态
- 检查kubelet日志:
journalctl -u kubelet -f
- 确认kubelet配置文件路径正确
七、后续优化建议
- 配置containerd高级参数
sudo nano /etc/containerd/config.toml
# 调整以下参数:
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.8"
stats_collect_period = 10
enable_selinux = false
disable_tcp_service = true
max_container_log_line_size = 16384
- 配置containerd垃圾回收
# 添加定期清理任务
echo "0 0 * * * root crictl rmi --prune" | sudo tee -a /etc/crontab
- 监控containerd性能
# 安装crictl工具
VERSION="v1.26.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
# 查看容器运行时状态
crictl ps
crictl stats
通过以上步骤,你可以成功将Ubuntu环境下的Kubernetes集群从Docker迁移至containerd。迁移完成后,建议对集群进行全面测试,确保所有应用正常运行。