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