Nvidia Device Plugin入门一

110 阅读2分钟

一、背景

在 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 为例:

  1. 注册资源
    Device Plugin 启动后,通过 gRPC 向 kubelet 注册 nvidia.com/gpu 资源类型。
  2. 汇报可用 GPU
    调用 ListAndWatch,上报节点上 GPU 的 UUID、健康状态。
  3. 分配 GPU
    当 Pod 被调度到该节点,kubelet 调用 Allocate(),Device Plugin 选择一个可用 GPU,并返回分配信息(环境变量、挂载、设备列表等)。
  4. 容器启动
    kubelet 将分配信息写入容器 spec,容器运行时(containerd / CRI-O / Docker)据此注入 /dev/nvidia* 设备,更新 cgroup devices.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