“
Kubernetes v1.24 将于今年 4 月正式发布,Docker Shim 被移除了,CRI Dockerd 登场。
如果您现在的 Kubernetes 节点,还是用 Docker ,那您将无法升级到 1.24 版本,因为 Docker Shim 已经被移除了。有一个办法是,您可以选择从 Docker 切换到 Containerd ,再升级 1.24 版本,不过所有 Pod 都需要重建一次。
重建工作量大怎么办?这里给您提供另外的选择,从 Docker Shim 切换到 CRI-Dockerd ,让您无需重建直接升级。
CRI-Dockerd 其实就是从被移除的 Docker Shim 中,独立出来的一个项目,用于解决历史遗留的节点升级 Kubernetes 的问题。
我们发布了一个 CRI Docker 的安装卸载脚本,方便您维护您的集群。
只要您的节点提前切换到 CRI Dockerd ,就可以直接把使用 Docker 的 Kubernetes 旧版本,升级到 1.24 版本。
从 Docker Shim 切换到 CRI Docker
wget -O install.sh https://raw.githubusercontent.com/klts-io/setup-cri-dockerd/main/install.sh
./install.sh
回退
wget -O uninstall.sh https://raw.githubusercontent.com/klts-io/setup-cri-dockerd/main/uninstall.sh
./uninstall.sh
CRI-Dockerd 项目地址:
https://github.com/Mirantis/cri-dockerd
安装脚本项目地址:
https://github.com/klts-io/setup-cri-dockerd
2.1 为什么要移除 Docker shim
Kubernetes 的早期版本仅适用于特定的容器运行时:Docker 引擎。后来,Kubernetes 增加了对使用其他容器运行时的支持。创建 CRI 标准是为了实现编排器 (如 Kubernetes) 和许多不同的容器运行时之间的互操作性。Docker Engine 没有实现该接口 (CRI),因此,Kubernetes 项目创建了兼容代码来帮助过渡,并使 dockershim 代码成为 Kubernetes 本身的一部分。
dockershim 代码一直是一个临时解决方案 (因此得名:shim)。您可以在 Dockershim Removal Kubernetes Enhancement Proposal 中阅读有关社区讨论和规划的更多信息。事实上,维护 dockershim 已经成为 Kubernetes 维护者的沉重负担,但是带来的作用却越来越少。
Dockershim Removal Kubernetes Enhancement Proposal:
https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2221-remove-dockershim
此外,在这些较新的 CRI 运行时中,实现了与 dockershim 基本不兼容的功能,例如 cgroups v2 和用户命名空间。取消对 dockershim 的支持,将促进这些领域的进一步发展。
2.2 我还能在 Kubernetes 1.23 中使用 Docker Engine 吗?
可以,如果使用 Docker Engine 作为运行时,1.20 在 kubelet 启动时,会打印一个警告日志。您在 1.23 之前的所有版本中都会看到此警告。dockershim 将在 Kubernetes 1.24 移除。
2.3 我仍然可以使用 Docker Engine 作为我的容器运行时吗?
如果您在自己的 PC 上使用 Docker 来开发或测试容器:没有任何变化。无论您为 Kubernetes 集群使用什么容器运行时,您仍然可以在本地使用 Docker 。容器使这种操作性成为可能。
如果是 Kubernetes 中还是要继续使用 Docker 可以尝试该适配器 cri-dockerd 和我们为您提供的维护脚本 setup-cri-dockerd 。
cri-dockerd:
https://github.com/Mirantis/cri-dockerd
setup-cri-dockerd:
https://github.com/klts-io/setup-cri-dockerd
2.4 我现有的容器镜像是否仍然有效?
是的,从 docker build 生成的图像将适用于所有 CRI 实现。您现有的所有镜像,仍将完全相同不需要做任何改动。
2.5 私人镜像是否仍然有效?
是的。所有 CRI 运行时都支持在 Kubernetes 中使用的相同的 pull secrets 配置,无论是通过 PodSpec 还是 ServiceAccount 。
2.6 Docker 和容器是一回事吗?
Docker 普及了 Linux 容器模式,并在开发底层技术方面发挥了重要作用,但是 Linux 中的容器已经存在了很长时间,容器生态系统已经发展的比 Docker 广泛得多。OCI 和 CRI 等标准,帮助许多工具在容器的生态系统中发展壮大,其中一些替代了 Docker 的某些方面,而另一些则增强了现有功能。
2.7 今天有没有人在生产中使用其他运行时的例子?
在 Kubernetes 每个版本的测试中,都经过了其他运行时的验证。
此外,kind 使用 containerd 已经有一段时间了,并且已经看到其用例的稳定性有所提高。每天都会多次使用 Kind 和 containerd 来验证对 Kubernetes 代码库的任何更改。其他相关项目也遵循类似的模式,展示了其他容器运行时的稳定性和可用性。
本文作者
张世明
现任 「 DaoCloud 道客」云原生研发工程师
Kubernetes 社区 Reviewer
1
12101111 2022-03-04 17:10:33 +08:00
直接跑 containerd 就行了, 管理用 nerdctl
|
2
Reficul 2022-03-04 23:11:33 +08:00
前段时间试了一下,把 docker 的数据补全了写回到 containerd cri 里,其实是可以做热升级的。
|
4
Reficul 2022-03-08 14:33:23 +08:00 1
@julyclyde 看下 containerd 里 cri 的实现,dockershim 的实现区别你就知道了。
把 dockerd 那边的信息转换到 containerd 里就行了。写 containerd 有两个办法,一个是 containerd cri 有一个重启后 recovery 逻辑,可以利用;或者是写 containerd 的 DB 。 我当时利用的是前面的办法通过的 POC 。 结果是 Containerd 那边的容器可以和之前 Docker 那边创建的容器在一个 Pod 里共存,没有发现问题。目前自动化没做,没在生产落地。 |