device plugin 是什么
Kubernetes 通过 NVIDIA device plugin 把节点上的 GPU 暴露为扩展资源 nvidia.com/gpu,调度器按节点可分配数量分配给 Pod。整卡与 MIG 切片以不同资源名呈现,但申请写法一致,都写在 limits 里。插件只负责发现与上报设备,不负责安装驱动。
基本信息
| 资源名 | 整卡 nvidia.com/gpu;MIG 切片以 nvidia.com/mig-<档位> 形式暴露 |
|---|---|
| 申请位置 | 写在 limits 中,扩展资源属不可压缩资源 |
| 安装方式 | Helm 或清单直接部署 DaemonSet 形态的插件 |
| 前置条件 | 节点已装驱动,容器运行时已配置 GPU 支持 |
| 整体纳管 | GPU Operator 可把驱动、容器运行时与插件一起管理 |
典型使用场景
- 新集群接入 GPU:装好插件后确认节点可分配资源里出现 GPU
- 排查 Pod 长期 Pending:区分是调度失败还是容器启动失败
- MIG 切片调度:把一张卡切成多个切片分别分配给不同租户
- 升级驱动:按先驱动后插件的顺序操作,避免资源上报异常
- 多副本部署:副本数受节点 GPU 总量限制,扩容前先看可分配余量
安装与核对可分配资源
安装与核对可分配资源
helm repo add nvidia https://nvidia.github.io/k8s-device-plugin
helm install nvidia-device-plugin nvidia/nvidia-device-plugin
# 确认节点上报了 GPU 资源
kubectl get node <节点名> -o json | jq '.status.allocatable["nvidia.com/gpu"]'
# 插件自身是否正常(DaemonSet 在每个 GPU 节点上跑一个 Pod)
kubectl get pods -A | grep -i device-pluginPod 申请(清单片段)
Pod 申请(清单片段)
resources:
limits:
nvidia.com/gpu: 1 # GPU 属不可压缩资源,必须写在 limits
# MIG 切片场景:资源名换成对应的切片类型
# nvidia.com/mig-<档位>: 1资源名与形态对照
| 形态 | 资源名 | 说明 |
|---|---|---|
| 整卡 | nvidia.com/gpu | 一个 Pod 独占一张卡 |
| MIG 切片 | nvidia.com/mig-<档位> | 切片内显存与故障隔离 |
| GPU Operator 纳管 | 同上 | 驱动、运行时与插件统一由 Operator 管理 |
插件只上报设备、不装驱动:节点驱动缺失或版本不匹配时,可分配资源里根本不会出现 GPU,此时查容器运行时与驱动,而不是查插件日志。
整卡与切片是不同资源名:把整卡任务调度到已经切分的卡上会拿不到设备,规划时要明确节点以哪种形态提供算力。
验收新节点时按三步走:先看驱动是否就绪,再看可分配资源里有没有 GPU,最后跑一个最小 Pod 验证容器内能正常调用显卡,三轮都通过才算节点可用。