从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南

一、背景

Kubernetes 自 v1.24 起移除了 dockershim,不再原生支持 Docker Engine,用户需迁移至受支持的 CRI 兼容运行时,如:

  • Containerd(推荐,高性能、轻量级)

  • CRI-O(专为 Kubernetes 设计)

  • Docker Engine + cri-dockerd(兼容方案,但需额外维护)

二、迁移步骤

1.前置准备

当前是3个node节点,都是docker运行时,现在驱逐node-3节点

bash 复制代码
#移除节点
[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

2.部署containerd服务

Containerd部署指南

3.修改kubelet参数

加上containerd运行时参数--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock

bash 复制代码
[root@node-3 ~]# cat /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/local/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/cfg/kubelet-bootstrap.kubeconfig --cert-dir=/etc/kubernetes/ssl --kubeconfig=/etc/kubernetes/cfg/kubelet.config --config=/etc/kubernetes/cfg/kubelet.json --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2   --alsologtostderr=true --logtostderr=false --log-dir=/var/log/kubernetes --container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --v=2 
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

4.启动各个服务

bash 复制代码
#启动服务
[root@node-3 ~]# systemctl daemon-reload
[root@node-3 ~]# systemctl restart kubelet
[root@node-3 ~]# systemctl start kube-proxy

[root@node-3 ~]# systemctl status kubelet
[root@node-3 ~]# systemctl status kube-proxy

5.查看node-3节点状态

bash 复制代码
#目前节点3已经准备好啦,处于不可调度状态
[root@master-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-1   Ready <none> 71d v1.23.1
node-2   Ready <none> 71d v1.23.1
node-3   Ready,SchedulingDisabled <none> 24h v1.23.1

6.将node节点恢复为可调度

bash 复制代码
#恢复可调度状态
[root@master-1 ~]# kubectl uncordon node-3
node/node-3 uncordoned

7.查看节点运行时

bash 复制代码
#发现运行时已经切换成功啦
[root@master-1 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node-3   Ready <none> 24h v1.23.1   192.168.91.23   <none> CentOS Linux 7 (Core) 3.10.0-862.el7.x86_64 containerd://1.6.4

8.测试业务

部署一个nginx业务

bash 复制代码
[root@master-1 ~]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: nginx-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent


[root@master-1 ~]# kubectl apply -f nginx.yaml
[root@master-1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo-68984b745f-5k5ts 1/1     Running 0          7m14s 10.244.1.2     node-2   <none> <none>
nginx-demo-68984b745f-9pmwk 1/1     Running 0          29m   10.244.2.56    node-3   <none> <none>
nginx-demo-68984b745f-bp8x2 1/1     Running 0          7m14s 10.244.0.2     node-1   <none> <none>

以上效果说明我们集群已从 Docker 全面切换至 Containerd,运行状态正常。

相关推荐
IT利刃出鞘5 小时前
Docker Compose--安装WordPress--方法/示例
运维·docker·容器
自律最差的编程狗14 小时前
Ubuntu下Docker部署Ollama 轻量模型
linux·ubuntu·docker
wdfk_prog15 小时前
大型 Docker 镜像导出导入工程化:可靠性、磁盘与压缩
运维·docker·容器
郝开15 小时前
Docker Compose 模块化多环境配置规范指南:示例搭建Alf Tengine MD2DOC 1.1.1
运维·docker·容器
Albart57516 小时前
Docker Desktop 增量更新失败终极排查:Failed to apply delta update 反复回滚怎么办?
windows·docker·容器·docker部署大模型
sibylyue17 小时前
【云原生系列3】Docker Compose单机多容器编排工具
运维·docker·容器
java_logo18 小时前
Docker 部署 ArchivesSpace:轻松搭建档案信息管理平台
运维·docker·容器·档案管理·轩辕镜像·archivesspace·特藏
kuroomi1 天前
Docker 与容器基础
linux·运维·docker
梦梦代码精1 天前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
_itgo1 天前
意图识别落地方案
运维·docker·容器