不要惊慌:Kubernetes 和 Docker

更新: 通过 dockershim 对 Docker 的 Kubernetes 支持现已移除。欲了解更多信息,请阅读移除 FAQ。你还可以通过专门的GitHub Issue讨论此弃用。


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

你不需要恐慌。事情没有听起来那么夸张。

概览:Docker 作为底层运行时正在被弃用,转而支持使用为 Kubernetes 创建的容器运行时接口 (CRI) 的运行时。所有运行时仍将继续支持 Docker 生成的镜像,就像以前一样。

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

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

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

那么为什么会出现混乱,大家都在恐慌什么呢?

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

你看,“Docker” 这个我们常说的东西实际上并非一个单一实体——它是一个完整的技术栈,其中一部分叫做 “containerd”,它本身就是一个高级容器运行时。Docker 很好用,因为它有很多用户体验增强功能,让人们在开发时可以非常轻松地与之交互,但 Kubernetes 不需要这些用户体验增强功能,因为它不是人。

由于这个对人友好的抽象层,你的 Kubernetes 集群必须使用另一个叫做 Dockershim 的工具来获取它真正需要的东西,也就是 containerd。这不太好,因为它增加了另一个需要维护且可能出错的东西。实际上,Dockershim 最早将在 v1.23 版本中从 Kubelet 中移除,从而导致不再支持 Docker 作为容器运行时。你可能会想,但如果 containerd 包含在 Docker 技术栈中,为什么 Kubernetes 还需要 Dockershim?

Docker 不符合 CRI,即容器运行时接口。如果符合,我们就不需要 shim 了,也就不会有这回事。但这并不是世界末日,你无需恐慌——你只需要将容器运行时从 Docker 更改为其他受支持的容器运行时即可。

需要注意的是:如果你目前在集群内的工作流中依赖底层的 docker socket (/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 移除 FAQ (2022 年 2 月更新)