关于 cgroup v2

在 Linux 上,控制组会约束分配给进程的资源。

kubelet 和底层容器运行时需要与 cgroup 接口以强制执行对 Pod 和容器的资源管理,包括容器化工作负载的 CPU/内存请求和限制。

Linux 中有两种版本的 cgroup:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。

什么是 cgroup v2?

特性状态: Kubernetes v1.25 [stable]

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

cgroup v2 比 cgroup v1 有多项改进,例如以下几点

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

一些 Kubernetes 特性专门使用 cgroup v2 来增强资源管理和隔离。例如,MemoryQoS 特性改进了内存 QoS,并依赖于 cgroup v2 原语。

使用 cgroup v2

使用 cgroup v2 的推荐方式是使用默认启用和使用 cgroup v2 的 Linux 发行版。

要检查你的发行版是否使用 cgroup v2,请参阅识别 Linux 节点上的 cgroup 版本

要求

cgroup v2 有以下要求

  • 操作系统发行版启用 cgroup v2
  • Linux 内核版本为 5.8 或更高
  • 容器运行时支持 cgroup v2。例如
  • kubelet 和容器运行时被配置为使用 systemd cgroup 驱动

Linux 发行版 cgroup v2 支持

有关使用 cgroup v2 的 Linux 发行版列表,请参阅cgroup v2 文档

  • Container Optimized OS (自 M97 起)
  • Ubuntu (自 21.10 起,推荐 22.04+)
  • Debian GNU/Linux (自 Debian 11 bullseye 起)
  • Fedora (自 31 起)
  • Arch Linux (自 2021 年 4 月起)
  • RHEL 及类似 RHEL 的发行版 (自 9 起)

要检查你的发行版是否正在使用 cgroup v2,请参阅发行版的文档或遵循识别 Linux 节点上的 cgroup 版本中的说明。

你也可以通过修改内核命令行启动参数在你的 Linux 发行版上手动启用 cgroup v2。如果你的发行版使用 GRUB,应在 /etc/default/grub 下的 GRUB_CMDLINE_LINUX 中添加 systemd.unified_cgroup_hierarchy=1,然后运行 sudo update-grub。然而,推荐的方法是使用一个默认已启用 cgroup v2 的发行版。

迁移到 cgroup v2

要迁移到 cgroup v2,请确保你满足要求,然后升级到默认启用 cgroup v2 的内核版本。

kubelet 会自动检测操作系统正在 cgroup v2 上运行,并据此工作,无需额外的配置。

切换到 cgroup v2 时,用户体验不应有任何明显的区别,除非用户直接访问 cgroup 文件系统,无论是在节点上还是从容器内部。

cgroup v2 使用与 cgroup v1 不同的 API,因此如果存在任何直接访问 cgroup 文件系统的应用程序,它们需要更新到支持 cgroup v2 的新版本。例如

  • 一些第三方监控和安全代理可能依赖于 cgroup 文件系统。将这些代理更新到支持 cgroup v2 的版本。
  • 如果你运行 cAdvisor 作为独立的 DaemonSet 来监控 Pod 和容器,请将其更新到 v0.43.0 或更高版本。
  • 如果你部署 Java 应用程序,优先使用完全支持 cgroup v2 的版本
  • 如果你正在使用 uber-go/automaxprocs 包,请确保你使用的版本是 v1.5.1 或更高。

识别 Linux 节点上的 cgroup 版本

cgroup 版本取决于正在使用的 Linux 发行版以及操作系统上配置的默认 cgroup 版本。要检查你的发行版使用哪个 cgroup 版本,请在节点上运行命令 stat -fc %T /sys/fs/cgroup/

stat -fc %T /sys/fs/cgroup/

对于 cgroup v2,输出为 cgroup2fs

对于 cgroup v1,输出为 tmpfs.

下一步

上次修改时间:2024 年 4 月 20 日下午 1:13 PST:修复了内存 QoS 链接不正确的问题 (48a39c77bd)