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

Kubernetes 1.25: cgroup v2 进阶至 GA

Kubernetes 1.25 将 cgroup v2 推向 GA(普遍可用),让 kubelet 能够使用最新的容器资源管理功能。

什么是 cgroups?

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

cgroups 是一种 Linux 内核功能,它提供了资源管理功能,例如限制 CPU 使用率或为正在运行的进程设置内存限制。

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

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

什么是 cgroup v2?

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

cgroup v2 自 2016 年以来一直在 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 内核维护者的支持,这一切都不可能实现。

这是团队的努力!