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