概述
Kubernetes 在 v1.24.0 的版本中移除了 dockershim 的代码,详细可以查看 CHANGELOG-1.24,对于还没习惯将容器运行时整体切换成 Containerd 的用户来说,是比较麻烦的,尤其是公司内部已经大规模使用 v1.23.x 版本的 Kubernetes,需要考虑移除 Dockershim 后对升级的影响。
在 v1.24.0 以后的版本,cri-socket 是可以直接跟 Containerd 通过 unix domain socket 来通信,其中 cri-dockerd 作为 CRI 的标准实现,可以替换 Containerd 作为容器运行时,而 cri-dockerd 后面调用的就是 Docker Engine 的 API,这个方式跟之前版本内通过 dockershim 来和 Containerd 通信是类似的,因此有了 cri-dockerd,用户可以将以前一样,仍然可以通过 Docker 来管理容器,也可以用 Docker 的 CLI 命令来进行问题的排查。
部署过程
安装Docker
测试的环境是 openEuler 22.03,通过下面的方式安装 Docker。
1
2
3
4
5
6
|
# 安装docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's/\$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
yum install -y docker-ce-19.03.13-3.el8 containerd.io-1.4.10-3.1.el8
systemctl enable docker
systemctl start docker
|
安装cri-dockerd
参考 cri-dockerd 的官网项目文档,安装和配置 cri-dockerd 服务。
1
2
3
4
|
curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10-3.el8.x86_64.rpm
rpm -ivh cri-dockerd-0.3.10-3.el8.x86_64.rpm
systemctl enable cri-docker
systemctl start cri-docker
|
cri-dockerd 启动完成之后如下图。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# systemctl status cri-docker
● cri-docker.service - CRI Interface for Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/cri-docker.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-02-27 14:45:16 CST; 2 weeks 2 days ago
TriggeredBy: ● cri-docker.socket
Docs: https://docs.mirantis.com
Main PID: 1595902 (cri-dockerd)
Tasks: 12
Memory: 43.0M
CGroup: /system.slice/cri-docker.service
└─ 1595902 /usr/bin/cri-dockerd --container-runtime-endpoint fd://
Notice: journal has been rotated since unit was started, output may be incomplete.
|
配置初始化的 kubeadm 文件,注意 criSocket 需要配置成 cri-dockerd.sock 文件。
1
2
3
4
5
6
7
8
9
10
11
|
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
|
初始化集群
确定配置文件没问题之后,我们就可以通过 kubeadm 来创建控制节点了。
1
2
|
# 其中dok.yaml是kubeadm的集群定义文件
kubeadm init --upload-certs --config /root/dok-release/bin/k8s/dok.yaml --skip-phases=addon/kube-proxy
|
之后再在其他节点执行上述的操作,就可以创建成功一个以 cri-dockerd 连接的 Kubernetes v1.24 的版本集群了,在这个集群的节点上,docker 的 CLI 命令等依然是有效的,从下面可以看到,创建的 Kubernetes 集群中的节点使用的是 Docker 作为容器运行时,这与 1.24 之前的版本的显示是一致的。
1
2
3
4
5
|
[root@master ~]# k get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready control-plane 15d v1.24.8 192.168.1.200 <none> openEuler 22.03 LTS 5.10.0-60.18.0.50.oe2203.x86_64 docker://19.3.13
node1 Ready <none> 15d v1.24.8 192.168.1.201 <none> openEuler 22.03 LTS 5.10.0-60.125.0.152.oe2203.x86_64 docker://19.3.13
node2 Ready <none> 15d v1.24.8 192.168.1.202 <none> openEuler 22.03 LTS 5.10.0-60.125.0.152.oe2203.x86_64 docker://19.3.13
|
参考资料
- cri-dockerd
警告
本文最后更新于 2024年3月16日,文中内容可能已过时,请谨慎参考。