别慌:Kubernetes 和 Docker

更新: Kubernetes 通过 dockershim 对 Docker 的支持现已移除。欲了解更多信息,请阅读移除常见问题解答。您也可以通过专门的 GitHub issue 讨论此弃用。


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

你无需惊慌。这不像听起来那么 драматиc。

总而言之,Docker 作为底层运行时正在被弃用,转而支持使用为 Kubernetes 创建的 容器运行时接口 (CRI) 的运行时。Docker 生成的镜像将继续在您的集群中与所有运行时一起工作,一如既往。

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

如果您使用的是托管的 Kubernetes 服务,如 AKS、EKS 或 GKE,您需要确保您的工作节点正在使用受支持的容器运行时,然后 Docker 支持将在未来版本的 Kubernetes 中移除。如果您有节点自定义,您可能需要根据您的环境和运行时要求更新它们。请与您的服务提供商合作,以确保正确的升级测试和规划。

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

那么,为什么会有这种困惑,大家又在为什么而恐慌呢?

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

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

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

Docker 不符合 容器运行时接口 (CRI)。如果它符合,我们就不需要垫片,这也就不是问题了。但这并非世界末日,你也不必惊慌——你只需要将容器运行时从 Docker 更改为另一个受支持的容器运行时即可。

需要注意的一点是:如果您今天在集群内的工作流中依赖底层 docker 套接字 (/var/run/docker.sock),那么切换到不同的运行时将导致您无法使用它。这种模式通常被称为 Docker in Docker。针对这种特定用例,有很多替代方案,包括 kanikoimgbuildah 等。

那么,这种变化对开发者意味着什么呢?我们仍然编写 Dockerfile 吗?我们仍然使用 Docker 构建东西吗?

这个变更所涉及的环境与大多数人使用 Docker 进行交互的环境不同。您在开发中使用的 Docker 安装与 Kubernetes 集群中的 Docker 运行时无关。我们理解这令人困惑。作为开发者,Docker 在此变更公布之前对您仍然有用。Docker 生成的镜像并不是 Docker 特有的镜像——它是一个 OCI (开放容器倡议) 镜像。任何符合 OCI 标准的镜像,无论您使用什么工具构建它,对 Kubernetes 来说都将是一样的。 containerdCRI-O 都知道如何拉取这些镜像并运行它们。这就是我们制定容器外观标准的理由。

所以,这个变化即将到来。它会给一些人带来问题,但并非灾难性的,总的来说是件好事。取决于你与 Kubernetes 交互的方式,这可能对你毫无影响,也可能意味着一些工作。从长远来看,这会使事情变得更容易。如果这仍然让你感到困惑,那也没关系——这里有很多事情发生;Kubernetes 有很多活动部件,没有人能百分之百精通所有这些。我们鼓励提出任何和所有问题,无论经验水平或复杂程度如何!我们的目标是确保每个人都尽可能多地了解即将发生的变化。我们希望这已经回答了您的大部分问题,并缓解了一些焦虑!❤️

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