简单说:不难入门,但要做到“稳定、高效、可控”并不容易。Kubernetes 调度 GPU 属于“看起来简单、坑在细节”的那类问题。
下面按层次给你一个真实体感说明。
一句话结论
- 能跑起来:不难(只要驱动和插件装对)
- 跑得好、跑得稳、跑得省:难
- 大规模 / 多租户 / 混合负载:相当难
一、为什么“看起来不难”
K8s 对 GPU 的支持已经比较成熟,核心流程是:
- 节点装好 GPU 驱动
- 安装 GPU 设备插件(Device Plugin)
- NVIDIA 官方:
k8s-device-plugin
- Pod 里声明资源
resources:
limits:
nvidia.com/gpu: 1
- 调度器自动把 Pod 调度到有 GPU 的节点
✅ 到这一步,单机 / 单任务基本没问题
二、为什么“实际上并不简单”
1️⃣ 驱动和环境是最大坑
- 驱动版本、CUDA 版本、容器运行时(containerd / docker)要匹配
- 内核升级、节点重启经常导致 GPU 不可用
- 某些 OS(尤其是国产系统)支持不完整
很多公司 GPU 集群 30% 的故障来自驱动 / 内核
2️⃣ GPU 是“稀缺资源”,调度很痛苦
K8s 默认调度器:
结果:
- A100 和 T4 被当成一样的 GPU
- 小模型占大卡
- 大模型被碎片化显存卡住
✅ 需要额外机制:
- Node Label(型号、显存)
- Node Affinity
- 自定义调度器(如 volcano / kueue)
3️⃣ 显存 ≠ GPU 数量
K8s 默认:
现实问题:
- 一个 80GB A100,只跑 10GB 模型
- 另一张卡 70GB 被浪费
✅ 解决方式:
- MIG(A100)
- 时间分片(time-slicing)
- 第三方调度器
4️⃣ 多租户和隔离非常难
GPU 天然:
问题包括:
✅ 需要:
- 配额
- 优先级
- Gang scheduling
- 资源对账与回收
5️⃣ 监控、回收、异常处理很痛苦
- 容器退出 ≠ GPU 释放干净
- 僵尸进程占用显存
- kubelet 不一定能感知
需要额外建设:
三、不同场景难度对比
| 场景 | 难度 |
|---|
| 单节点 / 单任务 | ⭐ |
| 小规模训练集群 | ⭐⭐ |
| 推理服务调度 | ⭐⭐⭐ |
| 多租户 GPU 平台 | ⭐⭐⭐⭐ |
| 大模型训练 + 推理混部 | ⭐⭐⭐⭐⭐ |
四、如果你现在要上手,推荐路径
✅ 初学 / 小规模
- 用 NVIDIA 官方 Device Plugin
- 只做简单
nvidia.com/gpu: 1 - 节点少、任务简单
✅ 生产 / 中大规模
- 使用 volcano / kueue
- 明确 GPU 型号 label
- 推理 & 训练分队列
- 必须上 DCGM 监控
五、要不要自己“折腾调度”
| 情况 | 建议 |
|---|
| 只用训练 | 不用搞太复杂 |
| 对外提供 GPU 服务 | 必须做调度增强 |
| 有 SLA / 成本压力 | 自研或增强调度是长期工作 |
总结一句话
Kubernetes 调度 GPU:入门不难,做好很难,做大更难。
如果你愿意,可以告诉我:
- 你是 推理 / 训练 / 混部?
- GPU 是 几张 / 什么型号?
- 是 内部用还是对外平台?
我可以直接给你一个现实可用的方案,而不是“教科书式答案”。