不要惊慌:Kubernetes 和 Docker

更新:Kubernetes 对 Docker 的支持已通过 dockershim 删除。有关更多信息,请阅读删除常见问题解答。您还可以通过一个专门的 GitHub 问题讨论弃用事宜。


Kubernetes 在 v1.20 之后弃用 Docker 作为容器运行时。

您无需恐慌。这并不像听起来那么戏剧性。

TL;DR:Docker 作为底层运行时正在被弃用,取而代之的是使用为 Kubernetes 创建的容器运行时接口 (CRI) 的运行时。Docker 生成的镜像将继续在您的集群中与所有运行时一起工作,就像它们一直以来一样。

如果您是 Kubernetes 的最终用户,那么对您来说不会有太多改变。这并不意味着 Docker 的消亡,也不意味着您不能或不应该再将 Docker 用作开发工具。Docker 仍然是构建容器的有用工具,并且运行 docker build 产生的镜像仍然可以在您的 Kubernetes 集群中运行。

如果您使用的是像 AKS、EKS 或 GKE 这样的托管 Kubernetes 服务,您需要在 Kubernetes 的未来版本中删除 Docker 支持之前,确保您的工作节点正在使用受支持的容器运行时。如果您有节点自定义设置,您可能需要根据您的环境和运行时要求对其进行更新。请与您的服务提供商合作,确保进行适当的升级测试和计划。

如果您正在滚动自己的集群,您也需要进行更改以避免集群中断。在 v1.20 中,您将收到有关 Docker 的弃用警告。当 Docker 运行时支持在未来的 Kubernetes 版本中被删除(目前计划在 2021 年末的 1.22 版本中)时,它将不再受支持,您将需要切换到其他符合要求的容器运行时之一,例如 containerd 或 CRI-O。只需确保您选择的运行时支持您当前使用的 Docker 守护程序配置(例如日志记录)。

那么,为什么会感到困惑,大家都在惊慌失措什么?

我们这里谈论的是两个不同的环境,这造成了混乱。在您的 Kubernetes 集群内部,有一个叫做容器运行时的东西,它负责拉取和运行您的容器镜像。Docker 是该运行时的一个流行选择(其他常见的选项包括 containerd 和 CRI-O),但是 Docker 的设计目的不是嵌入在 Kubernetes 内部,这会导致问题。

您看,我们称之为“Docker”的东西实际上不是一个东西,它是一个完整的技术堆栈,其中一部分是一个叫做“containerd”的东西,它本身就是一个高级容器运行时。Docker 很酷且有用,因为它有很多 UX 增强功能,使我们人类在进行开发工作时非常容易与之交互,但是这些 UX 增强功能对于 Kubernetes 来说不是必需的,因为它不是人类。

由于这种对人类友好的抽象层,您的 Kubernetes 集群必须使用另一个称为 Dockershim 的工具来获取它真正需要的东西,即 containerd。这不太好,因为它给了我们另一个需要维护并且可能会中断的东西。实际上发生的情况是,Dockershim 将早在 v1.23 版本就从 Kubelet 中删除,从而导致删除对 Docker 作为容器运行时的支持。您可能会想,但是如果 containerd 包含在 Docker 堆栈中,为什么 Kubernetes 需要 Dockershim?

Docker 不符合 CRI,即容器运行时接口。如果它符合,我们将不需要 shim,并且这不会成为问题。但这并不是世界末日,您无需恐慌,您只需要将您的容器运行时从 Docker 更改为另一个受支持的容器运行时即可。

需要注意的一点是:如果您今天依赖于底层 Docker 套接字(/var/run/docker.sock)作为集群内工作流的一部分,则迁移到不同的运行时将破坏您使用它的能力。这种模式通常被称为 Docker in Docker。对于这种特定用例,有很多选择,包括 kanikoimgbuildah 等。

但是,这种变化对开发人员意味着什么?我们是否仍然编写 Dockerfiles?我们是否仍然使用 Docker 构建东西?

此更改解决了一个与大多数人用来与 Docker 交互的环境不同的环境。您在开发中使用的 Docker 安装与 Kubernetes 集群内部的 Docker 运行时无关。这很让人困惑,我们理解。作为一名开发人员,Docker 仍然像在宣布此更改之前一样对您有用。Docker 产生的镜像实际上不是 Docker 特定的镜像,而是一个 OCI (开放容器计划) 镜像。任何符合 OCI 标准的镜像,无论您使用什么工具构建它,对 Kubernetes 来说都一样。 containerdCRI-O 都知道如何拉取这些镜像并运行它们。这就是为什么我们有一个关于容器应该是什么样子的标准。

所以,这种变化即将来临。它会对某些人造成问题,但它不是灾难性的,并且总体而言是一件好事。根据您与 Kubernetes 交互的方式,这对您来说可能没有任何影响,或者可能意味着需要做一些工作。从长远来看,这将使事情变得更容易。如果这对您仍然感到困惑,那没关系,这里有很多事情发生;Kubernetes 有很多活动部件,没有人是 100% 的专家。我们鼓励提出任何问题,无论经验水平或复杂性如何!我们的目标是确保每个人都尽可能地了解即将发生的变化。我们希望这已经回答了您的大部分问题并缓解了一些焦虑!❤️

正在寻找更多答案?查看我们随附的Dockershim 删除常见问题解答(2022 年 2 月更新)