08 工业级调度器(Gödel / qGPU / Kueue / Koordinator / YuniKorn)
08 工业级调度器(Gödel / qGPU / Kueue / Koordinator / YuniKorn)
你之前对话里问「大厂(字节/腾讯)用的真是 Volcano 吗」。答案是:开源 Volcano 是基线,但大厂都在它之上或之外做了自研/深度定制。这一章看几个真实工业方案,理解「为什么原生/Volcano 还不够」,并建立自研调度器的思路。
💡 给你的话:这章信息量大,但对你不难——本质上就是「K8s 调度生态的各家方案对比」,和你熟悉的服务网格/Ingress 生态对比是一个套路。
8.1 为什么原生 / Volcano 还不够
当集群到千卡/万卡、在离线混部、多租户强隔离时:
- 调度吞吐成瓶颈(Volcano 单次调度周期串行、Extender 同步 HTTP)。
- 在线(低延迟服务)+ 离线(训练)混部需要统一调度,Volcano 偏离线。
- 细粒度算力/显存双维隔离(不止整卡/MIG)需要内核级方案。
- 多厂商、异构、受管制场景更复杂。
大厂自研,或在社区方案上深度定制。下面按「解决问题」的维度认识几个关键玩家。
名词解释:
- 在离线混部(Colocation):把延迟敏感的在线业务(如 Web 服务)和延迟不敏感的离线任务(训练/批处理)跑在同一集群,用优先级+隔离把离线「填」进在线空闲资源,整体利用率翻倍。
- 多租户(Multi-tenancy):多个团队/客户共用一个集群,互相隔离、各有配额。
8.2 字节跳动 · Gödel Scheduler
- 定位:在离线统一调度器,2024.1 由字节 KubeWharf 开源。
- 架构特点:
- 基于 K8s Scheduler Framework,引入乐观并发——把最耗时的「节点匹配」并行化,吞吐远超默认调度器。
- 名词解释:乐观并发(Optimistic Concurrency):假设冲突少见,先并行干、提交时再检查冲突,冲突就重试。比悲观加锁快得多。
- 统一调度在线(微服务)与离线(训练/批处理)负载,提升整体利用率。
- 支持 Gang、抢占、优先级、重调度(Godel-Rescheduler)。
- 基于 K8s Scheduler Framework,引入乐观并发——把最耗时的「节点匹配」并行化,吞吐远超默认调度器。
- GitHub:https://github.com/kubewharf/godel-scheduler
- 意义:你看它站在 K8s Scheduler Framework 之上做增强,而非另起炉灶——这正是工业调度的典型路线。
⭐ 对应你之前对话:元宝说的「字节 Gödel 把 GPU 利用率提到 95%」——方向正确,Gödel 是通过在离线统一 + 高吞吐调度拉高利用率的代表。
8.3 腾讯 · qGPU 调度
- 定位:腾讯云 TKE 的 GPU 容器虚拟化 + 细粒度调度。
- 机制:
- 依托开源 Elastic GPU 框架,支持单卡被多容器共享。
- 算力 + 显存双维度精细调度(不只整卡/MIG 的粗粒度)。
- 底层内核模块做强隔离,性能损耗低。
- 以 Scheduler Extender 形式接入 kube-scheduler(见
06)。
- 文档:https://cloud.tencent.com/document/product/457/61448
- 意义:解决「MIG 粒度粗、整卡浪费」的问题,把一张卡切到任意算力%+显存给多团队。
对应你之前对话问「第二步多厂商接入、怎么让不同任务调度到不同卡」——qGPU 是在「单卡内细粒度」维度补充 Volcano 的「整卡 Gang」维度。
8.4 Kueue(K8s 原生排队)
- 定位:K8s 官方 SIG 维护的队列/配额/抢占系统,专注「批处理排队」,不替代调度器,而是在调度器之前管理队列。
- 核心概念:
ResourceFlavor(资源形态,如不同机型)、ClusterQueue(集群队列+配额)、LocalQueue(命名空间内队列)、Workload(待调度工作负载)。 - 特点:轻量、与任意调度器(含 Volcano/kube-scheduler)配合、原生集成。
- 官网:https://kueue.sigs.k8s.io/
- 适合:想要「队列+配额+抢占」但不想直接上重调度器的团队。
💡 类比:Kueue 像「银行取号机」——只管「谁先办、配额多少、能不能插队」,不管「具体去哪个柜台」(那是调度器的事)。所以它能和 Volcano 串联。
8.5 ⭐ 阿里 · Koordinator(在离线混部的标准答案)
- 定位:阿里开源的 K8s 在离线统一调度/混部系统,正是 8.1 里「在离线混部」动因的直接解法。
- 核心能力:
- 在离线混部:把延迟敏感的在线业务(如电商交易)和延迟不敏感的离线任务(训练/批处理)跑在同一集群,用**优先级 + 干扰隔离(CPU/内存/IO 压制)**把离线「填」进在线空闲资源,整体利用率从 30% 拉到 60%+。
- 名词解释:干扰隔离(Interference Isolation):在线业务忙时压制离线任务占用的资源,保证在线延迟不受影响。
- 精细的资源画像与压制(CPU Burst、内存弹性、拓扑感知)。
- 兼容 kube-scheduler,以插件/扩展方式接入,不颠覆现有集群。
- 在离线混部:把延迟敏感的在线业务(如电商交易)和延迟不敏感的离线任务(训练/批处理)跑在同一集群,用**优先级 + 干扰隔离(CPU/内存/IO 压制)**把离线「填」进在线空闲资源,整体利用率从 30% 拉到 60%+。
- GitHub:https://github.com/koordinator-sh/koordinator
- 意义:你若被问「大厂怎么把利用率翻倍」——Koordinator 式在离线混部是最经典的工业回答。它和 Gödel 思路一致(统一调度),但更强调「混部隔离」这一层。
⚠️ 内幕:混部的难点不是「调度」,而是「隔离」——离线任务突发吃满 CPU/内存/网络会拖垮在线。Koordinator 的核心价值是那套干扰检测与压制机制,而不是调度算法本身。面试讲混部,重点讲隔离。
8.6 ⭐ Apache YuniKorn(多租户批调度)
- 定位:Apache 顶级项目(源自 Apple),面向大数据/AI 的多租户批处理调度器,可替代或增强 kube-scheduler。
- 核心特点:
- 队列 + 层级配额 + 公平份额:租户/团队间强隔离,适合多团队共用集群。
- 一套调度逻辑同时管 K8s 和 YARN(大数据场景平滑迁移)。
- 名词解释:YARN 是 Hadoop 的资源调度器,大数据老牌系统。YuniKorn 能同时管 K8s 和 YARN,方便大数据团队迁移。
- 支持 Gang Scheduling、抢占、bin-packing。
- 作为独立调度器运行(通过
schedulerName指向 yunikorn),与 Volcano 定位互补。
- 官网:https://yunikorn.apache.org/
- 意义:面试常考「Volcano vs YuniKorn」——前者是批处理 Job 调度(K8s-native CRD),后者是通用多租户队列调度(可接管整个集群调度)。
8.7 对比表(选型参考)
| 方案 | 类型 | 强项 | 适合 |
|---|---|---|---|
| kube-scheduler | 原生 | 通用、稳定 | 简单负载 |
| + Plugin/Extender | 增强 | 自定义灵活 | 轻量定制 |
| Volcano | 批处理调度 | Gang、队列、公平 | AI 训练标配(Job 级) |
| Kueue | 排队系统 | 配额/抢占、轻量原生 | 配合任意调度器 |
| Gödel | 在离线统一 | 高吞吐、混部 | 超大规、混部 |
| qGPU | 虚拟化+调度 | 细粒度算力/显存 | 高密度共享 |
| Koordinator | 在离线混部 | 干扰隔离、利用率翻倍 | 在线+离线同集群 |
| YuniKorn | 多租户批调度 | 层级队列、跨 YARN/K8s | 多团队强隔离 |
⭐ Volcano vs Kueue vs YuniKorn(面试高频)
- Volcano:管「一批 Pod 作为一个 Gang Job 整体调度」,偏训练/批处理语义,通过 CRD(Queue/Job/PodGroup)工作。
- Kueue:不管「怎么调度 Pod 到节点」,只管「谁先跑、配额多少、能不能抢占」,是调度器前面的排队闸口,可与 Volcano 串联。
- YuniKorn:是可替换 kube-scheduler 的独立调度器,强在多租户层级队列与跨 YARN/K8s 一致性,常驻接管集群调度。
- 实际大厂常组合:YuniKorn/Kueue 管队列配额 → Volcano 管 Gang Job → Gödel/Koordinator 管混部与高吞吐。
8.8 自研调度器思路(你的进阶目标)
若你要「自研/深度定制」调度器,典型路线:
- 基于 Scheduler Framework 写 Plugin:最轻,解决特定亲和/打分(如 GPU 型号、拓扑)。
- Scheduler Extender 做复杂隔离:如 qGPU 内核级隔离的调度决策。
- 借鉴 Gödel 的乐观并发:解决大集群吞吐瓶颈。
- Koordinator 思路做在离线混部:把离线填进在线空闲,拉高利用率。
- Kueue 管队列 + Volcano/Gödel 管分配:职责分离。
⭐ 重点(回应你最初的问题):你说「有时候需要自研调度器,像 Volcano 这种半开源的」——准确说,Volcano 是完全开源(CNCF),大厂多在它或 kube-scheduler 之上扩展,而非从零写。你的切入点应是「会读写 Plugin/Extender + 理解工业方案设计」。
8.8 实战:安装 Koordinator 体验混部
8.8.1 安装 Koordinator
helm repo add koordinator-sh https://koordinator-sh.github.io/charts
helm repo update
helm install koordinator koordinator-sh/koordinator -n koordinator-system --create-namespace
kubectl get pods -n koordinator-system -w
8.8.2 模拟在离线混部
# 在线任务(高优)
kubectl run online --image=busybox --command -- sh -c 'while true; do echo online; sleep 1; done' --limits=cpu=2,memory=2Gi
# 离线任务(低优)
kubectl run offline --image=busybox --command -- sh -c 'while true; do echo offline; sleep 1; done' --limits=cpu=4,memory=4Gi
kubectl get pods -o wide
# 在线和离线 Pod 都 Running -- 混部成功
目的:Koordinator 让在线和离线任务共存,节点资源被充分利用。这就是混部核心。
8.9 自测题
- 为什么大厂不直接用原生 kube-scheduler 跑万卡训练?
- Gödel 的核心特点?什么是「乐观并发」?
- qGPU 相比 MIG 的优势?它怎么接入 kube-scheduler?
- Kueue 是什么、解决什么?为什么说它「不管调度到哪个节点」?
- ⭐ Koordinator 解决什么?混部的难点是调度还是隔离?为什么?
- ⭐ YuniKorn 是什么?Volcano / Kueue / YuniKorn 三者定位有何不同?
- 自研调度器的五条典型路线?
- 为什么说「Volcano 是完全开源,大厂在其上扩展」?
阶段二(资源层+调度层)到此结束。能画「GPU 卡→device-plugin→kube-scheduler/Volcano→Pod」全链路,并讲清 Gang/混部/异构接入即可进
09训练框架。