系列导航
本系列介绍 K8s 中 Device Plugin 机制及其演进方向 DRA,覆盖 GPU 管理等 AI 场景。
① GPU基础 → ② Device Plugin → ③ 开发Plugin → ④ 多设备/AI场景 → ⑤ DRA
重要
DRA(Dynamic Resource Allocation)是 K8s 1.26 Alpha、1.30+ Beta 的新一代资源分配机制,解决 Device Plugin 的固有问题:设备分配是 Pod 级别的(所有容器共享)、无法在调度阶段感知设备状态、无法跨节点感知拓扑。DRA 通过 ResourceClaim + ResourceClass + 结构化参数实现灵活的设备分配。
1. Device Plugin 的固有问题
| 问题 | Device Plugin 现状 | 影响 |
|---|
| Pod 级别分配 | Allocate 返回的设备被 Pod 所有容器共享 | 多容器 Pod 中无法给特定容器分配特定 GPU |
| 调度前不可知 | 只有 kubelet 调 Allocate 才知道拿到哪个设备 | 调度器无法按设备型号/位置做精细决策 |
| 不可跨节点感知 | 每个节点独立运行 Device Plugin | 无法跨节点做设备拓扑优化 |
| 抢占困难 | 设备分配后无法清理 | GPU Pod 抢占需要完整删除重调度 |
| 不适配多 NUMA | 不支持多 NUMA 节点设备联合分配 | 大模型训练需要 GPU 跨 NUMA 绑定 |
2. DRA 核心概念
2.1 ResourceClaim(资源声明)
ResourceClaim 是 DRA 的核心对象,表示"我需要什么资源":
1
2
3
4
5
6
7
8
9
10
11
| apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClaim
metadata:
name: gpu-claim
spec:
resourceClassName: nvidia-gpu
allocationMode: WaitForFirstConsumer
parametersRef:
apiGroup: gpu.resource.k8s.io
kind: GpuAllocation
name: a100-40gb
|
2.2 ResourceClass(资源类)
类似 StorageClass,定义资源的"类型":
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClass
metadata:
name: nvidia-gpu
driverName: nvidia.resource.k8s.io
parametersRef:
apiGroup: gpu.resource.k8s.io
kind: GpuClassParameters
name: a100-config
---
apiVersion: gpu.resource.k8s.io/v1alpha1
kind: GpuClassParameters
metadata:
name: a100-config
spec:
gpuTypes: ["A100-SXM4-40GB", "A100-PCIE-40GB"]
minMemory: 40960
topologyConstraint: "same-nvswitch"
|
2.3 Pod 引用 ResourceClaim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: v1
kind: Pod
metadata:
name: gpu-training
spec:
containers:
- name: trainer
image: nvidia/cuda:12.0
resources:
claims:
- name: gpu-1
- name: sidecar
image: busybox
resourceClaims:
- name: gpu-1
source:
resourceClaimName: gpu-claim
|
3. DRA vs Device Plugin 对比
| 维度 | Device Plugin | DRA |
|---|
| 分配粒度 | Pod 级别(所有容器共享) | 容器级别(可按容器指定) |
| 调度感知 | 调度器只看数量 | 调度器可感知设备属性、拓扑 |
| 分配时机 | kubelet 在 Pod 创建时分配 | 调度阶段或事后分配 |
| 跨节点 | 仅本节点 | 可跨节点感知 |
| 抢占 | 不干净 | 通过 ResourceClaim 状态控制 |
| 共享 | 不共享 | 支持设备共享 |
| Tainted 设备 | 无支持 | ResourceClaim 支持 unsuitableNodes |
| K8s 版本 | 1.8+(GA) | 1.26(Alpha)、1.30+(Beta) |
Device Plugin 是"插件告诉 kubelet 有什么设备,kubelet 自动分配"。DRA 是"用户声明需要什么资源,调度器 + 控制器协调分配"。后者赋予调度器更多信息和决策权。
4. 分配模式
| AllocationMode | 说明 | 类比 |
|---|
WaitForFirstConsumer | 等 Pod 被调度后再分配 | 类似 StorageClass WaitForFirstConsumer |
Immediate | 创建 ResourceClaim 后立即分配 | 调度器不参与选择 |
4.1 WaitForFirstConsumer 流程
1. 创建 ResourceClaim (WaitForFirstConsumer)
2. 创建 Pod(引用 ResourceClaim)
3. 调度器筛选节点(考虑设备可用性)
4. Pod 调度到 Node-A
5. DRA Controller 在 Node-A 上分配设备
6. kubelet 将设备注入容器
7. Pod 启动
1. 创建 ResourceClaim (Immediate)
2. DRA Controller 立即分配设备
3. ResourceClaim 状态变为 Allocated(含设备信息)
4. 创建 Pod 时调度器考虑已分配设备的节点约束
5. Pod 调度到包含该设备的节点
6. Pod 启动
5. 结构化参数(Structured Parameters)
DRA 支持设备驱动提供结构化参数,调度器可直接理解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClaimParameters
metadata:
name: gpu-params
driverName: nvidia.resource.k8s.io
spec:
devices:
- name: gpu-1
attributes:
nvidia.com/gpu.product: "NVIDIA-A100-SXM4-40GB"
nvidia.com/gpu.memory: "40960"
requests:
- "gpu.resource.k8s.io/sm: 108"
- "gpu.resource.k8s.io/memory: 40Gi"
|
相比 Device Plugin 的 Extended Resource(一个数字),结构化参数让调度器感知设备的属性而不仅是数量。
6. DRA Driver 实现
DRA Driver 替代了 Device Plugin 的角色,但接口完全不同:
1
2
3
4
5
6
7
8
9
10
11
| // DRA Driver 实现 k8s.io/dynamic-resource-allocation 接口
type Driver interface {
// 分配设备
Allocate(ctx context.Context, claim *resourceapi.ResourceClaim, params *resourceapi.ResourceClaimParameters) (*AllocationResult, error)
// 在节点上准备设备(类似 Device Plugin 的 PreStartContainer)
NodePrepareResource(ctx context.Context, claim *resourceapi.ResourceClaim, allocation *AllocationResult) error
// 释放设备
Deallocate(ctx context.Context, claim *resourceapi.ResourceClaim) error
}
|
DRA Driver 通常以 Controller Deployment + Node DaemonSet 形式部署,与 Device Plugin 的部署方式类似。
7. 从 Device Plugin 到 DRA 的迁移
| 阶段 | 做法 |
|---|
| 当前 | Device Plugin 仍然是主流,NVIDIA GPU Operator 主要基于 Device Plugin |
| 过渡期 | Device Plugin + DRA 共存,通过 Feature Gate DynamicResourceAllocation 控制 |
| 未来 | DRA GA 后,新的设备类型优先用 DRA,Device Plugin 仅维护存量 |
1
2
3
| # 启用 DRA(K8s 1.30+)
# kube-apiserver / kube-controller-manager / kube-scheduler / kubelet 都需要
--feature-gates=DynamicResourceAllocation=true
|
8. DRA 的未解决问题
| 问题 | 现状 |
|---|
| GPU 共享 | DRA 1.0 不原生支持 GPU 时间切片或 MIG |
| 与 Device Plugin 共存 | 部分设备可同时通过 Device Plugin 和 DRA 暴露,可能出现竞争 |
| 复杂配置 | ResourceClaim + ResourceClass + Parameters 三层配置比 Device Plugin 更复杂 |
| 驱动生态 | 目前只有少量 DRA Driver(NVIDIA 实验性、Intel GPU),社区驱动不如 Device Plugin 成熟 |
参考链接