目录
Please enable Javascript to view the contents

K8s设备插件-DRA动态资源分配

 ·  ☕ 4 分钟

系列导航

本系列介绍 K8s 中 Device Plugin 机制及其演进方向 DRA,覆盖 GPU 管理等 AI 场景。

① GPU基础 → ② Device Plugin → ③ 开发Plugin → ④ 多设备/AI场景 → ⑤ DRA

顺序文章定位
GPU 管理基础基础——NVIDIA GPU、CUDA、MIG、vGPU
Device Plugin 详解核心——机制原理、gRPC 接口、生命周期、部署
编写自定义 Device Plugin扩展——FPGA、RDMA、ASIC 等自定义设备接入
多设备管理与 AI 场景进阶——GPU + RDMA + NVMe 组合调度
本篇 - DRA 动态资源分配演进——K8s 1.26+ 新一代资源分配机制

重要

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 PluginDRA
分配粒度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 启动

4.2 Immediate 流程

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 成熟

参考链接

分享

Hex
作者
Hex
CloudNative Developer