不要惊慌: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。对于这种特定用例,有很多选择,包括 kaniko、img 和 buildah 等。
但是,这种变化对开发人员意味着什么?我们是否仍然编写 Dockerfiles?我们是否仍然使用 Docker 构建东西?
此更改解决了一个与大多数人用来与 Docker 交互的环境不同的环境。您在开发中使用的 Docker 安装与 Kubernetes 集群内部的 Docker 运行时无关。这很让人困惑,我们理解。作为一名开发人员,Docker 仍然像在宣布此更改之前一样对您有用。Docker 产生的镜像实际上不是 Docker 特定的镜像,而是一个 OCI (开放容器计划) 镜像。任何符合 OCI 标准的镜像,无论您使用什么工具构建它,对 Kubernetes 来说都一样。 containerd 和 CRI-O 都知道如何拉取这些镜像并运行它们。这就是为什么我们有一个关于容器应该是什么样子的标准。
所以,这种变化即将来临。它会对某些人造成问题,但它不是灾难性的,并且总体而言是一件好事。根据您与 Kubernetes 交互的方式,这对您来说可能没有任何影响,或者可能意味着需要做一些工作。从长远来看,这将使事情变得更容易。如果这对您仍然感到困惑,那没关系,这里有很多事情发生;Kubernetes 有很多活动部件,没有人是 100% 的专家。我们鼓励提出任何问题,无论经验水平或复杂性如何!我们的目标是确保每个人都尽可能地了解即将发生的变化。我们希望这已经回答了您的大部分问题并缓解了一些焦虑!❤️
正在寻找更多答案?查看我们随附的Dockershim 删除常见问题解答(2022 年 2 月更新)。