安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd
1、背景
从Kuberetes 1.20
版本开始,Kuberetes官方
因此,从Kubernetes 1.20
开始,Kuberetes官方将支持使用Docker和Containerd
作为容器运时,也意味着Kubemetes从Docker的依赖中解耦了出来。
在Kubernetes1.24
及之后的版本中作为容器运行时已经被官方弃用,Containerd
成为唯一推荐的容器运行时。
2、容器运行时从 Docker 改为 Containerd
装 Kubernetes 集群 时,默认容器运行时从 Docker 改为 Containerd 的流程如下:
2.1、安装 Containerd:
yum install -y containerd
2.2、生成 Containerd 的配置文件
1、创建一个目录用于存放 Containerd 的配置文件。
sudo mkdir -p /etc/containerd
2、将 Containerd 的默认配置写入到一个名为 config.toml 的文件中。你可以根据需要编辑这个文件,然后将其用作自定义的 Containerd 配置文件。
containerd config default > /etc/containerd/config.toml
3、修改 /etc/containerd/config.toml 文件
需要将 SystemdCgroup=false 修改为 SystemdCgroup=true,以表示 Containerd 驱动程序将使用 Systemd 进行 Cgroup 管理。
在 Kubernetes 中,容器运行时需要与宿主机的 Cgroup 和 Namespace 进行交互,以管理容器的资源。对于 Cgroup 的驱动程序,Docker 和 Containerd 默认使用的都是 Cgroupfs,而 systemd-cgroup 则是 Systemd 对 Cgroup 的一个实现。
相比于 Cgroupfs,systemd-cgroup 在资源隔离方面提供了更好的性能和更多的特性。例如,systemd-cgroup 可以使用更多的内存压缩算法,以便更有效地使用内存。
此外,systemd-cgroup 还提供了更好的 Cgroup 监控和控制机制,可以更精确地调整容器的资源使用量。使用 systemd-cgroup 作为容器运行时的 Cgroup 驱动程序可以提高 Kubernetes 集群中容器的资源管理效率,从而提升整个集群的性能。
vi /etc/containerd/config.toml
将 SystemdCgroup=false 修改为 SystemdCgroup=true
另外,将 sandbox_image 设置为阿里云镜像仓库中的 pause:3.7,是因为国内的网络可以访问阿里云镜像仓库。
在 Kubernetes 中,每个 Pod 中都有一个 pause 容器,这个容器不会运行任何应用,只是简单地休眠。它的作用是保证 Pod 中所有的容器共享同一个网络命名空间和 IPC 命名空间。
pause 容器会在 Pod 的初始化过程中首先启动,然后为 Pod 中的其他容器创建对应的网络和 IPC 命名空间,并且在其他容器启动之前保持运行状态,以保证其他容器可以加入共享的命名空间中。
简单来说,pause 容器就是一个占位符,它为 Pod 中的其他容器提供了一个共享的环境,使它们可以共享同一个网络和 IPC 命名空间。这也是 Kubernetes 实现容器间通信和网络隔离的重要机制之一。
vi /etc/containerd/config.toml
将 sandbox_image="k8s.gcr.io/pause:3.6" 修改为 sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"。
2.3 、创建 /etc/crictl.yaml 文件
cat >/etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
EOF
/etc/crictl.yaml
文件是 crictl 工具的配置文件,
Containerd 提供了一个 Socket 文件 /run/containerd/containerd.sock,
crictl 可以通过连接这个 Socket 文件与 Containerd 进行通信,从而实现对容器和镜像等操作的管理。
通过这种方式,crictl 可以方便地与 Containerd 进行交互,并执行各种容器操作,如创建、删除、查询容器等。
2.4 、配置 Containerd 服务开机自启
1、检查 Containerd 服务是否已启用自启动。
systemctl is-enabled containerd
2、启用 Containerd 服务的自启动
systemctl enable containerd
3、手动启动 Containerd 服务
systemctl start containerd
4、查看 Containerd 服务的当前状态
systemctl status containerd