Appearance
Kubernetes GPU 资源调度
状态:入门理解 · 更新于 2026-09-14
Kubernetes 默认并不理解 GPU 的驱动、显存或拓扑。它通过 Device Plugin 把 GPU 暴露为扩展资源,再由调度器完成容量匹配,由 Kubelet 在容器启动前分配具体设备。
调度链路
text
GPU / 驱动
↓ 发现设备、健康检查
NVIDIA Device Plugin
↓ 向 Kubelet 注册并上报 nvidia.com/gpu
Node.status.capacity / allocatable
↓
Scheduler 选择有可用 GPU 的节点
↓
Kubelet 调用 Allocate,容器运行时注入设备与环境
↓
Pod 使用被分配的 GPUDevice Plugin 负责设备发现、健康状态和分配时需要的运行时信息;默认调度器主要看到的是扩展资源数量,并不会自动根据显存余量或 NVLink 拓扑做最优放置。
最小 Pod 示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: cuda-check
spec:
restartPolicy: Never
containers:
- name: cuda-check
image: nvidia/cuda:12.6.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1GPU 这类扩展资源不能超卖,也不能写成小数。Kubernetes 允许只在 limits 中声明 GPU;此时该值同时作为 request。若 requests 和 limits 都填写,两者必须相等。
从请求到落卡
1. 节点准备
节点需要兼容的 NVIDIA 驱动、容器运行时配置和 Device Plugin。生产环境通常使用 GPU Operator 管理驱动、Container Toolkit、Device Plugin、DCGM Exporter 等组件,但是否交给 Operator 管理取决于现有节点生命周期方案。
2. 资源上报
插件向 Kubelet 注册后,节点会出现类似下面的资源:
text
Capacity:
nvidia.com/gpu: 8
Allocatable:
nvidia.com/gpu: 8插件认为不健康的设备不应继续出现在可分配集合中。若 Capacity 正常而 Allocatable 异常,需要同时检查插件日志、Kubelet 和节点状态。
3. 调度过滤
调度器检查 Pod 请求与节点剩余扩展资源,并叠加 nodeSelector、Affinity、Taint/Toleration、优先级等约束。GPU 数量满足不代表拓扑最优;跨 NUMA、跨 PCIe Root Complex 或跨 NVLink Island 的放置需要额外策略。
4. 设备分配
Pod 落到节点后,Kubelet 调用插件的 Allocate,再由容器运行时把对应设备、挂载和环境注入容器。业务容器不应依赖宿主机上的“GPU 0”就是固定物理卡,应使用运行时提供的可见设备集合。
共享与切分方式
| 方式 | 资源粒度 | 隔离特点 | 适用场景 |
|---|---|---|---|
| 整卡 | 1 张物理 GPU | 边界清晰、配置简单 | 训练、稳定性能任务 |
| MIG | 硬件实例 | 具备显存和计算资源隔离 | 支持 MIG 的数据中心 GPU、小模型推理 |
| Time-Slicing | 多工作负载分时共享 | 不提供 MIG 同等级的显存与故障隔离 | 低利用率、可容忍干扰的任务 |
共享策略会改变资源名或副本数量,必须让监控、配额和用户文档采用同一口径。声明了多个“共享 GPU”资源,不代表显存也被硬隔离。
生产调度还缺什么
默认调度只解决“有没有卡”,AI 集群通常还需要:
- 队列、配额、公平共享、优先级和抢占;
- Gang Scheduling,避免分布式任务只启动一部分 Worker;
- GPU 型号、显存容量、互联拓扑和 NUMA 感知;
- 故障节点隔离、任务重试与容量回收;
- 利用率、显存、功耗和队列等待时间的可观测性。
Volcano、Kueue 或自定义 Scheduler Plugin 可以承接其中一部分能力,但应先明确任务模型和调度目标,再选择组件。
排查清单
kubectl describe node是否出现nvidia.com/gpu。- Device Plugin Pod、Kubelet 和容器运行时是否健康。
- Pending Pod 的 Events 是资源不足,还是 Affinity、Taint 或配额不满足。
- Pod 内
nvidia-smi与 CUDA Runtime 是否正常。 - 实际 GPU、NUMA、PCIe/NVLink 拓扑是否符合预期。
- Pod 退出后资源是否被 Kubelet 正常回收。
信息来源
- Kubernetes:Schedule GPUs
- Kubernetes Device Plugin Framework
- NVIDIA Kubernetes Device Plugin
- NVIDIA GPU Operator Documentation
延伸阅读
更新日志
- 2026-09-14:建立 Device Plugin、调度与设备分配的完整链路。