Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中,我们讨论了什么是 CRI 和 OCI,Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近,我们得知 Docker 即将从 kubernetes 中弃用!(查看 kubernetes 官方的这篇文章)那么让我们更深入地谈谈为什么会这样?

为什么从 K8s 1.24 开始 dokershim 被弃用了?

在 1.24 版中,Kubernetes 将不再支持 Docker 作为容器运行时。Docker 正在逐步淘汰,取而代之的是使用为 Kubernetes 构建的容器运行时接口 (CRI) 的运行时。如果您是 Kubernetes 最终用户,您不会注意到太大的差异。这并不意味着 Docker 已死,也不意味着您不能或不应该将其用作开发工具。Docker 仍然是创建容器的有用工具,并且由其生成的映像可docker build用于您的 Kubernetes 集群。如果您希望创建集群,则必须进行某些调整以避免集群故障。由于 Docker 将从 K8s 1.24 开始弃用,因此您必须过渡到其他兼容的容器运行时之一,例如 containerd 或 CRI-O。只需确保您选择的运行时支持 Docker 守护程序的当前设置(例如日志记录)。

人们听到这个消息时为什么会惊慌失措?

正在考虑两种环境,这会引起一些混乱。Kubernetes 集群中有一个称为容器运行时的组件,负责获取和运行容器映像。尽管 Docker 是该运行时的流行选择,但它并不打算集成到 Kubernetes 中,这会带来问题。

将来还会使用 Dockerfiles 吗?

此修改适用于在不同环境中使用 Docker 的开发人员。Kubernetes 集群内的 Docker 运行时独立于开发 Docker 安装。Docker 在修改之前的所有方面对开发人员仍然很有价值。Docker 生成 OCI(开放容器计划)镜像,它并不是真正特定于 Docker 的镜像。无论使用何种工具创建,Kubernetes 都会以相同的方式对待任何符合 OCI 标准的镜像。containerd 和 CRI-O 都能够提取和运行此类镜像。

如何从 Docker 切换到 containerd 和 CRI-O?

步骤 1:Cordon 和 Drain 节点

$ kubectl cordon <Node name>
$ kubectl drain <Node Name> --ignore-daemonsets

第 2 步:停止服务

$ systemctl stop kubelet
$ systemctl stop docker

步骤 3:删除 Docker(可选):

apt purge docker-ce docker-ce-cli

或者

yum remove docker-ce docker-ce-cli

一、从 Docker 迁移到 containerd

步骤 4:配置 containerd

禁用 /etc/containerd/config.toml 中的 disabled_plugins 行以启用 CRI 接口。

#disabled_plugins = ["cri"]

注意:如果还没有默认的 containerd 配置文件,您可以创建一个新的:

containerd config default > /etc/containerd/config.toml

然后重新启动containerd:

systemctl restart containerd

步骤 5:更改运行时 在 /var/lib/kubelet/kubeadm-flags.env 中添加这 2 个 containerd 运行时标志:

--container-runtime=remote 
--container-runtimeendpoint=unix:///run/containerd/containerd.sock"

步骤 6:现在可以启动 kubelet

systemctl start kubelet

步骤 7:测试您的 containerd 运行时

kubectl get nodes -o wide

现在你可以解除你的节点的封锁:

kubectl uncordon <Node>

您已经完成了!

二、从 Docker 迁移到 CRI-O

接着上面第三步开始

步骤 4:CRI-O 存储库和安装

$ add-apt-repository ppa:projectatomic/ppa
$ apt update
$ apt install -y cri-o-1.15

步骤 5:配置 CRI-O 和内核 创建文件99-kubernetes-crio.conf

vi /etc/sysctl.d/99-kubernetes-crio.conf

并添加以下几行:

net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1

将更改应用到内核:

sysctl -a

验证crio.conf并编辑cri-o以使用 Docker 注册表

打开文件crio.conf

vim /etc/crio/crio.conf

检查配置中 conmon 的路径是否准确;如果不准确,请运行以下命令:

which conmon

将输出添加到crio.conf文件

# Path to the conmon binary, used for monitoring the OCI runtime.
conmon = "/usr/bin/conmon"

还要确保"注册表"选项被注释掉

registries = [
        "quay.io",
        "docker.io",
]

步骤 6:现在您可以启动 CRI-O

$ systemctl enable crio
$ systemctl start crio

步骤 7:配置并启动 kubelet 编辑vi /etc/default/kubelet,它看起来应该像这样:

KUBELET_EXTRA_ARGS=--feature-gates="AllAlpha=false" --container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-request-timeout=5m

然后启动 kubelet:

systemctl start kubelet

步骤 8:现在您可以取消封锁您的节点:

kubectl uncordon <Node>

您已经完成了!

概括

最后,我想补充一点,Docker 从 Kubernetes 中被弃用并不意味着您不能使用 Docker。这只是意味着 Docker 将不再被用作 Kubernetes 中的默认引擎,这完全取决于您在选择特定容器运行时时的需求,因为它们每个都有自己的优点。