dockershim切换到cri-dockerd
k8s集群如果使用docker作为容器运行时,那么在集群在调用docker api的时候一定需要一个组件叫做dockershim,从k8s 1.24之后,默认已经移除了dockershim,那么就无法继续使用dockershim了,但是如果还想继续使用docker作为容器运行时,此时就可以使用一个新的组件cri-dockerd,此组件可以代替dockershim完成对docker api的调用
将dockershim迁移到cri-dockerd,主要经历一下几个步骤:
- 安装
cri-dockerd - 隔离(Cordon)并腾空(Drain)该节点
- 配置 kubelet 使用
cri-dockerd - 重新启动 kubelet
- 验证节点处于健康状态
本例子中演示的是已经部署完了k8s集群,并且使用的是dockershim组件,现在要将dockershim切换到cri-dockerd,从而可以继续使用docker作为容器运行时
环境:
- k8s:1.23.5
- docker:20.10.8
- containerd:0.3.4
cri-dockerd下载地址如下:
https://github.com/Mirantis/cri-dockerd/releases/tag/v0.3.4
首先查看下当前k8s是不是在使用dockershim,很直观的方式就是重启kubelet后查看系统日志/var/log/message,如图:

上图中的意思是dockershim是不被推荐使用的,请使用完整版的CRI,因此可断定当前使用dockershim
安装cri-dockerd
1、将二进制包上传并解压,如下:
tar xf cri-dockerd-0.3.4.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/bin
2、编写服务托管文件, 并配置加载CNI插件,内容如下:
[Unit]
Description=cri-dockerd
Documentation=https://github.com/Mirantis/cri-dockerd
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --docker-endpoint=unix:///var/run/docker.sock --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --cri-dockerd-root-directory=/data/cri-dockerd
ExecReload=/bin/kill -s HUP
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
--cni-bin-dir默认路径是/opt/cni/bin,可根据需要更改,一般是网络插件的位置,比如calico--container-runtime-endpoint默认的路径是unix:///var/run/cri-dockerd.sock--pod-infra-container-image默认镜像是registry.k8s.io/pause:3.6,要改成阿里的镜像,如果没有国外服务器,拉取 k8s 的镜像会失败- –docker-endpoint:指定docker.sock,必须指定,否则会提示找不到runtime
- –cri-dockerd-root-directory:指定cri-dockerd根目录,存放数据和配置文件
启动并查看状态,如图:
systemctl enable cri-dockerd --now

使用cri-dockerd -h 即可查看相关参数说明
修改master节点
1、首先将master设置为不可调度并腾空该节点,如下:
kubectl cordon k8s-master01
kubectl drain k8s-master01 --ignore-daemonsets

2、配置kubelet使用cri-dockerd,如下:
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"
#注意:pause版本最好与cri-dockerd.service中版本一样
- –container-runtime=remote:默认就是docker,因此这个参数加不加都不影响
修改节点信息,配置参数为cri-dockerd,如下:
kubectl edit node k8s-master01
将 kubeadm.alpha.kubernetes.io/cri-socket 标志从 /var/run/dockershim.sock 更改为 unix:///var/run/cri-dockerd.sock
3、重启kubelet即可
systemctl daemon-reload
systemctl restart kubelet
重启后,再次查看/var/log/message,已经看不到dockershim的踪迹了,此时已经成功切换到cri-dockerd,如图:

注意:其余节点直接按照上述方法来切换即可


