将Kubernetes集群的CRI实现从cri-docker更改为containerd
1. 系统配置
虚拟机版本:VMware Workstation Pro 17
虚拟机镜像版本:CentOS Linux release 7.9.2009 (Core)
Docker版本:ce-20.10.11
Kubernetes版本:1.24.16
2. 更改容器进行时的背景
containerd是Kubernetes官方推荐使用的容器运行时(Container Running),同时,阿里云的Kubernetes1.24版本以上集群只支持containerd,所以将之前的cri-docker更改为containerd。
3. 更改过程
对于正在工作的节点,可以使用腾空命令禁止调度该节点:
# 在主节点使用
# 主节点一般不运行pod,所以主要用来腾空工作节点
kubectl cordon <nodeName>
kubectl drain <nodeName> --ignore-daemonsets
# 升级完成后,解除腾空
kubectl uncordon <nodeName>
卸载Docker相关组件以及配置:
systemctl stop docker
# 避免旧配置影响新的CR,所以这里将containerd也进行删除
yum remove -y docker-ce docker-ce-cli containerd.io
删除cri-docker相关组件以及配置:
systemctl stop cri-docker
rm -rf /usr/bin/cri-dockerd
rm -rf /usr/lib/systemd/system/cri-docker.socket
rm -rf /usr/lib/systemd/system/cri-docker.service
rm -rf /run/cri-dockerd.sock
rm -rf /run/docker.sock
# 刷新
systemctl daemon-reload
安装containerd.io并初始化配置:
# 直接yum安装
yum install -y containerd.io
# 创建默认配置文件
containerd config default > /etc/containerd/config.toml
# 使用阿里云镜像地址
sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 设置启动为systemd
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# docker地址使用阿里云的地址,<code>需要填入自己的阿里云镜像加速地址
sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/a\ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://<code>.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]' /etc/containerd/config.toml
# 刷新重启,并设置为开机自启动
systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd
安装cri-tools工具并配置:
yum install -y cri-tools
# 生成配置文件
crictl config runtime-endpoint
# 编辑配置文件
cat << EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
EOF
配置k8s使用containerd作为容器进行时:
# 添加或修改成下面的配置
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd.sock"
在主节点编辑此节点:
# 修改使用的cri-socker
kubectl edit node <node>
...
kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/containerd.sock
在修改的节点上进行刷新重启:
systemctl daemon-reload
systemctl restart kubelet
此时可以查看该节点的容器运行时修改结果:
kubectl describe <node>
...
Container Runtime Version: containerd://1.6.22
...
# 至此,该节点的容器进行时已修改完成
其他节点只需要模仿该节点的做法即可。