一、背景
在 Kubernetes 中,Device Plugin 是一种标准机制,用于向集群注册和管理特殊硬件资源(GPU、FPGA、RDMA 等)。
NVIDIA Device Plugin 是 NVIDIA 官方实现的 GPU 资源管理插件,会在GPU节点运行Daemonset Pod,负责:
- 向 kubelet 报告节点上可用的 GPU
- 响应 Pod 对 GPU 的资源请求
- 在容器启动时注入 GPU 设备节点和相关运行时配置 如果你在 Pod 里写了:
resources:
limits:
nvidia.com/gpu: 1
那么 kubelet 会通过 Device Plugin 来完成 GPU 分配和容器注入。
源码仓库
二、工作原理
2.1 Kubernetes Device Plugin 框架
Kubernetes 定义了 Device Plugin API(gRPC 接口),主要包含几个方法:
- ListAndWatch:向 kubelet 报告当前节点的 GPU 列表及健康状态
- Allocate:当 Pod 调度到节点时,kubelet 调用该方法分配 GPU
- PreStartContainer(可选):在容器启动前执行额外初始化 NVIDIA Device Plugin 就是这个 API 的一个实现。
2.2 工作流程
以一个 Pod 请求 1 张 GPU 为例:
- 注册资源
Device Plugin 启动后,通过 gRPC 向 kubelet 注册nvidia.com/gpu资源类型。 - 汇报可用 GPU
调用ListAndWatch,上报节点上 GPU 的 UUID、健康状态。 - 分配 GPU
当 Pod 被调度到该节点,kubelet 调用Allocate(),Device Plugin 选择一个可用 GPU,并返回分配信息(环境变量、挂载、设备列表等)。 - 容器启动
kubelet 将分配信息写入容器 spec,容器运行时(containerd / CRI-O / Docker)据此注入/dev/nvidia*设备,更新 cgroupdevices.allow,容器即可访问 GPU。
部署
节点需要先部署并配置好nvidia-container-toolkit
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvdp nvdp/nvidia-device-plugin \
--namespace nvidia-device-plugin \
--create-namespace
验证
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
restartPolicy: Never
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 GPU
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
EOF
# 会显示一个GPU
kubectl exec -it gpu-pod -- nvidia-smi