Docker Shim 被移除, K8s v1.24 升级该怎么办

2022-03-04 16:53:12 +08:00
 macrokefeng

Kubernetes v1.24 将于今年 4 月正式发布,Docker Shim 被移除了,CRI Dockerd 登场。


如果您现在的 Kubernetes 节点,还是用 Docker ,那您将无法升级到 1.24 版本,因为 Docker Shim 已经被移除了。有一个办法是,您可以选择从 Docker 切换到 Containerd ,再升级 1.24 版本,不过所有 Pod 都需要重建一次。

重建工作量大怎么办?这里给您提供另外的选择,从 Docker Shim 切换到 CRI-Dockerd ,让您无需重建直接升级。

01 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

02 Docker Shim 移除常见问题

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

2004 次点击
所在节点    推广
4 条回复
12101111
2022-03-04 17:10:33 +08:00
直接跑 containerd 就行了, 管理用 nerdctl
Reficul
2022-03-04 23:11:33 +08:00
前段时间试了一下,把 docker 的数据补全了写回到 containerd cri 里,其实是可以做热升级的。
julyclyde
2022-03-08 11:41:19 +08:00
@Reficul 求介绍经验
Reficul
2022-03-08 14:33:23 +08:00
@julyclyde 看下 containerd 里 cri 的实现,dockershim 的实现区别你就知道了。

把 dockerd 那边的信息转换到 containerd 里就行了。写 containerd 有两个办法,一个是 containerd cri 有一个重启后 recovery 逻辑,可以利用;或者是写 containerd 的 DB 。 我当时利用的是前面的办法通过的 POC 。

结果是 Containerd 那边的容器可以和之前 Docker 那边创建的容器在一个 Pod 里共存,没有发现问题。目前自动化没做,没在生产落地。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838001

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX