首页/AI/大模型部署与运维速查/K8s GPU 调度:device plugin 与资源申请
推理环境与 GPU50 条

K8s GPU 调度:device plugin 与资源申请

Kubernetes 通过 NVIDIA device plugin 把 GPU 暴露为扩展资源 nvidia.com/gpu,调度器按节点可分配数分配;MIG 切片与整卡以不同资源名呈现,申请写法一致。

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-plugin

Pod 申请(清单片段)

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 验证容器内能正常调用显卡,三轮都通过才算节点可用。

易错点

  • 只在 requests 里写 GPU:扩展资源不会生效,Pod 可能拿不到卡
  • 装插件前没确认容器运行时已配置 GPU 支持:插件起来了 Pod 里仍用不了卡
  • 驱动与插件版本不匹配:资源上报异常或调度结果不可预期
  • 整卡与 MIG 资源名混用:调度到已切分节点上的整卡请求会失败,报错信息不直观

数据来源与参考

  • NVIDIA k8s-device-plugin 文档(github.com/NVIDIA/k8s-device-plugin)
  • NVIDIA GPU Operator 文档(docs.nvidia.com/datacenter/cloud-native)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌