本文已发布一年以上。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.25:cgroup v2 毕业成为 GA

Kubernetes 1.25 将 cgroup v2 带入 GA(全面可用),让 kubelet 可以使用最新的容器资源管理功能。

什么是 cgroup?

有效的 资源管理 是 Kubernetes 的一个关键方面。这涉及管理节点中的有限资源,例如 CPU、内存和存储。

cgroup 是一种 Linux 内核功能,可建立资源管理功能,例如限制 CPU 使用率或为正在运行的进程设置内存限制。

当您在 Kubernetes 中使用资源管理功能时,例如配置 Pod 和容器的请求和限制,Kubernetes 会使用 cgroup 来强制执行您的资源请求和限制。

Linux 内核提供两个版本的 cgroup:cgroup v1 和 cgroup v2。

什么是 cgroup v2?

cgroup v2 是 Linux cgroup API 的最新版本。cgroup v2 提供了一个统一的控制系统,具有增强的资源管理功能。

自 2016 年以来,cgroup v2 一直在 Linux 内核中开发,近年来在整个容器生态系统中日趋成熟。在 Kubernetes 1.25 中,cgroup v2 支持已升级为全面可用。

许多最新版本的 Linux 发行版默认已切换到 cgroup v2,因此 Kubernetes 继续在这些新的更新发行版上良好运行非常重要。

cgroup v2 提供了相对于 cgroup v1 的多项改进,例如以下几点

  • API 中的单一统一层次结构设计
  • 更安全的子树委托给容器
  • 更新的功能,例如 压力停滞信息
  • 增强的跨多个资源的资源分配管理和隔离
    • 不同类型内存分配(网络和内核内存等)的统一记帐
    • 非即时资源更改(例如页面缓存写回)的记帐

某些 Kubernetes 功能专门使用 cgroup v2 来增强资源管理和隔离。例如,MemoryQoS 功能 提高了内存利用率,并依赖 cgroup v2 功能来实现它。kubelet 中的新资源管理功能也将利用新的 cgroup v2 功能。

如何使用 cgroup v2?

许多 Linux 发行版默认都切换到 cgroup v2;您下次更新控制平面和节点的 Linux 版本时可能会开始使用它!

建议使用默认使用 cgroup v2 的 Linux 发行版。一些使用 cgroup v2 的流行 Linux 发行版包括以下内容

  • 容器优化操作系统(自 M97 起)
  • Ubuntu(自 21.10 起)
  • Debian GNU/Linux(自 Debian 11 Bullseye 起)
  • Fedora(自 31 起)
  • Arch Linux(自 2021 年 4 月起)
  • RHEL 和类似 RHEL 的发行版(自 9 起)

要检查您的发行版是否默认使用 cgroup v2,请参阅检查您的 cgroup 版本或查阅您发行版的文档。

如果您正在使用托管 Kubernetes 产品,请咨询您的提供商以确定他们如何采用 cgroup v2,以及您是否需要采取措施。

要将 cgroup v2 与 Kubernetes 一起使用,您必须满足以下要求

  • 您的 Linux 发行版在 5.8 或更高版本的内核上启用 cgroup v2
  • 您的容器运行时支持 cgroup v2。例如
  • kubelet 和容器运行时配置为使用 systemd cgroup 驱动程序

kubelet 和容器运行时使用 cgroup 驱动程序来设置 cgroup 参数。使用 cgroup v2 时,强烈建议 kubelet 和您的容器运行时都使用 systemd cgroup 驱动程序,以便系统上只有一个 cgroup 管理器。要配置 kubelet 和容器运行时以使用驱动程序,请参阅 systemd cgroup 驱动程序文档

迁移到 cgroup v2

当您使用启用 cgroup v2 的 Linux 发行版运行 Kubernetes 时,只要满足要求,kubelet 应自动适应而无需任何其他配置。

在大多数情况下,除非您的用户直接访问 cgroup 文件系统,否则切换到使用 cgroup v2 时,您不会看到用户体验有任何差异。

如果您的应用程序直接在节点上或从容器内部访问 cgroup 文件系统,则必须更新应用程序以使用 cgroup v2 API 而不是 cgroup v1 API。

您可能需要更新到 cgroup v2 的情况包括以下几种

  • 如果您运行依赖于 cgroup 文件系统的第三方监控和安全代理,请将代理更新为支持 cgroup v2 的版本。
  • 如果您运行 cAdvisor 作为独立的 DaemonSet 来监控 Pod 和容器,请将其更新到 v0.43.0 或更高版本。
  • 如果您部署 Java 应用程序,请优先使用完全支持 cgroup v2 的版本

了解更多

参与其中

欢迎您随时提供反馈!SIG Node 定期举行会议,可在 Kubernetes Slack#sig-node 频道或使用 SIG 邮件列表 中获得。

cgroup v2 经历了一个漫长的历程,是整个行业开源社区协作的一个很好的例子,因为它需要在从 Linux 内核到 systemd 再到各种容器运行时以及(当然)Kubernetes 的整个堆栈中进行工作。

致谢

我们要感谢 Giuseppe Scrivano,他发起了 Kubernetes 中的 cgroup v2 支持,以及来自 SIG Node 社区(包括主席 Dawn ChenDerek Carr)的审查和领导。

我们还要感谢 Docker、containerd 和 CRI-O 等容器运行时的维护者,以及 cAdvisorrunc、libcontainer 等组件的维护者,这些组件是许多容器运行时的基础。最后,如果没有 systemd 和上游 Linux 内核维护者的支持,这一切将是不可能的。

这是一个团队的努力!