版本:下一个
Device Plugin 与 DRA
Kubernetes 有两种把设备交给 Pod 的方式:device plugin API 和动态资源分配(DRA)。经典 HAMi 使用 device plugin,HAMi-DRA 使用 DRA。
Device plugin
device plugin 以 DaemonSet 的形式运行在每个 GPU 节点上,负责三件事:
- 注册:以
nvidia.com/gpu这样的资源名向 kubelet 注册。 - 上报:上报设备列表,每个设备带 ID 和健康状态。kubelet 把设备数量写进节点的 capacity。
- 分配:Pod 在节点上启动时,kubelet 调用插件,插件返回容器需要的设备文件、挂载和环境变量。
调度器看到的只是一个整数。它只知道节点有 4 张 GPU,不知道它们的显存和型号。整卡申请用这些信息就够了,但要放下一个 3000 MiB 的切片,调度器还需要更多信息。
HAMi 用两种方式补上这部分信息:
- HAMi device plugin 把每张卡上报
deviceSplitCount次(默认 10),一张卡最多可以分给 10 个 Pod。只有一张 GPU 的节点会显示nvidia.com/gpu: 10。 - 它把每张卡的详细信息写进节点注解
hami.io/node-nvidia-register,包括 UUID、显存、算力、型号、NUMA 节点和健康状态。HAMi 调度器读取这个注解来选卡。
调度器和 device plugin 如何通过注解传递调度结果,见协议设计。
动态资源分配
DRA 在 Kubernetes v1.34 进入 GA。它用以下 API 对象描述设备和申请:
| 对象 | 作用 |
|---|---|
ResourceSlice | 由 DRA 驱动发布,列出每个设备及其属性。 |
DeviceClass | 按属性筛选出的一组设备。 |
ResourceClaim | Pod 对设备的申请,类似 PersistentVolumeClaim。 |
ResourceClaimTemplate | Pod 引用的模板,Kubernetes 据此为每个 Pod 创建一个 ResourceClaim。 |
调度器直接从 ResourceSlice 读取设备属性,不需要额外的注解。
HAMi-DRA 沿用 HAMi 的 Pod 写法。它的 webhook 把 nvidia.com/gpu、nvidia.com/gpumem 和 nvidia.com/gpucores 转换成 ResourceClaim。容器内的限制仍然由 HAMi-Core 执行,所以两种模式的隔离方式相同。
如何选择
HAMi-DRA 需要 Kubernetes v1.34 或更高版本,开启 DRA Consumable Capacity 特性门控,并在容器运行时中启用 CDI。不满足这些条件的集群,使用经典 HAMi。完整对比见选择你的方案。