V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
macrokefeng
V2EX  ›  推广

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

  •  
  •   macrokefeng · 119 天前 · 1285 次点击
    这是一个创建于 119 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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

    4 条回复    2022-03-08 14:33:23 +08:00
    12101111
        1
    12101111  
       119 天前
    直接跑 containerd 就行了, 管理用 nerdctl
    Reficul
        2
    Reficul  
       119 天前
    前段时间试了一下,把 docker 的数据补全了写回到 containerd cri 里,其实是可以做热升级的。
    julyclyde
        3
    julyclyde  
       116 天前
    @Reficul 求介绍经验
    Reficul
        4
    Reficul  
       116 天前   ❤️ 1
    @julyclyde 看下 containerd 里 cri 的实现,dockershim 的实现区别你就知道了。

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

    结果是 Containerd 那边的容器可以和之前 Docker 那边创建的容器在一个 Pod 里共存,没有发现问题。目前自动化没做,没在生产落地。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2536 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:28 · PVG 15:28 · LAX 00:28 · JFK 03:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.