集群管理员动态资源分配最佳实践
本页面描述了配置使用动态资源分配 (DRA) 的 Kubernetes 集群时的最佳实践。这些说明适用于集群管理员。
DRA 相关 API 的独立权限
DRA 通过多种不同的 API 进行协调。根据用户的角色,使用授权工具(如 RBAC 或其他解决方案)来控制对正确 API 的访问。
通常,DeviceClasses 和 ResourceSlices 应仅限于管理员和 DRA 驱动程序。将使用声明部署 Pod 的集群操作员将需要访问 ResourceClaim 和 ResourceClaimTemplate API;这两个 API 都是命名空间范围的。
DRA 驱动程序的部署和维护
DRA 驱动程序是第三方应用程序,运行在集群的每个节点上,用于与该节点的硬件和 Kubernetes 的原生 DRA 组件进行接口。安装过程取决于你选择的驱动程序,但很可能作为 DaemonSet 部署到集群中的所有节点或选定节点(使用节点选择器或类似机制)。
如果可能,请使用无缝升级的驱动程序
DRA 驱动程序实现了 kubeletplugin
包接口。你的驱动程序可能支持**无缝升级**,通过实现此接口的一个属性,允许同一 DRA 驱动程序的两个版本在短时间内共存。这仅适用于 kubelet 1.33 及更高版本,并且你的驱动程序可能不支持运行旧版本 Kubernetes 的异构集群中的附加节点——请查阅你的驱动程序文档以确保。
如果你的情况支持无缝升级,请考虑使用它来最大程度地减少驱动程序更新时的调度延迟。
如果你无法使用无缝升级,在驱动程序升级停机期间,你可能会观察到:
- Pods 无法启动,除非它们所依赖的声明已准备好使用。
- 在使用声明的最后一个 Pod 终止后,清理工作会延迟,直到驱动程序再次可用。该 Pod 未被标记为已终止。这会阻止将 Pod 使用的资源重新用于其他 Pod。
- 正在运行的 Pod 将继续运行。
确认您的 DRA 驱动程序暴露了存活探针并加以利用
您的 DRA 驱动程序很可能实现了 gRPC 套接字用于健康检查,这是 DRA 驱动程序的良好实践的一部分。利用此 gRPC 套接字的最简单方法是将其配置为部署 DRA 驱动程序的 DaemonSet 的存活探针。您的驱动程序的文档或部署工具可能已经包含了这一点,但如果您是单独构建配置或未将 DRA 驱动程序作为 Kubernetes Pod 运行,请确保您的编排工具在健康检查此 gRPC 套接字失败时重启 DRA 驱动程序。这样做将最大程度地减少 DRA 驱动程序的意外停机时间,并为其提供更多自愈机会,从而减少调度延迟或故障排除时间。
在排空节点时,应尽可能晚地排空 DRA 驱动程序
DRA 驱动程序负责取消准备分配给 Pod 的任何设备,如果 DRA 驱动程序在包含声明的 Pod 被删除之前排空,它将无法完成其清理工作。如果您为节点实现了自定义排空逻辑,请考虑在终止 DRA 驱动程序本身之前检查是否存在已分配/保留的 ResourceClaim 或 ResourceClaimTemplates。
监控和调整组件以应对更高的负载,尤其是在大规模环境中
控制面组件 kube-scheduler 和由组件 kube-controller-manager 协调的内部 ResourceClaim 控制器在调度带有声明的 Pod 时,根据存储在 DRA API 中的元数据执行繁重的工作。与非 DRA 调度的 Pod 相比,使用 DRA 声明的 Pod 对这些组件所需的 API 服务器调用次数、内存和 CPU 利用率都有所增加。此外,DRA 驱动程序和 kubelet 等节点本地组件利用 DRA API 在 Pod 沙箱创建时分配硬件请求。特别是在集群节点众多、或部署大量频繁使用 DRA 定义的资源声明的工作负载的大规模环境中,集群管理员应配置相关组件以应对增加的负载。
组件调优不当可能会导致直接或连锁效应,从而在 Pod 生命周期中产生不同的症状。如果 `kube-scheduler` 组件的 QPS 和 Burst 配置过低,调度器可能会快速为 Pod 识别合适的节点,但需要更长时间才能将 Pod 绑定到该节点。对于 DRA,在 Pod 调度期间,`kube-controller-manager` 中 client-go 配置的 QPS 和 Burst 参数至关重要。
调整集群的具体值取决于多种因素,例如节点/Pod 数量、Pod 创建速率、变更率,即使在非 DRA 环境中也是如此;有关更多信息,请参阅 SIG 可伸缩性 README 中关于 Kubernetes 可伸缩性阈值。在对启用 DRA 的 100 节点集群进行的规模测试中,涉及 720 个长期运行的 Pod(90% 饱和度)和 80 个变更 Pod(10% 变更,10 次),作业创建 QPS 为 10,`kube-controller-manager` QPS 可以低至 75,Burst 可以低至 150,以满足非 DRA 部署的等效指标目标。在此下限,观察到客户端限速器被触发足以保护 API 服务器免受爆发式流量影响,同时又足够高,使得 Pod 启动 SLO 不受影响。虽然这是一个很好的起点,但您可以通过监控以下指标,更好地了解如何调整对部署中 DRA 性能影响最大的不同组件。有关 Kubernetes 中所有稳定指标的更多信息,请参阅 Kubernetes Metrics Reference。
kube-controller-manager
指标
以下指标密切关注由 `kube-controller-manager` 组件管理的内部 ResourceClaim 控制器。
- 工作队列添加速率:监控
sum(rate(workqueue_adds_total{name="resource_claim"}[5m]))
以衡量向 ResourceClaim 控制器添加项目的速度。 - 工作队列深度:跟踪
sum(workqueue_depth{endpoint="kube-controller-manager", name="resource_claim"})
以识别 ResourceClaim 控制器中的任何积压。 - 工作队列工作时长:观察
histogram_quantile(0.99, sum(rate(workqueue_work_duration_seconds_bucket{name="resource_claim"}[5m])) by (le))
以了解 ResourceClaim 控制器处理工作的速度。
如果您遇到工作队列添加速率低、工作队列深度高和/或工作队列工作时长高的情况,这表明控制器性能不佳。请考虑调整 QPS、突发和 CPU/内存配置等参数。
如果您遇到工作队列添加速率高、工作队列深度高,但工作队列工作时长合理的情况,这表明控制器正在处理工作,但并发性可能不足。并发性在控制器中是硬编码的,因此作为集群管理员,您可以通过降低 Pod 创建 QPS 来进行调整,从而使资源声明工作队列的添加速率更易于管理。
kube-scheduler
指标
以下调度器指标是聚合所有已调度 Pod(不仅仅是使用 DRA 的 Pod)性能的高级指标。需要注意的是,端到端指标最终会受到 `kube-controller-manager` 在大量使用 ResourceClaimTemplates 的部署中创建 ResourceClaim 的性能的影响。
- 调度器端到端时长:监控
histogram_quantile(0.99, sum(increase(scheduler_pod_scheduling_sli_duration_seconds_bucket[5m])) by (le))
。 - 调度器算法延迟:跟踪
histogram_quantile(0.99, sum(increase(scheduler_scheduling_algorithm_duration_seconds_bucket[5m])) by (le))
。
kubelet
指标
当绑定到节点的 Pod 必须满足 ResourceClaim 时,kubelet 会调用 DRA 驱动程序的 `NodePrepareResources` 和 `NodeUnprepareResources` 方法。您可以通过 kubelet 的视角使用以下指标观察此行为。
- Kubelet NodePrepareResources:监控
histogram_quantile(0.99, sum(rate(dra_operations_duration_seconds_bucket{operation_name="PrepareResources"}[5m])) by (le))
。 - Kubelet NodeUnprepareResources:跟踪
histogram_quantile(0.99, sum(rate(dra_operations_duration_seconds_bucket{operation_name="UnprepareResources"}[5m])) by (le))
。
DRA kubeletplugin 操作
DRA 驱动程序实现了 kubeletplugin
包接口,该接口为底层的 gRPC 操作 `NodePrepareResources` 和 `NodeUnprepareResources` 提供了自己的指标。您可以通过内部 kubeletplugin 的角度使用以下指标观察此行为。
- DRA kubeletplugin gRPC NodePrepareResources 操作:观察
histogram_quantile(0.99, sum(rate(dra_grpc_operations_duration_seconds_bucket{method_name=~".*NodePrepareResources"}[5m])) by (le))
。 - DRA kubeletplugin gRPC NodeUnprepareResources 操作:观察
histogram_quantile(0.99, sum(rate(dra_grpc_operations_duration_seconds_bucket{method_name=~".*NodeUnprepareResources"}[5m])) by (le))
。