Kubernetes-切换Dockerd为Containerd

发布于 2022-08-11  782 次阅读


概述

由于Kubernetes 在v1.24版本后就不再支持Dockerd,转为通过kubelet 直接调用容器引擎(Containerd、Podman),这里采用较为成熟的Containerd来作为升级的方式

如果是直接部署的话,可参考:博客内的v1.24版本的部署

架构

在v1.24之前的使用Docker作为容器引擎的架构

CRI 是 Kubernetes 在 v1.5 版本中引入的,充当 kubelet 和容器运行时之间的桥梁。简单概述:CRI 是以容器为中心的 API,设计的初衷是不希望向容器(比如 docker)暴露 pod 信息或 pod 的 api 接口,通过这种接口模式,Kubernetes 无须重新编译就可以使用更多的容器运行时。但是呢,Docker 与 CRI 不兼容,为了适配 Docker ,Kubernetes 就搞出来了 dockershim 这么个东东,将 CRI 转换成 Docker API,kubelet 使用 dockershim 和 docker 进行通信,docker 再和下面的 containerd 进行通信。这样就可以愉快地工作了。

替代方案:containerd

ri plugin 是 containerd 的原生插件,从 containerd v1.1 开始, CRI 插件内置在发布的 containerd 二进制文件中。

前期准备

依旧可以参考, 博客内的v1.24版本的部署 的前期准备的内容 到安装containerd部分

安装完成,完成配置后,再进行下一步配置

配置部分

配置kubelet使用containerd

Centos:
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
systemctl restart kubelet

Ubuntu:
vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7"

验证

kubectl get node -o wide
NAME         STATUS   ROLES                AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
vm-test-01   Ready    control-plane,edge   42h   v1.24.3   172.16.22.83   <none>        Ubuntu 18.04.6 LTS   4.15.0-189-generic   containerd://1.6.4
vm-test-02   Ready    <none>               25h   v1.24.3   172.16.22.82   <none>        Ubuntu 18.04.6 LTS   4.15.0-189-generic   containerd://1.6.4

设置crictl连接containerd:

vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false