本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。
Kubernetes v1.26: CPUManager 正式可用
CPU Manager 是 kubelet(Kubernetes 节点代理)的一部分,它使用户能够为容器分配独占的 CPU。自 Kubernetes v1.10 版本(在该版本中它晋升到 Beta)以来,CPU Manager 证明了其可靠性,并成功地扮演了为容器分配独占 CPU 的角色,因此其采用率稳步增长,使其成为性能关键和低延迟设置的重要组成部分。随着时间的推移,大多数变更都是关于 bug 修复或内部重构,其中以下是值得注意的用户可见变更:
- 支持明确预留 CPU:之前已经可以请求为包括 kubelet 本身在内的系统资源预留一定数量的 CPU,这些 CPU 不会用于独占 CPU 分配。现在也可以明确选择要预留哪些 CPU,而不是让 kubelet 自动选择。
- 使用 kubelet 本地的 PodResources API 向容器报告独占分配的 CPU,就像已经为设备所做的那样。
- 优化系统资源使用,消除不必要的 sysfs 更改。
CPU Manager 已经达到了“开箱即用”的程度,因此在 Kubernetes v1.26 中,它已晋升到正式发布 (GA)。
CPU Manager 的定制选项
CPU Manager 支持两种操作模式,通过其 策略 进行配置。使用 none
策略时,CPU Manager 会为容器分配 CPU,除了 Pod spec 中设置的(可选)配额之外,没有任何特定限制。使用 static
策略时,如果 Pod 处于 Guaranteed QoS 类且该 Pod 中的每个容器请求整数个 vCPU 内核,则 CPU Manager 会独占分配 CPU。独占分配意味着其他容器(无论是同一 Pod 中的,还是不同 Pod 中的)都不会调度到该 CPU 上。
这种简单的操作模式很好地服务了用户群体,但随着 CPU Manager 越来越成熟,用户开始寻求更精细的使用场景以及如何更好地支持它们。
社区意识到,与其添加更多策略,几乎所有新的使用场景都是 static
CPU Manager 策略所启用行为的某种变体。因此,决定添加用于调整静态策略行为的选项。这些选项的成熟度各不相同,就像任何其他 Kubernetes 功能一样,并且为了被接受,每个新选项在禁用时都提供了向后兼容的行为,并文档化了它们之间如何交互(如果确实交互的话)。
这使得 Kubernetes 项目能够将 CPU Manager 核心组件和核心 CPU 分配算法晋升到 GA,同时也在该领域开启了新的实验时代。在 Kubernetes v1.26 中,CPU Manager 支持三种不同的策略选项:
full-pcpus-only
- 将 CPU Manager 核心分配算法限制为仅完整的物理核心,减少硬件技术允许共享核心带来的“吵闹邻居”问题。
distribute-cpus-across-numa
- 驱动 CPU Manager 将 CPU 均匀分布到 NUMA 节点上,适用于需要多个 NUMA 节点才能满足分配需求的情况。
align-by-socket
- 改变 CPU Manager 为容器分配 CPU 的方式:将 CPU 视为按 Socket 边界对齐,而不是按 NUMA 节点边界对齐。
进一步开发
在主要的 CPU Manager 功能晋升到 GA 后,每个现有的策略选项将遵循各自的晋升流程,独立于 CPU Manager 和其他选项。还有空间添加新的选项,但也有越来越大的需求,希望获得比 CPU Manager 及其策略选项目前提供的更强的灵活性。
社区正在讨论将 CPU Manager 和当前作为 kubelet 可执行文件一部分的其他资源管理器拆分成可插拔、独立的 kubelet 插件。如果你对此感兴趣,请加入 SIG Node 的沟通渠道(Slack、邮件列表、周会)参与讨论。
延伸阅读
请查看 控制节点上的 CPU 管理策略 任务页面,了解更多关于 CPU Manager 的信息,以及它如何与其他节点级资源管理器配合使用。
参与其中
此功能由 SIG Node 社区推动。欢迎加入我们,与社区联系,并分享你对上述功能及其他方面的想法和反馈。我们期待你的来信!