关于 cgroup v2

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

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 v1 相比,cgroup v2 提供了多项改进,例如:

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

某些 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 文档

  • 容器优化操作系统(自 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 版本 中的说明进行操作。

你还可以通过修改内核 cmdline 启动参数,在 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 使用的 API 与 cgroup v1 不同,因此,如果有任何应用程序直接访问 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(太平洋标准时间):修复了内存 QoS 的错误链接 (48a39c77bd)