关于 cgroup v2

在 Linux 上,控制组(cgroups)限制分配给进程的资源。

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

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

cgroup v2 是什么?

特性状态: Kubernetes v1.25 [稳定]

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

cgroup v2 相比 cgroup v1 提供了多项改进,例如:

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

一些 Kubernetes 功能专门使用 cgroup v2 来增强资源管理和隔离。例如,内存 QoS(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)