关于 cgroup v2
在 Linux 上,控制组 限制分配给进程的资源。
The kubelet 和底层容器运行时需要与控制组交互,以强制执行 Pod 和容器的资源管理,其中包括容器化工作负载的 CPU/内存请求和限制。
Linux 中有两个版本的控制组:控制组 v1 和控制组 v2。控制组 v2 是 cgroup
API 的新一代。
什么是控制组 v2?
Kubernetes v1.25 [稳定]
控制组 v2 是 Linux cgroup
API 的下一个版本。控制组 v2 提供了一个统一的控制系统,具有增强的资源管理功能。
与控制组 v1 相比,控制组 v2 提供了一些改进,例如以下内容
- API 中的单一统一层次结构设计
- 对容器进行更安全的子树委托
- 更新的功能,例如 压力停滞信息
- 增强跨多个资源的资源分配管理和隔离
- 对不同类型的内存分配(网络内存、内核内存等)进行统一的记账
- 对非即时资源更改(例如页面缓存写入回写)进行记账
一些 Kubernetes 功能专门使用控制组 v2 来增强资源管理和隔离。例如,内存 QoS 功能改进了内存 QoS,并依赖于控制组 v2 原语。
使用控制组 v2
使用控制组 v2 的推荐方法是使用默认启用并使用控制组 v2 的 Linux 发行版。
要检查您的发行版是否使用控制组 v2,请参考 识别 Linux 节点上的控制组版本。
要求
控制组 v2 具有以下要求
- 操作系统发行版启用控制组 v2
- Linux 内核版本为 5.8 或更高版本
- 容器运行时支持控制组 v2。例如
- containerd v1.4 及更高版本
- cri-o v1.20 及更高版本
- kubelet 和容器运行时配置为使用 systemd 控制组驱动程序
Linux 发行版控制组 v2 支持
有关使用控制组 v2 的 Linux 发行版列表,请参考 控制组 v2 文档
- 容器优化操作系统 (自 M97 起)
- Ubuntu (自 21.10 起,22.04+ 推荐)
- Debian GNU/Linux (自 Debian 11 bullseye 起)
- Fedora (自 31 起)
- Arch Linux (自 2021 年 4 月起)
- RHEL 和 RHEL 类发行版 (自 9 起)
要检查您的发行版是否正在使用控制组 v2,请参考您的发行版的文档或按照 识别 Linux 节点上的控制组版本 中的说明进行操作。
您也可以通过修改内核 cmdline 启动参数,在您的 Linux 发行版上手动启用控制组 v2。如果您的发行版使用 GRUB,则应在 /etc/default/grub
中的 GRUB_CMDLINE_LINUX
中添加 systemd.unified_cgroup_hierarchy=1
,然后执行 sudo update-grub
。但是,推荐的方法是使用默认已启用控制组 v2 的发行版。
迁移到控制组 v2
要迁移到控制组 v2,请确保您满足 要求,然后升级到默认启用控制组 v2 的内核版本。
kubelet 会自动检测操作系统是否在控制组 v2 上运行,并相应地执行,无需任何额外的配置。
切换到控制组 v2 时,用户体验应该没有明显的差异,除非用户直接访问控制组文件系统,无论是从节点还是从容器内部访问。
控制组 v2 使用与控制组 v1 不同的 API,因此,如果存在直接访问控制组文件系统的任何应用程序,则需要将其更新到支持控制组 v2 的更新版本。例如
- 一些第三方监控和安全代理可能依赖于控制组文件系统。将这些代理更新到支持控制组 v2 的版本。
- 如果您以独立 DaemonSet 的方式运行 cAdvisor 来监控 Pod 和容器,请将其更新到 v0.43.0 或更高版本。
- 如果您部署 Java 应用程序,请优先使用完全支持控制组 v2 的版本
- OpenJDK / HotSpot: jdk8u372、11.0.16、15 及更高版本
- IBM Semeru Runtimes: 8.0.382.0、11.0.20.0、17.0.8.0 及更高版本
- IBM Java: 8.0.8.6 及更高版本
- 如果您使用 uber-go/automaxprocs 包,请确保您使用的版本为 v1.5.1 或更高版本。
识别 Linux 节点上的控制组版本
控制组版本取决于所使用的 Linux 发行版和操作系统上配置的默认控制组版本。要检查您的发行版使用的是哪个控制组版本,请在节点上运行 stat -fc %T /sys/fs/cgroup/
命令
stat -fc %T /sys/fs/cgroup/
对于控制组 v2,输出为 cgroup2fs
。
对于控制组 v1,输出为 tmpfs
。