Gang 调度(协同调度)完整详解
1. 什么是 Gang 调度
Gang 调度也叫团伙调度、批量协同调度,核心定义:
一组关联的 Pod(任务组/Gang)必须同时调度成功到节点、同时就绪运行,只要组内任意一个 Pod 无法调度,整组全部阻塞等待,绝不单独启动部分 Pod。
1.1. 核心设计背景
大数据、分布式AI训练、Spark/Flink、MPI 分布式计算场景存在强依赖:
分布式任务由多个角色 Pod 组成(Driver + 多个Worker),少任何一个Pod,整个任务都无法正常运行。
普通默认调度器会出现问题:部分 Worker 调度成功启动、剩下 Worker 资源不足长期Pending,已启动的Worker空等、浪费节点资源。
Gang 调度解决该痛点:要么全部调度成功,要么全部不启动。
2. 核心工作原理(基于 Scheduling Framework Coscheduling 插件 / Volcano)
- 分组标记通过统一标签识别同一 Gang 任务,例如
gang.scheduling.k8s.io/name: train-job-01,相同标签的Pod归为一组。 - Permit 阶段阻塞调度框架
Permit插件拦截Pod,不会立刻执行Bind绑定节点;
插件统计当前组内已找到候选节点的Pod数量。 - 等待窗口期配置
PermitWaitingTimeSeconds等待同组其他Pod完成调度筛选;
窗口期内持续收集组内所有Pod的可用节点资源。 - 双分支判断
- 分支1:窗口期结束,组内所有Pod都筛选到可用节点 → 全部放行,执行Reserve预留资源、Bind绑定,整组启动。
- 分支2:窗口期结束,存在至少一个Pod无可用节点 → 全部取消资源预留,整组退回调度队列,等待下一轮重试。
- 资源原子性预留
整组放行时,一次性为所有Pod锁定节点资源,防止并发调度抢占资源导致部分Pod分配失败。
3. 关键特性
- 原子调度:全有或全无,不存在“半启动”任务;
- 资源不浪费:不会出现部分Worker长期空跑占用CPU内存;
- 协同等待窗口:可自定义等待时长,平衡调度速度与成功率;
- 支持抢占:高优先级Gang可抢占低优先级任务整组资源;
- 与原生调度兼容:基于调度框架插件,无需替换kube-scheduler,也可使用Volcano独立调度器完整实现Gang能力。
4. 典型适用场景
- AI分布式训练
PyTorch/TensorFlow多卡分布式训练,多Worker必须同时启动建立通信集群,缺卡则训练无法初始化。 - 大数据计算引擎
Spark、Flink、MPI作业:Driver + 批量Executor,Executor不足任务无法提交计算。 - 并行HPC高性能计算
科学计算、仿真任务,多进程跨节点协同运算。 - 微服务强依赖集群
整套中间件集群一次性部署,要求所有实例同时就绪提供服务。
5. 两种主流实现方案
5.1. 方案1:kube-scheduler 内置 Coscheduling 插件(轻量,多Profile)
属于 scheduler-plugins 社区插件,基于Scheduling Framework Permit阶段实现,单kube-scheduler多Profile即可启用,适合中小批量任务。
启用方式:在调度Profile的multiPoint插件中开启Coscheduling,并配置等待窗口。
5.2. 方案2:Volcano 独立调度器(企业生产主流)
完整批处理调度系统,原生深度优化Gang调度:
- 支持任务队列、资源配额、多租户;
- 支持Gang任务优先级、抢占、资源超配;
- 大规模AI/大数据集群首选。
6. 普通调度 vs Gang调度 对比
| 场景 | 默认kube-scheduler | Gang调度 |
| 调度逻辑 | 单个Pod独立调度,互不影响 | 同组Pod整体原子调度 |
| 资源浪费 | 部分Pod启动、部分Pending,空耗资源 | 要么全启动,要么全等待,无资源浪费 |
| 分布式任务可用性 | 容易出现任务卡死、等待资源 | 所有实例同时就绪,任务正常运行 |
| 适用业务 | 无状态微服务、单实例应用 | AI训练、大数据、并行计算批量任务 |
7. 高频面试考点
- Gang调度核心思想?
一组关联Pod必须全部调度成功才允许启动,任意Pod调度失败则整组阻塞,实现原子批量调度。 - Gang调度解决什么问题?
分布式任务部分Pod调度成功、部分长期Pending,已启动实例空占资源、任务无法正常运行的资源浪费问题。 - 调度框架中Gang调度运行在哪个扩展点?
Permit许可阶段,阻塞Pod绑定,等待同组所有Pod完成筛选后统一放行。 - 实现Gang调度的两种方案?
① 调度框架Coscheduling插件(原生kube-scheduler扩展);② Volcano独立批处理调度器。
关联文档
- kube-scheduler 完整工作原理 — 调度框架与 Permit 阶段
- K8s 多调度 Profile 完整配置教程 — Coscheduling 插件配置
- K8s 高阶调度全解 — 亲和与污点调度