Kubernetes

Gang 调度(协同调度)完整详解

·6 分钟阅读·2191 字
📋 目录

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)

  1. 分组标记通过统一标签识别同一 Gang 任务,例如 gang.scheduling.k8s.io/name: train-job-01,相同标签的Pod归为一组。
  2. Permit 阶段阻塞调度框架 Permit 插件拦截Pod,不会立刻执行Bind绑定节点;
    插件统计当前组内已找到候选节点的Pod数量
  3. 等待窗口期配置 PermitWaitingTimeSeconds 等待同组其他Pod完成调度筛选;
    窗口期内持续收集组内所有Pod的可用节点资源。
  4. 双分支判断
  • 分支1:窗口期结束,组内所有Pod都筛选到可用节点 → 全部放行,执行Reserve预留资源、Bind绑定,整组启动。
  • 分支2:窗口期结束,存在至少一个Pod无可用节点 → 全部取消资源预留,整组退回调度队列,等待下一轮重试
  1. 资源原子性预留
    整组放行时,一次性为所有Pod锁定节点资源,防止并发调度抢占资源导致部分Pod分配失败。

3. 关键特性

  1. 原子调度:全有或全无,不存在“半启动”任务;
  2. 资源不浪费:不会出现部分Worker长期空跑占用CPU内存;
  3. 协同等待窗口:可自定义等待时长,平衡调度速度与成功率;
  4. 支持抢占:高优先级Gang可抢占低优先级任务整组资源;
  5. 与原生调度兼容:基于调度框架插件,无需替换kube-scheduler,也可使用Volcano独立调度器完整实现Gang能力。

4. 典型适用场景

  1. AI分布式训练
    PyTorch/TensorFlow多卡分布式训练,多Worker必须同时启动建立通信集群,缺卡则训练无法初始化。
  2. 大数据计算引擎
    Spark、Flink、MPI作业:Driver + 批量Executor,Executor不足任务无法提交计算。
  3. 并行HPC高性能计算
    科学计算、仿真任务,多进程跨节点协同运算。
  4. 微服务强依赖集群
    整套中间件集群一次性部署,要求所有实例同时就绪提供服务。

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-schedulerGang调度
调度逻辑单个Pod独立调度,互不影响同组Pod整体原子调度
资源浪费部分Pod启动、部分Pending,空耗资源要么全启动,要么全等待,无资源浪费
分布式任务可用性容易出现任务卡死、等待资源所有实例同时就绪,任务正常运行
适用业务无状态微服务、单实例应用AI训练、大数据、并行计算批量任务

7. 高频面试考点

  1. Gang调度核心思想?
    一组关联Pod必须全部调度成功才允许启动,任意Pod调度失败则整组阻塞,实现原子批量调度。
  2. Gang调度解决什么问题?
    分布式任务部分Pod调度成功、部分长期Pending,已启动实例空占资源、任务无法正常运行的资源浪费问题。
  3. 调度框架中Gang调度运行在哪个扩展点?
    Permit许可阶段,阻塞Pod绑定,等待同组所有Pod完成筛选后统一放行。
  4. 实现Gang调度的两种方案?
    ① 调度框架Coscheduling插件(原生kube-scheduler扩展);② Volcano独立批处理调度器。

关联文档