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,如图:

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

标签