不要惊慌: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。对于这种特定的用例,有很多可用的选项,包括 kaniko、img 和 buildah 等。
那么,这一变化对开发者意味着什么?我们还需要写 Dockerfile 吗?我们还需要用 Docker 构建东西吗?
这一变化针对的是大多数人与 Docker 交互时所处的不同环境。你在开发中使用的 Docker 安装与 Kubernetes 集群内部的 Docker 运行时无关。我们理解这令人困惑。作为一名开发者,Docker 对你来说仍然像宣布这一变化之前一样有用。Docker 生成的镜像并非 Docker 特有的镜像——它是一个 OCI (开放容器倡议) 镜像。任何符合 OCI 标准的镜像,无论你使用什么工具构建,对 Kubernetes 来说都是一样的。containerd 和 CRI-O 都知道如何拉取这些镜像并运行它们。这就是我们制定容器标准的原因。
因此,这一变化即将到来。它会给一些人带来问题,但这并非灾难性的,总的来说这是一件好事。取决于你与 Kubernetes 交互的方式,这对你来说可能毫无影响,也可能意味着一些工作。从长远来看,这将使事情变得更容易。如果你仍然感到困惑,没关系——这里涉及很多内容;Kubernetes 有很多活动部件,没有人能精通其全部。我们鼓励提出任何问题,无论经验水平或复杂程度如何!我们的目标是确保每个人都能尽可能多地了解即将发生的变化。我们希望这已经回答了你的大部分问题,并缓解了一些焦虑!❤️
正在寻找更多答案?请查看我们的配套文章 Dockershim 移除 FAQ (2022 年 2 月更新)。