vlambda博客
学习文章列表

k8s 离 Docker 渐行渐远:1.24 版本将删除 dockershim

流行的容器编排系统Kubernetes即将迎来最新版,最新版删除了内置支持Docker Engine(Docker引擎)容器运行时环境的功能,这就要求广大用户转向替代的运行时环境,以支持未来发布的Kubernetes 版本。


作为许多现代云部署环境核心的开源项目,Kubernetes将发生重大变化: 它与原有的 Docker容器运行时环境分道扬镳。

内置支持Docker引擎运行时环境的功能将从即将发布的新版本Kubernetes:版本1.24中删除。

新版本本该这周发布,但现在将发布日期定于5月3日。如果用户想要运行这种容器编排系统的最新版,这番变化要求他们转而采用与Kubernetes的容器运行时接口(CRI) 兼容的另一种运行时环境(如果还没有采用的话),或者使用dockershim的外部替代品:cri-dockerd。

如果开发人员和管理员没有做必要的变化,可能面临集群和相应应用程序无法正常运行的风险。

不过据领导Kubernetes 1.24发布团队的James Laverack声称,对于大多数用户来说,删除dockershim处理起来应该比较简单。

Jetstack的高级解决方案工程师Laverack说:“主要的变化将是,Kubernetes节点(这是运行中的Kubernetes集群)本身默认情况下将再也无法使用Docker作为容器运行时环境。人们以前经常做这种变化。我们首次引入替代的容器运行时环境时,出于种种原因,许多操作人员和用户改而使用那些运行时环境,而不是使用Docker,这是我们引入这种变化的原因。”

开发人员使用容器来加快软件开发,因为容器隔离了构建和部署应用程序所需要的一切,无需操作系统方面的开销。Kubernetes的早期版本只与Docker Engine这种容器运行时环境兼容,这种软件可以执行构成Kubernetes pod的容器。

由云原生计算基金会(CNCF)托管的Kubernetes项目在2016年引入了CRI,这种插件接口可实现Kubernetes与各种容器运行时环境协同运行。Docker Engine本身与CRI不兼容;它是dockershim(一种容器运行时接口插件),让开发人员得以使用Docker Engine,好像它与CRI兼容一样。

与CRI兼容的替代运行时环境包括开源containerd(Docker的底层组件)和CRI-O,两者都由CNCF托管。

混合云Kubernetes应用平台Red Hat OpenShift的高级首席软件工程师Mrunal Patel说:“现在是翻篇的大好时机。这些替代的运行时环境已经在生产环境中得到了证明,因此用户应该不会怯于这种变化。我们有望迎来基于CRI的运行时环境这个新时代,将帮助我们更快速地采用更新颖的功能。”

Red Hat在生产环境中使用CRI-O已有近三年了。Patel表示,OpenShift的第一个版本和后续版本随带CRI-O,成千上万的客户一直在生产环境中使用它。

离Docker渐行渐远


Kubernetes项目于2020年12月在Kubernetes 1.20中弃用了dockershim,并通知用户随后会从Kubernetes中删除,需要时间进行必要的调整,以免破坏集群正常运行。 Docker生成的镜像符合开放容器倡议(OCI)标准,可继续在集群中与所有与CRI兼容的运行时环境协同运行。

Dockershim内置在Kubernetes的kubelet代码库中,一直被视为临时解决方案,维护工作被认为是一种负担。kubelet是在集群中每个节点上运行的代理,确保容器在pod中运行。CRI标准让容器运行时环境可以与kubelet代码库脱离开来(即解耦),从而简化维护。

Patel说:“[Docker]拥有运行容器和构建容器的功能。谈到生产环境中运行容器,开发人员不一定需要与在笔记本电脑上开发应用程序同样的权限。你需要它们更牢牢地锁定,需要更精简的运行时环境,更适合做 Kubernetes所需的那部分工作,仅此而已。”

正如容器安全软件供应商Sysdig的内容管理工程师Víctor Jiménez Cerrada所述,删除dockershim需要开发人员和集群管理员完成“不方便但又必要”的迁移。

Laverack说:“在过去这几年,社区一直格外注重围绕这个变化提供大量指导以及大量信息和背景。[CRI]是一种开放标准,许多公司和更广泛的社区提供了许多[运行时环境]实现系统。任何一个都可以正常运行,会得到当前版本和未来版本的Kubernetes的支持。”

Patel表示,在确定Kubernetes集群是否一直在使用Docker Engine之后,要做的例行手续就是改变kubelet配置,以便它们指向containerd或CRI-O的套接字,以便kubelet将来能与这些运行时环境进行对话,从而开始管理容器。

他说:“这是其中最简单的部分。好消息是,Kubernetes上游已经在拿这些运行时环境进行端到端测试。现在只要向Kubernetes添加新代码,都要针对这些运行时环境进行所有测试。”

集群操作人员应该确定他们“在Kubernetes之外有没有直接与Docker联系的现有代码”,Patel说。

他说:“Kubernetes本身需要与运行时环境进行联系,我们有CRI作为本该使用的这种接口,但是如果你有一些工作负载直接与Docker套接字进行联系以完成‘执行构建’之类的任务,将会怎么样?用户应审核和检查这些方面。”

开发人员仍然可以在本地使用Docker来开发或测试容器,无论他们为Kubernetes集群使用哪种容器运行时环境。

Patel说:“你可以将它们推送到任何与OCI兼容的注册库,Kubernetes将能够提取它们并运行这些应用程序。这种情况不会消失。借助OCI标准化,所有这些容器运行时环境以及存储和分发这些镜像的方式……都实现了标准化。”

未来云当道


云工程公司Pulumi的开发倡导者Kat Cosgrove表示,如果那些使用来自云提供商的托管Kubernetes服务的人还没有明确改变容器运行时环境,可能无异于坐以待毙。Cosgrove在最近的一篇Kubernetes博文中特别指出,Amazon Elastic Kubernetes Service、微软的Azure Kubernetes Service和Google Kubernetes Engine现在都默认使用containerd,“不过如果你对节点进行了任何定制,应确保它们不需要更新。”

据Cosgrove声称,如果集群操作人员想要升级到Kubernetes 1.24,又想与Docker这种运行时环境保持兼容性,倒是有一种风险不如运行旧版本Kubernetes那么大的选择。

她在博文中写道:“Mirantis和Docker已联合发布了dockershim的替代品,并正在维护。那个替代品叫做cri-dockerd。如果你确实需要与Docker这种运行时环境保持兼容性,只需按照项目文档中的操作说明来安装cri-dockerd。”

据Patel声称,那些坚持使用最新版Kubernetes以及dockershim的人最终可能在没有安全补丁的情况下运行,同时也无法从新功能中受益。

根据当前的Kubernetes项目政策,仅为最近的三个版本提供支持。最后一个支持dockershim的Kubernetes 1.23将获得补丁支持,直至Kubernetes 1.26发布,目前预计新版本在12月发布。

Patel说:“当你运行Kubernetes时,最应该考虑的一件事就是安全性。如果你不迁移到推荐的CRI运行时环境之一,你的处境就会很危险。”