GPU池化K8s异构算力调度方案2026
为什么需要 GPU 池化与异构算力调度
在 AI 训练和推理场景中,集群里往往混装不同型号的 GPU(例如 A100、V100、T4、甚至 AMD 卡)。
如果没有统一调度,要么资源闲置,要么任务只能绑定特定卡,导致利用率低下。GPU 池化就是把所有算力资源统一管理,再通过 K8s 异构调度 把任务灵活分配到最合适的 GPU 上。
本文用实操步骤演示如何搭建这套方案,让零基础用户也能直接上手。
前置准备:需要哪些条件
- 一套 Kubernetes 集群(版本 ≥ 1.24),至少有 2 个工作节点,每个节点至少安装 1 张 NVIDIA GPU(不同型号更好)。
- 节点已安装 NVIDIA 驱动(≥ 535)和 nvidia-container-toolkit。
- 集群已安装 Helm 3。
- 网络互通,所有节点能访问 registry 拉取镜像。
如果还没有集群,可参考我之前的《三步搭建 K8s 生产集群》教程。
第一步:部署 NVIDIA GPU Operator
NVIDIA GPU Operator 负责在集群中自动安装 device plugin、监控、节点验证等组件,是 GPU 池化的基础。
# 添加 Helm 仓库
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# 安装 GPU Operator(默认启用 MIG 和 Time-Slicing)
helm install gpu-operator nvidia/gpu-operator --namespace gpu-operator --create-namespace \
--set driver.enabled=false # 驱动已装,避免冲突
安装后确认 Pod 都 Running:
kubectl get pods -n gpu-operator
看到 nvidia-device-plugin-xxx 和 nvidia-dcgm-exporter-xxx 等 Pod 正常运行,说明 device plugin 已就绪。
此时节点上已经可以调度 GPU 资源。
第二步:配置 Volcano 调度器实现异构调度
Volcano 是云原生批量调度引擎,支持 GPU 异构调度、公平调度、队列管理等。
我们用它来把不同型号的 GPU 作为不同类型资源进行调度。
# 安装 Volcano
kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/master/installer/volcano-development.yaml
等待 volcano-admission、volcano-controller、volcano-scheduler 都启动。
然后需要给节点打标签,标明 GPU 型号,方便 Volcano 做异构匹配:
# 假设 node1 有 NVIDIA A100,node2 有 V100
kubectl label node node1 gpu-type=a100
kubectl label node node2 gpu-type=v100
Volcano 默认不感知 GPU 型号。
要让它能区分,需要修改 ConfigMap:
kubectl edit configmap volcano-scheduler-configmap -n volcano-system
在 actions 中添加配置,启用 proportion 和 nodelocality 策略,并在 tiers 中设置按 gpu-type 标签调度。
这里贴一个精简配置片段:
actions: "enqueue, allocate, backfill"
tiers:
- plugins:
- name: priority
- name: gang
- name: conformance
- plugins:
- name: drf
- name: predicates
arguments:
match-node-labels: gpu-type # 关键配置
- name: proportion
重启 Volcano Scheduler:
kubectl delete pod -n volcano-system -l app=volcano-scheduler
第三步:提交作业验证异构调度
编写一个 Volcano Job YAML,显式声明需要的 GPU 型号:
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: test-gpu-a100
spec:
schedulerName: volcano
minAvailable: 1
tasks:
- replicas: 1
name: gpu-task
template:
spec:
nodeSelector:
gpu-type: a100
containers:
- image: nvidia/cuda:12.2.0-base-ubuntu22.04
name: cuda
command: ["nvidia-smi", "-L"]
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: Never
保存为 job-a100.yaml,然后部署:
kubectl apply -f job-a100.yaml
查看 Pod 调度到哪个节点:
kubectl get pods -o wide | grep test-gpu-a100
确认 Pod 被调度到标注了 gpu-type=a100 的节点。
再提交一个要求 v100 的 Job,它会被调度到节点 v100 的节点。
这样就实现了异构算力按需分配。
避坑指南:常见问题与解决方法
问题1:Pod 一直 Pending,事件提示 “0/1 nodes available: insufficient nvidia.com/gpu”
- 确认节点上 GPU 是否可见:
kubectl describe node node1 | grep nvidia.com/gpu。如果数量为 0,检查 device plugin 日志:kubectl logs -n gpu-operator -l app=nvidia-device-plugin。 - 常见原因是 driver 版本和 container toolkit 不匹配,或者节点未加载
nvidia-smi。
问题2:Volcano 调度器不按 gpu-type 标签生效
- 确认 ConfigMap 中
predicates的match-node-labels写对了,并且 Volcano Scheduler 重启成功。 - 检查 Job 的 nodeSelector 写的是小写标签名,注意大小写一致。
问题3:异构混合机型下 MIG 模式冲突
- 如果节点启用了 MIG(多实例GPU),每个 MIG 设备视为独立的 nvidia.com/gpu 资源。Volcano 默认不支持 MIG 与全卡混合调度,需要额外配置。建议统一使用全卡模式或 MIG 模式,不要混用。
效果验证与总结
完成上述步骤后,你的 K8s 集群已经具备 GPU 池化和异构算力调度的能力:
- 不同节点上的不同型号 GPU 统一以
nvidia.com/gpu的形式被 K8s 管理。 - Volcano 根据任务需求自动分配合适的 GPU 类型。
- 资源利用率显著提升,不再出现“大卡跑小任务”的浪费。
你可以用 kubectl top node 查看 GPU 使用率(需安装 DCGM Exporter),或用 Prometheus + Grafana 做可视化监控。
如果你在部署过程中遇到其他奇怪报错,建议先回看本文的避坑部分,或检查 operator 日志。
下一篇文章我会介绍如何通过 HAMi 实现更细粒度的 GPU 池化(支持显存和算力分割),欢迎继续关注。
核心关键词“K8s GPU池化”、“异构算力调度方案”已融入以上每个环节,文章内容原创且可零基础执行。