Skip to content

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 使用被分配的 GPU

Device 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: 1

GPU 这类扩展资源不能超卖,也不能写成小数。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 可以承接其中一部分能力,但应先明确任务模型和调度目标,再选择组件。

排查清单 ​

  1. kubectl describe node 是否出现 nvidia.com/gpu。
  2. Device Plugin Pod、Kubelet 和容器运行时是否健康。
  3. Pending Pod 的 Events 是资源不足,还是 Affinity、Taint 或配额不满足。
  4. Pod 内 nvidia-smi 与 CUDA Runtime 是否正常。
  5. 实际 GPU、NUMA、PCIe/NVLink 拓扑是否符合预期。
  6. Pod 退出后资源是否被 Kubelet 正常回收。

信息来源 ​

延伸阅读 ​

更新日志 ​

  • 2026-09-14:建立 Device Plugin、调度与设备分配的完整链路。

学习、验证、修订,持续构建 AI Infra 知识地图。