Kubernetes动态资源分配支持异构加速器
来源:17golang原创
时间:2026-11-15 13:00:16 266浏览 收藏
我第一次把这条消息放进升级清单时,差点把它理解成“安装一个新组件,就能自动调度所有 GPU”。实际情况更准确:CNCF 在 2026 年 11 月 10 日的公告中,把 Kubernetes 的工作负载感知调度和 Dynamic Resource Allocation(DRA)列为 AI 基础设施进展;同时,HAMi 进入孵化阶段,负责异构加速器的共享与调度。它们属于同一生态方向,却不是同一个功能开关。
官方地址:https://kubernetes.io/
如果你的集群要混用不同型号 GPU、FPGA 或其他专用设备,DRA 的价值是把“设备属性、可用状态和工作负载声明”拆成可组合对象,让调度器按条件选设备;它不是把旧的设备插件请求语法原样升级,也不会自动替你安装厂商驱动。
这次生态消息到底改变了什么
CNCF 公告提到 Kubernetes 在工作负载感知调度和 DRA 上取得进展,并把 HAMi 的异构加速器共享与调度能力放在同一组 AI 基础设施成果中。对平台团队来说,真正值得关注的是调度模型正在从“节点上有几个某型号资源”转向“这个工作负载需要什么设备属性、容量和配置”。
当前 Kubernetes 官方文档把 DRA 标记为从 v1.35 起稳定的能力;Kubernetes v1.37 的官方更新又说明,DRA Extended Resource 已经进入 GA,可以让传统 extended resource 请求与 DRA 设备匹配。迁移时不要只看新闻标题,应该把 Kubernetes 版本、驱动实现和现有请求方式一起列入变更范围。
公告原文:https://www.cncf.io/announcements/2026/11/10/cncf-hits-major-milestones-with-global-community-growth-record-industry-investment-and-a-new-generation-of-projects-to-build-ai-systems-in-production/
从设备插件到 DRA,几个对象分别负责什么
旧方案通常把设备插件暴露的资源名直接写进 Pod 的 resources.limits。DRA 则把设备目录、筛选条件、申请关系和 Pod 使用关系拆开:
| 对象 | 职责 | 迁移时要问的问题 |
|---|---|---|
| DeviceClass | 给一类设备定义可复用的分类和筛选规则 | 属性是否足以区分显存、架构或互联能力 |
| ResourceClaim | 工作负载声明要申请的设备条件 | Claim 的生命周期是否跟 Pod 或模板一致 |
| ResourceSlice | 驱动向集群公布设备、属性、容量和可分配状态 | 驱动是否能持续提供真实设备状态 |
| Pod | 引用 ResourceClaim 或 ResourceClaimTemplate | 是否仍然绕过调度器写入了 spec.nodeName |

异构设备请求不应只写一个厂商资源名
当工作负载只需要“支持某种计算能力、显存范围和互联属性”的设备时,DRA 可以用结构化参数和 CEL 表达式筛选设备。下面是一个用于说明对象关系的简化 YAML,字段含义应以目标 Kubernetes 版本及设备驱动文档为准;它不是已经在某个集群执行过的结果。
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: inference-accelerator
spec:
devices:
requests:
- name: primary
exactly:
deviceClassName: accelerator.example.com
# 用属性表达需求,避免把某个厂商型号写死在业务 Pod 中。
selectors:
- cel:
expression: device.attributes["accelerator.example.com"].memoryGiB >= 24
---
apiVersion: v1
kind: Pod
metadata:
name: inference-worker
spec:
containers:
- name: worker
image: example/inference-worker:stable
# 容器通过 ResourceClaim 使用已分配设备,不直接猜测节点名称。
resources:
claims:
- name: primary
resourceClaims:
- name: primary
resourceClaimName: inference-accelerator
这段示例有两个重点:一是把设备选择条件放到 Claim 中,二是让 Pod 引用 Claim,而不是用节点名把调度器绕开。真实落地前要检查设备驱动提供的属性名称、API 版本和字段结构,不能把示例中的域名当成现成驱动。

升级前最容易忽略的四个风险
- 版本和驱动不是一回事。DRA API 进入稳定状态,不代表每个厂商驱动都已经支持相同的 DeviceClass、ResourceSlice 或状态字段。先确认控制面版本、节点组件版本和驱动支持矩阵。
- 预绑定 Pod 会绕过正常调度。如果直接设置
spec.nodeName,Pod 可能在 Claim 尚未分配时就被送到节点,最终由 kubelet 反复检查。要固定节点,优先使用能继续经过调度流程的节点选择器。 - DRA 资源目前不能按普通 Pod 资源抢占。官方文档明确提示,正在使用 DRA 设备的 Pod 不能被更高优先级的 Pod 通过抢占直接赶走;容量紧张时要把等待和释放时间纳入队列设计。
- 旧监控指标可能不覆盖新对象。以前只看节点扩展资源数量,迁移后还要观察 ResourceClaim 状态、ResourceSlice 信息和设备健康状态,否则会出现“节点看起来有资源、Claim 却无法分配”的盲区。
我会这样安排一轮灰度迁移
- 先盘点现有设备插件、扩展资源名、节点标签、容器运行时和驱动版本,记录哪些业务真的依赖设备型号,哪些只依赖显存或架构能力。
- 在非生产节点安装支持 DRA 的驱动并观察 ResourceSlice 是否能描述预期设备;这一步只做资源目录和状态检查,不把业务流量切过去。
- 为一类低风险工作负载创建独立 ResourceClaim,验证 Claim 的分配、Pod 调度、设备注入和释放是否闭环。
- 把调度结果、Claim 状态、设备健康、Pod 重启和等待时长纳入同一张回归表,尤其记录设备不可用时的失败原因。
- 只有在灰度完成后,才考虑启用 DRA Extended Resource 或把旧请求逐批迁移;保留回滚路径,不要一次性删除旧设备插件。
我个人更倾向于先让 DRA 管理“属性复杂、型号混杂”的工作负载,继续让简单、成熟的单型号业务使用原有方式。这样能把迁移收益和故障半径控制在可解释范围内。
迁移清单:先确认能不能迁,再决定要不要迁
- 控制面和节点版本是否满足目标 DRA 能力,Feature Gate 或 API 组是否按目标版本处理。
- 设备驱动是否支持 DRA,并能发布准确的设备属性、容量和健康状态。
- DeviceClass 的筛选条件是否描述了业务真正需要的能力,而不是复制硬件商品名。
- ResourceClaim、ResourceClaimTemplate 和 Pod 的命名空间、生命周期与回收策略是否清楚。
- 是否覆盖设备不足、设备损坏、Claim 删除、Pod 重建、节点维护和调度超时等回归场景。
- 是否保留传统请求方式和回滚窗口,且监控、告警、排队策略已经同步调整。
常见问题
DRA 是不是 HAMi 的替代品?
不是。DRA 是 Kubernetes 的资源分配与调度能力;HAMi 是围绕异构加速器共享和调度的生态项目。二者可以在同一 AI 基础设施版图中出现,职责和安装方式仍需分别阅读官方文档。
用了 DRA 就能自动支持所有 GPU 吗?
不能。还需要兼容的设备驱动、节点上的设备、正确的 DeviceClass/Claim 定义,以及与目标 Kubernetes 版本匹配的控制面配置。
现有 extended resource 请求必须马上改掉吗?
不必。Kubernetes v1.37 的 DRA Extended Resource 已进入 GA,但是否迁移取决于驱动支持、设备模型复杂度和回滚要求。先盘点和灰度,比一次性替换更稳妥。
参考资料:https://kubernetes.io/docs/concepts/resource-management/dynamic-resource-allocation/;https://kubernetes.io/blog/2026/09/03/kubernetes-v1-37-dra-updates/;https://www.cncf.io/announcements/2026/11/10/cncf-hits-major-milestones-with-global-community-growth-record-industry-investment-and-a-new-generation-of-projects-to-build-ai-systems-in-production/
-
Golang · Go教程 | 5个月前 | 性能优化 · kubernetes · Go教程 · 生产实践 · Go1.25 · golang Go Kubernetes 性能优化 GOMAXPROCS473 收藏
-
Golang · Go教程 | 3个月前 | 容器 · go · 性能 · kubernetes · 运行时 · Kubernetes GOMAXPROCS cgroup Go 1.25 容器 CPU 限额438 收藏
-
318 收藏
-
353 收藏
-
Golang · Go问答 | 4个月前 | 云原生 · golang · 性能优化 · kubernetes · Go HPA不扩容 Kubernetes HPA CPU resources requests HPA并发指标 Go服务扩缩容111 收藏
-
251 收藏
-
327 收藏
-
184 收藏
-
479 收藏
-
469 收藏
-
323 收藏
-
157 收藏
-
275 收藏
-
446 收藏
-
科技周边 · 业界新闻 | 16小时前 | 云原生 · kubernetes · 网络安全 · tls Kubernetes Gateway API SNI BackendTLSPolicy SubjectAltNames233 收藏
-
201 收藏
-
184 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习