To use this feature, you (or a cluster administrator) will need to enable the PodLevelResourceManagers feature gate for all relevant components in your cluster.
See Enable Or Disable Feature Gates for more information.
本文档提供 kubelet 中 Pod 级资源管理器实现的参考细节,
包括 PodResources API 的报告结构,
以及版本升级和降级期间状态检查点格式的迁移。
在 Kubernetes 1.37 中,当 PodLevelResourceManagers 特性门控启用时,
kubelet 的节点本地 PodResources gRPC API 会原生包含 Pod 级资源条目。
这使节点本地的监控代理和设备插件可以查询分配给某个 Pod 的独占资源:
PodResources gRPC 消息包含顶层 cpu_ids 和 memory 字段,
用于表示分配给整个 Pod 的独占 CPU 和 NUMA 对齐的内存块。ContainerResources 中报告其被分配到的具体 CPU 和内存。cpu_ids 和 memory 字段留空,该分配则反映在 Pod 级。PodSharedPool.CpuIds = Pod.CpuIds - Union(all Container.CpuIds)以下是当指定了 Pod 级资源时 PodResources API 报告行为的摘要:
pod拓扑管理器会分配一个 Pod 级的资源预算。PodResources 中的 Pod 级字段会填入这一分配。
| 容器组合 | Pod 级 cpu_ids / memory | 容器级 cpu_ids / memory | 详情 / 说明 |
|---|---|---|---|
| 独占容器(Guaranteed) | 填入完整的 Pod 级分配。 | 填入该容器分配得到的子集。 | 该容器获得从 Pod 级分配中划分出的独占 CPU。 |
| 共享池容器 | 填入完整的 Pod 级分配。 | 空 | 因为该容器运行在 Pod 共享池中,所以可避免重复计算。 |
containerkubelet 会按容器逐个评估资源分配。Pod 级的 PodResources API 字段保持为空。
| 容器组合 | Pod 级 cpu_ids / memory | 容器级 cpu_ids / memory | 详情/说明 |
|---|---|---|---|
| 独占容器(Guaranteed) | 空 | 填入该容器分配得到的 CPU/内存。 | 该容器直接从节点的可分配池中获得独占分配。 |
| 共享池容器 | 空 | 空 | 运行在节点的常规共享池中。 |
kubelet 状态检查点格式kubelet 维护本地状态检查点文件(位于 kubelet 根目录中的
cpu_manager_state 和 memory_manager_state),
以便在 kubelet 版本升级和降级期间的重启过程中保留资源分配。
在 Kubernetes v1.36 中,启用 PodLevelResourceManagers 特性门控会使用内部的
V3 格式保存状态检查点。虽然升级到 1.36 是向后兼容的,
但 V3 格式缺少前向兼容性。如果你把 1.36 的 kubelet 降级到 1.35 或更早版本
(或者在 1.36 中活跃使用之后禁用该特性门控),较旧的 kubelet 无法解析 V3 检查点,
并会因 checkpoint is corrupted 错误而启动失败。
要恢复,请腾空该节点,手动删除检查点文件
(cpu_manager_state 和 memory_manager_state),然后重启 kubelet。
在 Kubernetes v1.37 中,检查点文件使用一种通用的 V4 格式, 其中内嵌标准的 V2 结构。这引入了一种前向兼容的内部格式, 使检查点不兼容成为一次性问题,而不是你在未来更新中预期会遇到的情况:
kubelet 版本可以读取 V4 检查点而不会出现损坏错误。
如果你把 v1.37 的 kubelet 降级到 v1.36(即使在 1.36 中启用了
PodLevelResourceManagers),1.36 的 kubelet 也能从 V2 安全地恢复标准容器分配。kubelet 可以安全启动而不会出现损坏,
但在降级到 v1.36 时,活跃的 Pod 级资源分配(PodEntries)会丢失。如果你运行的不是 Kubernetes v1.37,请查阅该版本 Kubernetes 的文档,了解升级和降级相关的信息。
pod 和 container 范围下的资源管理器分配规则。.spec.resources 以请求 Pod 级计算资源。kubelet 资源管理器:
按照分步实践教程配置 kubelet 并验证分配行为。kubelet 状态文件参考:
进一步了解本地状态检查点文件(cpu_manager_state 和 memory_manager_state)存放在宿主机文件系统的什么位置。