作者:Bach(才云)、bot(才云)
技术校对:星空下的文仔(才云)
弃用 Docker
Kubernetes 最新版本 Kubernetes v1.20.0-rc.0 现已正式公布。Kubernetes 打算弃用 kubelet 中 Docker Engine 反对,对于 dockershim 的反对也将在下个版本中放弃。[1]
不过不用放心,在目前 Kubernetes v1.20 中,Kubernetes 管理员能够持续应用 Docker 命令与 kubectl 命令治理 Kubernetes 集群,而且镜像应用不会受到任何影响。在将来公布的 Kubernetes 版本中,包含接下来陆续推出的主要版本,对于 dockershim 的反对将最终被移除(最早会在 v1.23 把 Dockershim 从 Kubelet 中移除),届时将无奈应用 Docker 命令查看集群。
Kubernetes 本次弃用的是 dockershim[2],即 Kubernetes kubelet 实现中的组件之一,它可能与 Docker Engine 进行通信。
其实 Docker 中曾经蕴含 containerd,Kubernetes 为什么还须要 Dockershim?这是因为 Docker 与 CRI(即容器运行时接口)并不相容。简而言之,Docker 并不反对 CRI(容器运行时接口)这一 Kubernetes 运行时 API,而 Kubernetes 用户始终以来所应用的其实是名为“dockershim”的桥接服务。Dockershim 可能转换 Docker API 与 CRI,但当前,Kubernetes 将不再提供这项桥接服务。
为什么弃用
Kubernetes 是一款基础设施工具,可对多种不同计算资源(例如虚构、物理机)进行分组,使其出现为对立的巨量计算资源,从而供应用程序应用或与其他人共享。在这样的架构中,Docker(或者容器运行时)仅用于通过 Kubernetes 管制立体进行调度,从而在理论主机内运行应用程序。
通过以上架构图,能够看到每个 Kubernetes 节点都与管制立体彼此通信。各个节点上的 kubelet 获取元数据,并执行 CRI 在该节点上进行容器的创立、删除。Kubernetes 只能与 CRI 通信,因而要与 Docker 通信,就必须应用桥接服务“dockershim”,这就是第一点起因。
这里再看一下 Docker 架构示意图:
Kubernetes 实际上只须要红框内的内容,Docker 网络与存储卷都在内部,而这些用不到的性能可能会带来安全隐患。 家喻户晓,领有的性能越少,攻击面也就越小,这是第二点起因。
因而,咱们须要思考应用代替计划,即 CRI 运行时,例如 containerd 与 CRI-O,以下是选用二者的区别:
- containerd 与 Docker 相兼容,二者共享雷同的外围组件。
- 如果次要应用 Kubernetes 的最小性能选项,CRI- O 可能更为适宜。[4]
如何应答
对于 Kubernetes 最终用户 ,此次调整不会有太大影响。Docker 不会就此沦亡,依然能够持续将 Docker 作为开发工具应用。Docker 能够持续构建容器,运行 docker build 命令所生成的镜像也能在 Kubernetes 集群内失常运行。
如果应用的是 Kubernetes 托管服务 ,须要确保在将来的 Kubernetes 版本彻底放弃 Docker 反对之前,为工作节点引入受反对的容器运行时。如果节点中蕴含自定义项,那可能须要依据以后环境及运行时要求做出更新,确保正确实现降级测试及布局。
如果集群始终在滚动扩大 ,则是须要配合变量以防止服务中断。在 v1.20 中,咱们会收到 Docker 弃用正告,在将来的 Kubernets 版本(打算在 2021 年下半年公布的 v1.23)中,Docker 运行时将被彻底移除,并不再受到反对,届时必须切换至其余兼容的容器运行时,例如 containerd 或者 CRI-O。只须要保障咱们所应用的运行时,可能反对以后正在应用的 Docker 守护程序配置即可(例如日志记录)。[3]
弃用常见问题
为什么不赞成应用 dockershim?
保护 dockershim 已成为 Kubernetes 保护人员的沉重负担。创立 CRI 规范是为了加重这种累赘,并容许不同容器运行时的晦涩互用性。Docker 自身目前尚未实现 CRI,因而呈现了问题。此外,这些较新的 CRI 运行时中正在实现与 dockershim 基本上不兼容的性能,例如 cgroups v2 和用户命名空间。放弃对 dockershim 的反对能有更多精力在这些畛域中进行进一步的开发。
能够在 Kubernetes v1.20 应用 Docker 吗?
能够,在 v1.20 中惟一扭转的是,如果应用 Docker 作为运行时,在 kubelet 启动时会打印一个正告日志。
dockershim 什么时候会被移除?
不会在 Kubernetes v1.22 之前被移除,这意味着最早不应用 dockershim 的版本会是 2021 年底的 v1.23。
现有的 Docker 镜像还能工作吗?
能够,从 docker build 产生的镜像将与所有 CRI 实现一起工作,所有的现有镜像将持续依然完全相同的工作。
公有镜像是否持续工作?
能够,所有 CRI 运行时都反对 Kubernetes 中应用的雷同的 pull secret 配置,无论是通过 PodSpec 还是 ServiceAccount。[5]
参考资料:
[1]https://github.com/kubernetes…
[2]https://github.com/kubernetes…
[3]https://kubernetes.io/blog/20…
[4]https://dev.to/inductor/wait-…
[5]https://kubernetes.io/blog/20…