Kueue:配额、准入与资源治理的控制面

草稿

控制面治理是 GPU 平台化的核心,Kueue 让资源分配变得有序、可预测、可审计。

为什么需要 Kueue:从“能跑”到“能治理”

在单团队、小规模的 GPU 集群中,通常只需关注任务能否被调度:安装好 Device Plugin,配置 nvidia.com/gpu: 1,剩下交给调度器即可。但在多团队、多租户、混合负载(训练/推理/批处理/交互)的实际场景下,问题会迅速从“能不能跑”转变为“如何有秩序地跑”。

常见的治理需求包括:

  • 谁能用?(团队/项目/环境的授权边界)
  • 何时能用?(排队、公平、抢占、SLA)
  • 能用多少?(配额、借用、上限、突发)
  • 用完怎么归还与统计?(资源承诺、计量、对账)

如果缺乏“秩序与契约”,平台会反复出现以下混乱现象:

  • 某团队临时加任务导致集群资源被挤爆,其他团队即使有业务优先级也无法及时调度。
  • 资源被“先到先得”长期占用,高价值或紧急作业只能等待。
  • 表面上各团队未超配额,实际 GPU 却被长期占用,平台方难以解释资源紧张的原因。

Kueue 的核心价值在于将“调度之前的治理”产品化:在资源真正分配到节点和设备之前,先完成资源的准入(admission)承诺(reservation/assignment),让所有人对“可用资源”和“排队规则”形成共同预期。

Kueue 在系统中的位置:决定“谁先拿到切分后的资源”

在平台架构中,数据平面负责设备发现、切分/虚拟化(如 MIG、共享方案)、隔离、可观测与计量;控制面则关注队列、配额、优先级、公平性、准入与治理。

Kueue 属于控制面组件。它不负责将一张 GPU 切分为 MIG,也不直接限制容器的 SM 或显存,这些属于数据平面和驱动栈的范畴。Kueue 关注的是:在有限的可用资源下,这次机会应该分配给谁?

因此,Kueue 与 MIG/HAMi 等数据平面方案是互补关系:

  • 可以用 MIG 提供强隔离的离散资源单位。
  • 用 HAMi 提供可声明的共享单位。
  • 再用 Kueue 实现多团队间资源的可控、可预测、可审计流转。

关键概念:将“排队”和“配额”显式建模

Kueue 的核心思想是:将调度请求拆分为两步——先排队与准入,再进行实际调度。

以下是 Kueue 的主要对象及其角色:

LocalQueue:团队/命名空间的入口队列

  • 用户作业提交到某个 namespace,挂载在对应的 LocalQueue 下。
  • 可理解为“团队的提交入口”。

ClusterQueue:全局资源池与配额承诺

  • 定义配额、借用与公平性规则。
  • 把集群资源(如 GPU/CPU/内存/自定义资源)抽象为可治理的池,并分配份额给不同租户。
  • 常见模式是多个 LocalQueue 指向同一个 ClusterQueue,实现“入口不同但共享全局规则”。

Workload:等待准入的资源申请单

  • 用户提交的 Job / RayJob / PyTorchJob 等作业对象会被映射为可治理的 Workload。
  • Workload 记录作业的资源需求(如 GPU 数量、Pod 组、最小规模等),便于比较、排队和决策。

ResourceFlavor:资源的“口味”建模

在 GPU 场景下,“1 张 GPU”并不等价,可能有如下差异:

  • A100 与 H100
  • MIG 1g.10gb 与 7g.80gb
  • 是否允许共享、是否开启特定模式
  • 是否位于特定可用区/机架/网络域

ResourceFlavor 的作用是将资源差异显式化,使准入与配额可以针对不同“口味”的资源分别管理,而不是将所有 GPU 混为一谈。

Cohort / Borrowing / Preemption:公平与弹性的三件套

在实际平台中,单纯"硬配额"会导致资源浪费,单纯"先到先得"又会带来混乱。Kueue 通常结合以下三种能力:

  • 公平性(Cohort/共享规则):多个队列间按规则共享或竞争资源。
  • 借用(Borrowing):队列未用完配额时,其他队列可借用以提升利用率。
  • 抢占(Preemption):高优先级作业需要资源时,可回收低优先级作业已承诺资源,保障关键业务。

下图展示 Kueue 的两步调度流程和核心概念。第一步(排队与准入):Workload 提交到 LocalQueue(团队/命名空间的入口队列),LocalQueue 指向 ClusterQueue(全局资源池与配额承诺),ResourceFlavor 对不同类型的资源(如 A100 vs H100、MIG profile 差异)进行建模。第二步(实际调度):准入后的作业由 kube-scheduler 或 Volcano 进行实际调度。底部展示公平与弹性三件套(Cohort 队列共享、Borrowing 配额借用、Preemption 抢占机制)。Kueue 的核心价值在于将调度之前的治理产品化——先完成资源的准入与承诺,再进行实际调度。

图 1: Kueue 的核心概念:从排队到准入的两步调度
图 1: Kueue 的核心概念:从排队到准入的两步调度

典型治理场景:Kueue 解决哪些平台问题

Kueue 关注的不是“某个作业如何跑得最快”,而是“所有作业如何有秩序地运行”。以下是典型治理场景:

多团队配额:将“应该能用多少”写进系统

  • 团队 A:保障 20 张 GPU
  • 团队 B:保障 10 张 GPU
  • 平台预留:5 张 GPU 用于紧急事件或在线推理

配额显式化后,平台可以回答:

  • “为什么我现在排队?”——因为当前申请超出可用份额。
  • “我什么时候能拿到?”——队列有明确顺序与策略,体验可预测。
  • “平台是否偏心?”——可用审计和指标证明资源承诺流向。

准入(Admission):将“能不能跑”前置到控制面

在原生 Kubernetes 中,作业失败往往发生较晚:Pod 创建后长时间 pending,才发现资源不足或条件不满足。Kueue 的准入机制类似“入场券”:

  • 先判断是否有足够配额/可承诺资源。
  • 只有获得准入许可,作业才进入实际调度阶段。

这样,用户能明确了解 Pending 原因,平台也能将治理逻辑集中在控制面,减少调度失败和人工干预。

借用与回收:平衡利用率与秩序

理想的 GPU 平台既要高利用率,也要强秩序。借用机制提升利用率,抢占/回收机制保障秩序:

  • 平时可借用闲置配额,减少资源空转。
  • 紧急时高优先级业务可回收资源,兑现保障。

这让平台从“静态分田地”升级为“动态经济系统”,既避免长期浪费,也防止关键时刻失控。

优先级与可预测体验:制度化冲突管理

GPU 平台治理的难点在于冲突管理。Kueue 通过优先级、策略和准入规则,将冲突管理制度化:

  • 在线推理(强时延 SLO)与离线训练(吞吐优先)
  • 生产事故修复与常规实验
  • 关键客户项目与内部探索

这些都能通过系统规则落地,避免平台治理沦为"谁嗓门大谁赢"。

下图展示 Kueue 的 7 大核心治理能力。Quota(配额管理)提供集群级配额定义和资源上限;Admission(准入控制)基于配额进行准入和等待队列管理;Borrowing(配额借用)允许跨队列借用闲置配额以提升利用率;Preemption(抢占机制)基于优先级抢占保证高优作业;Cohort(队列共享)支持多队列共享资源池和公平性策略;ResourceFlavor(资源建模)区分资源类型支持异构 GPU;Fair Sharing(公平分享)提供多租户资源公平分配。图中特别强调了 Kueue 的能力边界:它只负责调度前的准入与配额管理,不做实际调度,需要与 kube-scheduler 或 Volcano 协同工作形成完整的调度流程,并依赖数据平面提供资源单位和可观测信号。

图 2: Kueue 的治理能力:配额与公平性的产品化
图 2: Kueue 的治理能力:配额与公平性的产品化

与 Volcano 的关系:正交但可组合

Volcano 擅长批处理语义、作业级调度、gang scheduling 等,补齐原生 Kubernetes 在 AI 训练/分布式作业表达上的不足。

二者的关系可以总结为:

  • Volcano:负责“怎么排座位”的调度(作业级策略、批处理、并行组、调度算法)。
  • Kueue:负责“谁能进场、能占多少座位”的门禁与秩序(准入、配额、借用、抢占、治理)。

常见组合方式:

  • 用 Kueue 负责准入与资源承诺(控制面治理)。
  • 用 Volcano 或 kube-scheduler 负责已准入 Pod 的实际调度(调度执行)。

这体现了"先治理,再调度"的解耦路径。

下图展示 Kueue 与 Volcano 的两种演进路径对比。Kueue(左侧):核心理念是两步调度(先准入、再调度),沿用原生 K8s API 与生态;优势包括与 K8s 原生深度集成、支持 Job/Set/ReplicaSet 等原生资源、配额管理更精细、云厂商路线一致;局限是不支持复杂的 Gang Scheduling、需要配合其他调度器、批处理语义不如 Volcano 丰富;适用于云原生环境和多租户平台。Volcano(右侧):核心理念是一站式批处理调度,提供完整的队列、Gang、抢占语义;优势包括完整的批处理调度语义、支持复杂的 Gang Scheduling、Backfill 和拓扑亲和性等高级特性、AI 训练场景验证充分;局限是与原生 K8s 调度器是替代关系、API 自定义学习成本高、云厂商集成度不如 Kueue;适用于 AI 训练集群和批处理平台。底部选型建议:重视 K8s 原生集成选择 Kueue,需要完整 Gang Scheduling 选择 Volcano,也可以组合使用形成完整体系。

图 3: Kueue vs Volcano:治理调度的两种演进路径
图 3: Kueue vs Volcano:治理调度的两种演进路径

GPU 平台落地时必须思考的三件事

资源口径:治理对象是“卡”、还是“切片”、还是“共享份额”?

Kueue 的配额需绑定明确的资源单位。GPU 单位在不同数据平面方案下会变化:

  • 整卡:nvidia.com/gpu
  • MIG:按 MIG profile 形成离散资源单位
  • 共享:如 vGPU 份额、显存份额、时间片份额等

口径不清,治理难以落地。需明确平台对外承诺的最小单位、是否可动态调整、是否允许混用,这决定配额的可理解性、可执行性和可审计性。

Flavor 设计:异构不可避免,混合会带来“隐性不公平”

当 H100 和 A10 混在同一池,“10 张 GPU 配额”对不同团队意义完全不同。ResourceFlavor 让差异显式化,使配额和公平性建立在正确维度上。

观测与计量:控制面“承诺”需对齐数据面“实际”

控制面能说明“承诺了多少”,但平台还需对齐“实际使用了多少”。稳健的闭环通常包括:

  • 控制面(Kueue):提供准入、配额占用、等待时长、抢占/回收等数据。
  • 数据平面(驱动/隔离/计量):提供实际 GPU 利用率、显存占用、带宽/干扰、真实 GPU-hours。

两者对齐后,平台才能实现配额、成本核算、容量规划和体验改进。

边界与常见陷阱:Kueue 不是“万能 GPU 管理器”

需要明确 Kueue 的边界,避免落地时产生误解:

  • 当前版本 Kueue 不提供隔离能力,隔离需依赖 MIG、vGPU、容器/驱动栈等数据平面方案。
  • Kueue 不替代调度器,只负责准入与承诺,Pod 的实际调度仍依赖 kube-scheduler/Volcano 等。
  • Kueue 不能解决所有碎片问题,若资源单位离散(如 MIG profile),碎片需通过数据平面策略和容量工程缓解,Kueue 仅能在规则层面减少无意义占用。

常见失败模式包括:只引入 Kueue 却未明确资源单位和计量口径,导致配额看似严格但实际体验混乱;或数据平面已做切分共享,却缺乏准入与配额,最终系统被“合法但失序”的用法拖垮。

总结

Kueue 让 GPU 从“稀缺硬件”升级为“平台资源”,平台治理的核心不在于切分技术本身,而在于:

  • 资源能否制度化分配(配额)
  • 资源竞争是否有清晰秩序(队列/优先级/公平)
  • 使用是否可预测、可审计(准入与统计)
  • 利用率能否在秩序基础上优化(借用与回收)

Kueue 正是将这些能力落地到控制面的关键组件,让 GPU 资源从“抢得到”走向“分得清、用得稳、算得明”。

下一章将从“单组件”视角提升到“端到端组合”,探讨如何将数据平面(MIG/HAMi 等)与控制面(Volcano/Kueue 等)组合成可交付的参考架构,并通过实验和指标验证架构取舍。

创建于 2025/12/30 更新于 2025/12/30 4337 字 阅读约 9 分钟