Kubernetes v1.32 为严格的 CPU 预留添加了新的 CPU Manager 静态策略选项

在 Kubernetes v1.32 中,经过社区多年的讨论,我们很高兴为 CPU 管理器的静态策略引入了 strict-cpu-reservation 选项。该功能目前处于 Alpha 阶段,相关的策略默认是隐藏的。只有在集群中明确启用 Alpha 行为,你才能使用该策略。

了解此特性

CPU 管理器的静态策略用于减少延迟或提高性能。reservedSystemCPUs 为操作系统系统守护进程和 Kubernetes 系统守护进程定义了一个明确的 CPU 集合。此选项专为电信/NFV 类型的用例而设计,在这些用例中,不受控制的中断/计时器可能会影响工作负载的性能。你可以使用此选项为系统/Kubernetes 守护进程以及中断/计时器定义明确的 CPU 集合,以便系统上的其余 CPU 可以专用于工作负载,同时减少不受控制的中断/计时器的影响。有关此参数的更多详细信息,请参阅显式预留 CPU 列表页面。

如果你想保护你的系统守护进程和中断处理,最直接的方法是使用 reservedSystemCPUs 选项。

然而,直到 Kubernetes v1.32 发布,这种隔离仅对请求整数个 CPU 的 Guaranteed Pods 实现。在 Pod 准入时,kubelet 仅将 CPU **请求**与可分配的 CPU 进行比较。在 Kubernetes 中,limits 可以高于 requests;之前的实现允许 Burstable 和 Best-Effort Pods 使用 reservedSystemCPUs 的容量,这可能会导致主机操作系统的 CPU 资源耗尽 —— 我们知道有人在实际部署中遇到了这种情况。现有的行为也使得基准测试(无论是针对基础设施还是工作负载)的结果不准确。

当启用这个新的 strict-cpu-reservation 策略选项时,CPU 管理器的静态策略将不允许任何工作负载使用为系统预留的 CPU 核心。

启用该特性

要启用此功能,你需要同时开启 CPUManagerPolicyAlphaOptions 特性门控和 strict-cpu-reservation 策略选项。并且,如果 /var/lib/kubelet/cpu_manager_state 文件存在,你需要删除它并重启 kubelet。

使用以下 kubelet 配置

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
featureGates:
  ...
  CPUManagerPolicyOptions: true
  CPUManagerPolicyAlphaOptions: true
cpuManagerPolicy: static
cpuManagerPolicyOptions:
  strict-cpu-reservation: "true"
reservedSystemCPUs: "0,32,1,33,16,48"
...

strict-cpu-reservation 未设置或设置为 false 时

# cat /var/lib/kubelet/cpu_manager_state
{"policyName":"static","defaultCpuSet":"0-63","checksum":1058907510}

strict-cpu-reservation 设置为 true 时

# cat /var/lib/kubelet/cpu_manager_state
{"policyName":"static","defaultCpuSet":"2-15,17-31,34-47,49-63","checksum":4141502832}

监控此功能

你可以通过检查以下 CPU 管理器计数器来监控此功能的影响

  • cpu_manager_shared_pool_size_millicores:报告共享池的大小,单位为毫核(例如 13500m)
  • cpu_manager_exclusive_cpu_allocation_count:报告独占分配的核心数,计算完整的核心(例如 16)

如果 cpu_manager_shared_pool_size_millicores 计数长时间为零,你的 best-effort 工作负载可能会饿死。

我们认为任何用于运营目的的 Pod(如日志转发器)都不应以 best-effort 方式运行,但你可以根据需要审查和调整预留的 CPU 核心数量。

结论

严格的 CPU 预留对于电信/NFV 用例至关重要。它也是启用一体化类型部署的先决条件,在这种部署中,工作负载被放置在兼具控制、工作和存储角色的节点上。

我们希望你开始使用此功能,并期待你的反馈。

进一步阅读

请查看控制节点上的 CPU 管理策略任务页面,以了解有关 CPU 管理器的更多信息,以及它与其他节点级资源管理器的关系。

参与进来

此功能由 SIG Node 推动。如果你有兴趣帮助开发此功能、分享反馈或参与任何其他正在进行的 SIG Node 项目,请参加 SIG Node 会议以获取更多详细信息。