在 Linux 上,控制组约束分配给进程的资源。
kubelet 和底层容器运行时都需要对接 cgroup 来强制执行为 Pod 和容器管理资源, 这包括为容器化工作负载配置 CPU/内存请求和限制。
Linux 中有两个 CGroup 版本:CGroup v1 和 CGroup v2。
CGroup v2 是新一代的 cgroup API。
Kubernetes v1.25 [stable]CGroup v2 是 Linux cgroup API 的下一个版本。
CGroup v2 提供了一个具有增强资源管理能力的统一控制系统。
CGroup v2 对 CGroup v1 进行了多项改进,例如:
一些 Kubernetes 特性专门使用 CGroup v2 来增强资源管理和隔离。 例如,MemoryQoS 特性改进了内存 QoS 并依赖于 CGroup v2 原语。
使用 cgroup v2 的推荐方法是使用一个默认启用 CGroup v2 的 Linux 发行版。
要检查你的发行版是否使用 CGroup v2,请参阅识别 Linux 节点上的 CGroup 版本。
CGroup v2 具有以下要求:
有关使用 CGroup v2 的 Linux 发行版的列表, 请参阅 CGroup v2 文档。
要检查你的发行版是否使用 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 的内核版本。
kubelet 能够自动检测操作系统是否运行在 CGroup v2 上并相应调整其操作,无需额外配置。
切换到 CGroup v2 时,用户体验应没有任何明显差异, 除非用户直接在节点上或从容器内访问 CGroup 文件系统。
CGroup v2 使用一个与 CGroup v1 不同的 API,因此如果有任何应用直接访问 CGroup 文件系统, 则需要将这些应用更新为支持 CGroup v2 的版本。例如:
CGroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 CGroup 版本。
要检查你的发行版使用的是哪个 CGroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:
stat -fc %T /sys/fs/cgroup/
对于 CGroup v2,输出为 cgroup2fs。
对于 CGroup v1,输出为 tmpfs。
Kubernetes v1.35 [deprecated]Kubernetes 已弃用 CGroup v1。 移除将遵循 Kubernetes 弃用策略。
默认情况下,kubelet 将不再在 CGroup v1 节点上启动。
要禁用此设置,集群管理员应在
kubelet 配置文件中将
failCgroupV1 设置为 false。