本文发布已超过一年。较旧的文章可能包含过时内容。请确认页面中的信息自发布以来没有失效。
Kubernetes 1.25:cgroup v2 进入 GA
Kubernetes 1.25 将 cgroup v2 推至 GA (普遍可用),让 kubelet 能够使用最新的容器资源管理能力。
cgroups 是什么?
有效的资源管理是 Kubernetes 的关键方面之一。这包括管理节点中的有限资源,如 CPU、内存和存储。
cgroups 是 Linux 内核的一项功能,它提供了资源管理功能,例如限制 CPU 使用或为运行中的进程设置内存限制。
当您使用 Kubernetes 中的资源管理功能时,例如为 Pod 和容器配置请求和限制,Kubernetes 会使用 cgroups 来强制执行您的资源请求和限制。
Linux 内核提供两个版本的 cgroups:cgroup v1 和 cgroup v2。
cgroup v2 是什么?
cgroup v2 是 Linux cgroup API 的最新版本。cgroup v2 提供了一个统一的控制系统,具有增强的资源管理能力。
cgroup v2 自 2016 年以来一直在 Linux 内核中开发,并且近年来在整个容器生态系统中日趋成熟。随着 Kubernetes 1.25 的发布,cgroup v2 的支持已达到普遍可用 (GA)。
许多最新版本的 Linux 发行版已默认切换到 cgroup v2,因此 Kubernetes 在这些更新的发行版上继续良好运行至关重要。
cgroup v2 相对于 cgroup v1 提供了一些改进,例如:
- API 中统一的层级设计
- 更安全的子树委托给容器
- 新功能,如压力停顿信息 (Pressure Stall Information)
- 增强的资源分配管理和多资源隔离
- 统一核算不同类型的内存分配(网络内存、内核内存等)
- 核算非即时资源变更,如页面缓存写回
一些 Kubernetes 功能专门使用 cgroup v2 来增强资源管理和隔离。例如,MemoryQoS 功能提高了内存利用率,并且依赖 cgroup v2 功能来实现。kubelet 中的新资源管理功能也将利用未来的 cgroup v2 新特性。
如何使用 cgroup v2?
许多 Linux 发行版正在默认切换到 cgroup v2;下次您更新控制平面和节点的 Linux 版本时,可能就会开始使用它!
使用默认启用 cgroup v2 的 Linux 发行版是推荐的方法。一些常用的默认使用 cgroup v2 的 Linux 发行版包括:
- Container Optimized OS (自 M97)
- Ubuntu (自 21.10)
- Debian GNU/Linux (自 Debian 11 Bullseye)
- Fedora (自 31)
- Arch Linux (自 2021 年 4 月)
- RHEL 和类似 RHEL 的发行版 (自 9)
要检查您的发行版是否默认使用 cgroup v2,请参阅检查您的 cgroup 版本或查阅您发行版的文档。
如果您使用的是托管 Kubernetes 服务,请咨询您的提供商,了解他们如何采用 cgroup v2,以及您是否需要采取行动。
要将 cgroup v2 与 Kubernetes 一起使用,您必须满足以下要求:
- 您的 Linux 发行版在内核版本 5.8 或更高版本上启用了 cgroup v2
- 您的容器运行时支持 cgroup v2。例如:
- containerd v1.4 或更高版本
- cri-o v1.20 或更高版本
- kubelet 和容器运行时配置为使用 systemd cgroup 驱动程序
kubelet 和容器运行时使用cgroup 驱动程序来设置 cgroup 参数。使用 cgroup v2 时,强烈建议 kubelet 和您的容器运行时都使用systemd cgroup 驱动程序,以便系统上只有一个 cgroup 管理器。要配置 kubelet 和容器运行时使用该驱动程序,请参阅systemd cgroup 驱动程序文档。
迁移到 cgroup v2
当您在启用 cgroup v2 的 Linux 发行版上运行 Kubernetes 时,只要满足要求,kubelet 应该会自动适应,无需额外配置。
在大多数情况下,除非您的用户直接访问 cgroup 文件系统,否则切换到使用 cgroup v2 不会看到用户体验上的差异。
如果您的应用程序直接访问 cgroup 文件系统(无论是在节点上还是在容器内),则必须更新应用程序以使用 cgroup v2 API 而不是 cgroup v1 API。
您可能需要更新到 cgroup v2 的场景包括:
- 如果您运行依赖于 cgroup 文件系统的第三方监控和安全代理,请将其更新到支持 cgroup v2 的版本。
- 如果您以独立 DaemonSet 形式运行 cAdvisor 进行 Pod 和容器监控,请将其更新到 v0.43.0 或更高版本。
- 如果您部署 Java 应用程序,最好使用完全支持 cgroup 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 及更高版本
了解更多
- 阅读Kubernetes cgroup v2 文档
- 阅读增强提案,KEP 2254
- 在 Linux Manual Pages 上了解更多关于 cgroups 的信息,以及在 Linux Kernel 文档中了解 cgroup v2 的信息
参与其中
欢迎您随时提供反馈!SIG Node 定期举行会议,您可以在 Kubernetes Slack 的 #sig-node
频道中找到他们,或者使用 SIG 邮件列表。
cgroup v2 历经漫长,是跨行业开源社区协作的一个绝佳范例,因为它需要跨越整个技术栈的协同工作,从 Linux 内核到 systemd,再到各种容器运行时,当然还有 Kubernetes。
致谢
我们要感谢启动 Kubernetes cgroup v2 支持的 Giuseppe Scrivano,以及 SIG Node 社区的评审和领导者,包括主席 Dawn Chen 和 Derek Carr。
我们还要感谢 Docker、containerd 和 CRI-O 等容器运行时的维护者,以及 cAdvisor 和 runc、libcontainer 等组件的维护者,它们是许多容器运行时的基础。最后,如果没有 systemd 和上游 Linux 内核维护者的支持,这一切将无法实现。
这是团队合作的成果!