技术博客

Kueue 如何管理 AI 训练任务:队列、配额和 GPU 批处理运维

Kueue 是 Kubernetes 原生的作业排队和配额管理系统,适合 AI 训练、批处理和多租户 GPU 集群。本文解释 LocalQueue、ClusterQueue 和排障方法。

KueueGPU配额批处理AI训练

GPU 集群最容易出现的冲突,是每个团队都觉得自己的任务很急。训练任务、批处理任务、评测任务、数据处理任务同时提交,如果没有队列和配额,结果通常是:重要任务排不上、普通任务占满资源、管理员靠手工协调。

Kueue 是 Kubernetes 原生的作业排队和配额管理系统。官方文档描述它负责决定作业什么时候等待、什么时候允许启动、什么时候需要抢占。它不替代 kube-scheduler、cluster-autoscaler 或 Job 控制器,而是在作业进入实际运行前做准入控制。

Kueue 解决什么问题

Kueue 适合管理“会运行完成”的工作负载,例如:

它的核心目标不是把 Pod 调到哪个节点,而是决定“这个任务现在能不能开始占用配额”。

需要理解的对象

Kueue 常见对象包括:

查看命令:

kubectl get localqueues -A
kubectl get clusterqueues
kubectl get resourceflavors
kubectl get workloads -A

如果一个 Job 没有启动,不要只看 Pod。Kueue 可能还没有准入它,所以 Pod 可能还没真正创建。

一个典型 Job 怎么进入队列

用户提交 Job 时,通常要指定队列标签:

metadata:
  labels:
    kueue.x-k8s.io/queue-name: user-queue

Kueue 会根据 LocalQueue 对应的 ClusterQueue,判断当前资源是否够、是否允许借用、是否需要等待或抢占。

对 GPU 集群来说,ClusterQueue 可以定义不同资源池。例如训练队列有固定 GPU 配额,实验队列可以借用空闲资源,但生产推理队列优先级更高。

运维排障思路

第一,确认任务是否进入队列:

kubectl get workloads -n <namespace>
kubectl describe workload <name> -n <namespace>

第二,确认队列和配额:

kubectl describe localqueue <queue> -n <namespace>
kubectl describe clusterqueue <clusterqueue>

第三,确认资源请求是否准确。Kueue 会使用资源 requests,如果用户只写 limits,也可能被当成 requests 处理。

第四,确认是否出现抢占、借用或 partial admission。部分准入能让大任务在资源不足时以较小并行度运行,但要业务能接受。

和 AI 平台有什么关系

AI 训练任务通常不是常驻服务,而是批处理任务。它们需要大量 GPU,但运行完就释放。Kueue 的价值在于把 GPU 从“先到先得”变成“有配额、有队列、有策略”的共享平台。

如果后续结合 HAMi、DRA、Volcano、Koordinator,就可以形成更完整的 AI 基础设施调度栈。

常见问题 FAQ

Kueue 会替代 Kubernetes scheduler 吗?

不会。Kueue 负责准入和队列,真正 Pod 到节点的调度仍由 kube-scheduler 等组件完成。

为什么 Job 提交后没有 Pod?

可能是 Kueue 还没有准入 Workload。先查 workloads,再查 Job 和 Pod。

Kueue 只适合 GPU 吗?

不是。CPU、内存、Pod 数、不同节点池都可以管理。GPU 只是 AI 场景里最典型的稀缺资源。

小团队需要 Kueue 吗?

如果只有一两个用户、少量任务,可以先不用。如果多团队共享 GPU,Kueue 的价值会快速体现。

参考资料