Kubernetes v1.36 DRA更新详解

概述

动态资源分配 (DRA) 是 Kubernetes 中管理硬件加速器和特殊资源的核心机制。它通过声明式 API,使平台管理员能够灵活、高效地分配和管理 GPU、FPGA 等专用硬件。在 Kubernetes v1.36 版本中,DRA 迎来了重要更新,包括多项核心特性的成熟(毕业至 Beta/Stable)以及一系列创新功能的引入。这些更新进一步巩固了 DRA 作为 Kubernetes 资源管理标准路径的地位,增强了调度的灵活性、故障处理的可靠性以及资源管理的可观测性,为运行高性能工作负载(如 AI/ML)提供了更强大的基础设施支持。

核心概念

DRA 的核心模型围绕 ResourceClaim 和 ResourceSlice 构建。在 v1.36 中,几个关键特性从概念走向成熟:

  • 优先级列表 (Prioritized list, Stable):允许用户定义设备请求的备选顺序(例如,“首选 H100,但若无可用则回退至 A100”)。调度器将按顺序评估这些请求,显著提升了调度灵活性和资源利用率,是应对硬件异构性的关键工具。
  • 可扩展资源支持 (Extended resource support, Beta):此特性架起了 DRA 与传统扩展资源(extended resources)之间的桥梁。它允许应用开发者通过传统的 Pod 资源字段请求 DRA 管理的资源,使得集群运维团队可以逐步迁移至 DRA,而应用团队则可以按自己的节奏采纳 ResourceClaim API。
  • 可分区设备 (Partitionable devices, Beta):支持将物理硬件(如多实例 GPU)动态切分为更小的逻辑单元进行分配。这使得管理员能安全、高效地在多个 Pod 之间共享昂贵的加速器,避免了资源浪费。
  • 设备污点 (Device taints, Beta):类似于节点的污点与容忍度机制,管理员可以为特定设备打上污点,以阻止常规的 ResourceClaim 分配它们。这可用于隔离故障设备或为特定团队、工作负载预留专用硬件。
  • 设备绑定条件 (Device binding conditions, Beta):该特性允许调度器延迟将 Pod 绑定到节点,直到所需的外部设备资源完全就绪。这通过显式建模资源准备状态,防止了因资源未就绪导致的 Pod 启动失败,使部署过程更加健壮和可预测。
  • 资源健康状态 (Resource health status, Beta):将设备的健康信息直接暴露在 Pod 状态中,为用户和控制器提供了关键的故障可视化能力。支持人类可读的健康信息,简化了硬件故障的诊断流程。

除了毕业的特性,v1.36 还引入了多个面向未来的基础性 Alpha 特性:

  • 工作负载级 ResourceClaim 支持:为大规模 AI/ML 工作负载优化,通过将 ResourceClaim 与 PodGroup 关联,解决了之前共享资源 Pod 数量限制和手动管理负担的瓶颈。
  • 节点可分配资源管理:首次尝试使用 DRA API 管理 CPU 和内存等节点内置资源。这使得用户可以利用 DRA 高级的位置感知、NUMA 感知和优先级语义,对标准计算资源进行极其精细的性能调优。
  • 资源池状态可见性:通过 ResourcePoolStatusRequest API,管理员可以查询设备池的容量快照(总量、已分配、可用、不可用),极大地提升了硬件容量的可观测性,便于集成到监控面板和容量规划工具中。

实践

要利用 v1.36 中 DRA 的新特性,平台工程师需要进行相应的配置和操作。

  1. 启用特性:新的 Beta 和 Alpha 特性需要通过特性门控启用。在 kube-apiserver、kube-scheduler 和 kubelet 的启动参数中设置相应的 --feature-gates。例如,要启用 PartitionableDevices(Beta),通常默认是启用的,但如果是 Alpha 特性如 WorkloadResourceClaims,则需要手动开启:
    --feature-gates=WorkloadResourceClaims=true
  2. 定义优先级列表:在创建 ResourceClaim 时,在 spec.resources 中使用 specifiers 列表来指定设备请求的优先级顺序。调度器将按照此列表依次尝试分配。
  3. 使用扩展资源过渡:在 Pod 规约中,可以继续使用 resources.requests 来请求 DRA 管理的资源(如 nvidia.com/gpu),同时集群的 DRA 驱动会响应这些请求。这允许在不修改应用的情况下逐步迁移到 DRA。
  4. 查询资源池状态:运维人员可以创建一个 ResourcePoolStatusRequest 对象来获取特定驱动管理的设备池状态,该状态可用于构建资源利用率仪表盘。
  5. 发现设备元数据:对于使用了 DRA 驱动的容器,驱动会按照标准协议在容器内已知路径(通常是 /etc/dra/device-metadata/<resource-slice-name>.json)挂载包含设备详细信息(如 PCI 地址)的 JSON 文件。应用程序可以直接读取此文件来发现设备属性,无需与 Kubernetes API 交互。

SRE 要点

Kubernetes v1.36 的 DRA 更新对 SRE 实践有着深远的影响,特别是在提升系统可靠性、增强可观测性和优化事件响应方面。

  • 可靠性与故障管理:设备污点 和 设备绑定条件 特性直接增强了系统的鲁棒性。SRE 可以主动隔离有故障的硬件,防止新工作负载调度到已知有问题的设备上,同时确保工作负载只在设备完全就绪后才启动,减少了因设备问题导致的部署失败和级联故障。这有助于维持更低的错误预算消耗率。
  • 可观测性:资源健康状态 特性将设备故障信息直接推送到 Pod 状态,这是可观测性的重大进步。SRE 可以更快速地定位到是哪个 Pod 因为哪个具体设备故障而受到影响,从而缩短 MTTR(平均恢复时间)。资源池状态 则提供了集群整体硬件资源容量的宏观视图,是容量规划和性能评估的关键数据源。
  • 事件响应与运维:优先级列表 和 可分区设备 提升了资源利用的弹性和效率,减少了在资源紧张时的调度失败事件。当发生硬件故障时,优先级列表可能引导调度器自动将工作负载迁移到备用设备上,辅助故障自愈。SRE 需要更新其 runbook,以包含如何利用 DRA API 进行设备健康查询和故障设备打污点的操作步骤。
  • 最佳实践与反模式:
    • 最佳实践:将 DRA 作为管理 GPU 等加速器的首选方式;利用优先级列表定义灵活的资源请求策略;通过设备污点和容忍度实施精细化的硬件生命周期管理。
    • 常见反模式:在应用层硬编码特定设备型号或路径,这会导致调度僵化和迁移困难;忽略利用 DRA 提供的健康状态信息来构建自动化的告警和恢复流程;在启用新的 Alpha 特性前未进行充分的测试评估。
  • 相关指标 (SLI/SLO/SLA):DRA 的更新直接影响以下指标:
    • 调度成功率 (SLI):更灵活的优先级列表和绑定条件能减少因“找不到合适设备”或“设备未就绪”导致的调度失败。
    • 工作负载启动延迟 (SLI):绑定条件特性可能略微增加从 Pod 提交到运行的延迟,但避免了无效启动,净效果可能是正面的。
    • 资源利用率 (SLO/SLA):可分区设备和优先级列表能显著提高昂贵硬件(如 GPU)的利用率,这是平台成本和效率的关键 SLI。
    • 故障恢复时间 (SLO):设备健康状态的可视化直接有助于缩短硬件故障的影响时间。

要深入了解或参与 DRA 的发展,可以加入 #wg-device-management Slack 频道并关注其会议。SRE 团队应评估将现有 Device Plugin 驱动迁移到 DRA 框架的路径,以享受其带来的可靠性、灵活性和可观测性收益。