1

如何使用 cri-docker 解决 Kubernetes 1.24 不支持 dockershim 的问题

 2 years ago
source link: https://www.51cto.com/article/718584.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何使用 cri-docker 解决 Kubernetes 1.24 不支持 dockershim 的问题

作者:老段工作室 2022-09-13 12:03:39
虽然本文演示了 cri-docker 的使用,但是更推荐使用 Containerd 作为 Kubernetes 的容器运行时。
d46fc7e5770735f9ac9210988e888ad3b571bd.jpg

从 Kubernetes 1.24 开始,dockershim 已经从 kubelet 中移除,但因为历史问题 Docker 却不支持 Kubernetes 主推的 CRI(容器运行时接口)标准,所以 Docker 不能再作为 Kubernetes 的容器运行时了,即从Kubernetes v1.24 开始不再使用 Docker了。

但是如果想继续使用 Docker 的话,可以在 Kubelet 和 Docker 之间加上一个中间层 cri-docker。cri-docker 是一个支持 CRI 标准的 shim(垫片)。一头通过 CRI 跟 Kubelet 交互,另一头跟 Docker Api 交互,从而间接的实现了 Kubernetes 以 Docker 作为容器运行时。但是这种架构缺点也很明显,调用链更长,效率更低。

虽然本文演示了 cri-docker 的使用,但是更推荐使用 Containerd 作为 Kubernetes 的容器运行时。

  •  两台机器,vms41 和 vms42
  •  系统:centos7.4
  •  vms41 为 master,vms42 是worker

一. 所有节点的基本设置

1.1 所有节点设置好 /etc/hosts ,使它们之间能互相解析

[root@vms4X ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.26.41 vms41.rhce.cc vms41
192.168.26.42 vms42.rhce.cc vms42
[root@vms4X ~]#

1.2 在所有节点上关闭swap分区

[root@vms4X ~]# swapoff -a ; sed -i '/fstab/d' /etc/fstab  
[root@vms4X ~]#  

1.3.在所有节点上更新yum源

[root@vms4X ~]#  rm -rf /etc/yum.repos.d/*  ; wget ftp://ftp.rhce.cc/k8s/* -P /etc/yum.repos.d/
[root@vms4X ~]# yum clean all
[root@vms4X ~]#

1.4 在所有节点安装 Docker

  •    节点安装 docker-ce。
[root@vms4X ~]#  yum install docker-ce -y
  •  在所有节点启动 Docker 并设置开机自动启动
[root@vms4X ~]# systemctl enable docker --now
  •  所有节点设置 Docker加速器
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

所有节点重启 Docker

[root@vms4X ~]#  systemctl restart docker

1.5 在所有节点安装 cri-docker

到下面的链接下载最新版 cri-docker

  •  https://github.com/Mirantis/cri-dockerd/tags

先在 vms41 上解压出 cri-docker,然后拷贝到 vms42 上

[root@vms41 ~]# tar zxf cri-dockerd-0.2.1.amd64.tgz  
[root@vms41 ~]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@vms41 ~]# scp /usr/bin/cri-dockerd vms42:/usr/bin/
root@vms42's password:  
cri-dockerd         100%   50MB 117.2MB/s   00:00    
[root@vms41 ~]#

1.6 设置系统参数

在所有机器上执行下面的命令,目的是实现重启系统后,参数也能继续生效。

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

让上述参数立即生效。

[root@vms4X ~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@vms4X ~]#

1.7 创建 cri-docker 启动文件

  •  启动文件从下面链接找到:
  •  https://github.com/Mirantis/cri-dockerd/tree/master/packaging/systemd

创建 cri-docker 启动文件:

[root@vms41 ~]# cat /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
[root@vms41 ~]#

这里 /usr/bin/cri-dockerd 一定要加上参数 -–pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7,用来指定所用的 pause 镜像是哪个,否则默认拉取 k8s.gcr.io/pause:3.6,会导致安装失败。

  •  创建启动文件:
[root@vms41 ~]# cat /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
[root@vms41 ~]#

1.8 把启动脚本拷贝到 vms42 上:

[root@vms41 ~]# scp /usr/lib/systemd/system/cri-docker.socket /usr/lib/systemd/system/cri-docker.service vms42:/usr/lib/systemd/system/
root@vms42's password:  
cri-docker.socket          100%  204   103.1KB/s   00:00    
cri-docker.service         100%  605   822.7KB/s   00:00    
[root@vms41 ~]#

启动 cri-docker 并设置开机自动启动:

[root@vms41 ~]# systemctl daemon-reload ; systemctl enable cri-docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /usr/lib/systemd/system/cri-docker.service.
[root@vms41 ~]#
[root@vms4X ~]# systemctl is-active cri-docker
active
[root@vms4X ~]#

二. 安装 Kubernetes

2.1 查看当前源里有哪些版本

[root@vms41 ~]#yum list --showduplicates kubeadm --disableexcludes=kubernetes

在本试验时最新的版本是 v1.24.1,所以本次就安装 v1.24.1版本的。

2.2 所有节点上安装软件包:

[root@vms4X ~]#yum install -y kubelet-1.24.1-0 kubeadm-1.24.1-0 kubectl-1.24.1-0  --disableexcludes=kubernetes
[root@vms4X ~]#

2.3 所有节点上启动 Kubelet 并设置开机自动启动

[root@vms4X ~]# systemctl enable kubelet --now
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@vms4X ~]#

此时 Kubelet 状态是 activating 的,不是 active 的。

[root@vms41 ~]# systemctl is-active kubelet
activating
[root@vms41 ~]#

三.初始化 Kubernetes

3.1 在 master(vms41)上初始化集群

[root@vms41 ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.24.1 --pod-network-cidr=10.244.0.0/16 --cri-socket /var/run/cri-dockerd.sock
  •  注意,这里需要添加选项 -–cri-socket /var/run/cri-dockerd.sock
0242725987d4221717d135d333f7b1a34ab76a.jpg

按提示创建 kubeconfig 文件。

[root@vms41 ~]# mkdir -p $HOME/.kube
[root@vms41 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@vms41 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@vms41 ~]#

3.2 把 worker 加入集群:

[root@vms42 ~]# kubeadm join 192.168.26.41:6443 --token l05cgf.kj5dvy5heki3jixt --discovery-token-ca-cert-hash sha256:07c1765ff4ac6eb2e54ed69fa57ca1afc728e825a6d4a11a83c96ff60ea545cd  --cri-socket /var/run/cri-dockerd.sock
[root@vms42 ~]#

注意,这里也要加上选项 -–cri-socket /var/run/cri-dockerd.sock

切换到 master,查看节点:

[root@vms41 ~]# kubectl get nodes
NAME            STATUS     ROLES           AGE     VERSION
vms41.rhce.cc   NotReady   control-plane   4m12s   v1.24.1
vms42.rhce.cc   NotReady   <none>          13s     v1.24.1
[root@vms41 ~]#

四.安装 Calico

4.1 下载最新版的 Calico 部署文件

[root@vms71 ~]# wget https://docs.projectcalico.org/manifests/calico.yaml

4.2 修改相应配置

修改 calico.yaml 找到 CALICO_IPV4POOL_CIDR 按下面修改。

d65bb5b47771b86fc49949d004470d4b927576.jpg
529907e86fb4ac1e1f2693a1623005c1f7a0f5.jpg

4.3 安装 Calico

在 vms41(master)上安装 calico,不需要在 vms42 上做什么。

[root@vms41 ~]# kubectl apply -f calico.yaml
[root@vms41 ~]#

5.1 在 vms41 上再次查看节点状态:

[root@vms41 ~]# kubectl get nodes
NAME            STATUS   ROLES           AGE     VERSION
vms41.rhce.cc   Ready    control-plane   11m     v1.24.1
vms42.rhce.cc   Ready    <none>          7m20s   v1.24.1
[root@vms41 ~]#  
[root@vms41 ~]# kubectl get nodes -o wide
NAME            STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
vms41.rhce.cc   Ready    control-plane   11m     v1.24.1   192.168.26.41   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://20.10.17
vms42.rhce.cc   Ready    <none>          7m23s   v1.24.1   192.168.26.42   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://20.10.17
[root@vms41 ~]#
责任编辑:庞桂玉 来源: 奇妙的Linux世界

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK