【编者按】Kubernetes计划在即将发布的1.24版本中弃用并移除dockershim。Kubernetes计划在即将发布的1.24版本中弃用和删除dockershim。使用DockerEngine作为其Kubernetes集群的容器运行时的工作流或系统将需要在升级到1.24版之前进行迁移。1.23版本将保留dockershim,对该版本的支持将再延长一年。Docker是Kubernetes使用的第一个容器运行时。最初对Docker的部分支持被硬编码到Kubernetes代码中,但随着项目的发展,Kubernetes开始添加更多的运行时支持。Kubernetes社区没有直接将第三方解决方案集成到核心代码中,而是决定转向更加结构化和标准化的接口。这导致了标准的容器运行时接口(CRI)、容器网络接口(CNI)和容器存储接口(CSI)。正如Mirantis的CTOAdamParco所说:对于大多数人来说,弃用dockershim不是问题,因为他们甚至可能感觉不到他们实际上不是在使用Docker本身,他们是在使用CRI标准containerd。对于那些人来说,和以前一样。由于Docker不符合CRI,dockershim更像是kubelet和Docker之间的转换层。然后Docker通过接口调用containerd来执行容器。containerd之前作为独立的容器运行时从Docker项目中提取出来,随后成为第一个符合CRI的运行时。可以看出,在dockershim被弃用后,kubelet可以直接与containerd等容器运行时通信。分别使用containerd和dockershim的Kubernetes工作流对比(来源:Kubernetes)正如最近在Kubernetes博客上的一篇文章中提到的,从dockershim迁移是为了让Kubernetes代码库更好地与新的接口模型保持一致。一些新开发的功能,例如cgroupsv2和用户命名空间,在很大程度上与dockershim不兼容。正如最近这篇博文的作者所说:“对Docker和dockershim的依赖已经渗透到CNCF生态系统中的各种工具和项目中,这使得我们的代码更加脆弱。”如果你当前正在使用Docker来构建应用程序容器,那么这些容器仍然可以在其他容器运行时上运行。但是,一旦使用替代容器运行时,某些Docker命令可能无法运行或产生不同的结果。比如dockerps或者dockerinspect已经无法获取容器信息,dockerexec也不起作用。在整理对dockershim的依赖时还有一些额外的考虑,包括需要保证特权Pod不被用来执行一些Docker命令,比如dockerps,重启Docker服务,或者修改Docker的一些特定文件。我们还需要注意Docker配置文件中是否有私有镜像仓库或者镜像同步源的设置。其他运行时也需要重新配置这些设置(如果有的话)。我们还应该检查一些在Kubernetes基础设施之外运行的脚本,并确定使用Docker命令的位置。这可能包括通过SSH连接到机器以进行故障排除、节点的启动脚本或直接安装在节点上的一些监控和安全客户端。Mirantis和Docker已经达成协议,他们将共同维护dockershim代码,该代码随后将作为一个比Kubernetes更独立、开源和符合CRI的项目存在。这意味着MirantisContainerRuntime(MCR)将是一个CRI兼容的运行时。如果dockershim停机时间不受欢迎或不可接受,他们的cri-dockerd将作为dockershim的外部替代品提供。Kubernetes1.24发布团队和CNCF已承诺及时提供发布文档,目前计划于4月发布。这包括博客文章、更新的代码示例、教程和迁移指南。该团队认为,进行迁移没有重大障碍。他们确实注意到了11月11日SIGNode兴趣小组和12月6日Kubernetes指导委员会会议关于延迟弃用dockershim的最新讨论。然而,此时他们已经同意在即将发布的1.24版本中移除dockershim。
