目录

基于cri-dockerd部署Kubernetes集群

概述

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

参考资料

  1. cri-dockerd
注意
本文最后更新于 2024年3月16日,文中内容可能已过时,请谨慎参考。