本文发布已超过一年。较旧的文章可能包含过时内容。请确认页面中的信息自发布以来没有失效。

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 的支持已达到普遍可用 (GA)。

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

cgroup v2 相对于 cgroup v1 提供了一些改进,例如:

  • API 中统一的层级设计
  • 更安全的子树委托给容器
  • 新功能,如压力停顿信息 (Pressure Stall Information)
  • 增强的资源分配管理和多资源隔离
    • 统一核算不同类型的内存分配(网络内存、内核内存等)
    • 核算非即时资源变更,如页面缓存写回

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

如何使用 cgroup v2?

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

使用默认启用 cgroup v2 的 Linux 发行版是推荐的方法。一些常用的默认使用 cgroup v2 的 Linux 发行版包括:

  • Container Optimized OS (自 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 的版本。
  • 如果您以独立 DaemonSet 形式运行 cAdvisor 进行 Pod 和容器监控,请将其更新到 v0.43.0 或更高版本。
  • 如果您部署 Java 应用程序,最好使用完全支持 cgroup v2 的版本。

了解更多

参与其中

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

cgroup v2 历经漫长,是跨行业开源社区协作的一个绝佳范例,因为它需要跨越整个技术栈的协同工作,从 Linux 内核到 systemd,再到各种容器运行时,当然还有 Kubernetes。

致谢

我们要感谢启动 Kubernetes cgroup v2 支持的 Giuseppe Scrivano,以及 SIG Node 社区的评审和领导者,包括主席 Dawn ChenDerek Carr

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

这是团队合作的成果!