说明

本文K8S基于1.29, 自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除。

K8S(Kubernetes)放弃使用Dockershim并改用容器运行时,主要出于以下考虑:

首先,K8S引入容器运行时接口(Container Runtime Interface,CRI)是为了隔离不同容器运行时的实现机制。容器编排系统不应该依赖于某个具体的运行时,而Docker没有支持也不打算支持K8S中的CRI接口。这使得K8S社区需要在仓库中维护Dockershim,这增加了额外的维护负担。

其次,从可扩展性的角度看,K8S通过引入新的容器运行时接口将容器管理与具体的运行时解耦,不再依赖某个具体的运行时实现。这使得K8S能够更灵活地支持各种容器运行时,提高了系统的可扩展性。

此外,随着容器技术的不断发展,出现了许多新的容器运行时解决方案,如containerd和CRI-O等。这些解决方案在性能、安全性、可维护性等方面可能具有更好的表现,能够更好地满足K8S的需求。

综上所述,K8S放弃使用Dockershim并改用容器运行时,是为了提高系统的可扩展性、灵活性和性能,更好地支持各种容器运行时解决方案,从而为用户提供更优质的服务。

目前实现了CRI spec的Runtime有DockerEngine、containerd、CRI-O、Mirantis Container Runtime(Docker 企业版)等。


系统配置

开启ipv4转发,关闭swap,关闭selinux,重启docker

# 02_sys_conf.sh
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

# 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 重启docker
service docker restart

推送并执行

ansible -m script k8s -a '02_sys_conf.sh'

cri-dockerd

获取,推送,创建软链

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd-0.3.12.amd64.tgz -O /opt/cri-dockerd-0.3.12.amd64.tgz
cd /opt
tar xf cri-dockerd-0.3.12.amd64.tgz
ansible -m copy k8s -a 'src=cri-dockerd dest=/opt/'
ansible k8s -a 'chmod +x /opt/cri-dockerd/cri-dockerd'
ansible k8s -a 'ln -s /opt/cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd'

创建系统服务

cat cri-dockerd.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
 
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
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
cat cri-dockerd.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target

推送到所有节点

ansible -m copy k8s -a 'src=cri-dockerd.service  dest=/etc/systemd/system/cri-dockerd.service'
ansible -m copy k8s -a 'src=cri-dockerd.socket  dest=/etc/systemd/system/cri-dockerd.socket'

重载systemctl,并启动cri-dockerd,开机自启cri-dockerd

ansible -m shell k8s -a 'systemctl daemon-reload'
ansible -m shell k8s -a 'systemctl enable cri-dockerd'
ansible -m shell k8s -a 'systemctl start cri-dockerd'