Ubuntu 环境下 Kubernetes 集群从 Docker 迁移至 containerd 的完整指南

阅读 13

06-14 09:00

一、迁移前准备

在开始迁移前,需要确保以下几点:

  1. 所有节点(master和worker)运行Ubuntu 18.04/20.04/22.04
  2. 备份所有重要数据,尤其是etcd集群
  3. 确认Kubernetes版本≥1.24(Docker shim已移除)
  4. 准备好维护窗口,迁移期间集群可能不可用
二、安装containerd

在所有节点上执行以下操作:

  1. 配置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

  1. 配置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

三、主节点迁移步骤
  1. 标记主节点不可调度

kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data

  1. 停止kubelet服务

sudo systemctl stop kubelet

  1. 卸载Docker相关组件

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

  1. 配置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

  1. 重启kubelet服务

sudo systemctl restart kubelet

  1. 验证主节点状态

kubectl get nodes

四、工作节点迁移步骤
  1. 标记工作节点不可调度并驱逐Pods

kubectl drain <worker-node-name> --ignore-daemonsets --delete-emptydir-data

  1. 停止kubelet服务

sudo systemctl stop kubelet

  1. 卸载Docker相关组件

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

  1. 配置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

  1. 重启kubelet服务

sudo systemctl restart kubelet

  1. 标记节点可调度

kubectl uncordon <worker-node-name>

五、验证迁移结果
  1. 检查节点状态

kubectl get nodes

  1. 检查Pod状态

kubectl get pods --all-namespaces

  1. 验证容器运行时

kubectl describe node <node-name> | grep -i runtime

  1. 运行测试Pod验证功能

kubectl run nginx --image=nginx
kubectl get pods

六、常见问题及解决方法
  1. 容器无法启动
  • 检查containerd服务状态:sudo systemctl status containerd
  • 确认配置文件中cgroup驱动设置正确
  1. 镜像拉取失败
  • 检查镜像仓库访问权限
  • 配置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"]

  1. 节点NotReady状态
  • 检查kubelet日志:journalctl -u kubelet -f
  • 确认kubelet配置文件路径正确
七、后续优化建议
  1. 配置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

  1. 配置containerd垃圾回收

# 添加定期清理任务
echo "0 0 * * * root crictl rmi --prune" | sudo tee -a /etc/crontab

  1. 监控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。迁移完成后,建议对集群进行全面测试,确保所有应用正常运行。

精彩评论(0)

0 0 举报