Volcano:云原生批量计算与 AI 训练调度器

FreeGuideOnline 最新 2026-06-28

Volcano 调度器:云原生批量计算与 AI 训练调度器

Volcano 是一个专为 Kubernetes 设计的云原生批量调度系统,尤其擅长处理高性能计算(HPC)、人工智能/机器学习训练、大数据分析等场景。它弥补了 Kubernetes 默认调度器在批量任务调度、资源公平分配、任务依赖管理等方面的不足,通过丰富的调度策略和插件机制,提供了高效、灵活的作业编排能力。

为什么需要 Volcano?

在 Kubernetes 中运行单个 Pod 非常方便,但面对以下场景时,默认调度器就显得力不从心:

  • 批量调度需求:一个 AI 训练作业需要同时启动 100 个 Pod,如果只能一个一个调度,可能因资源碎片导致死锁。
  • 任务依赖与 DAG:数据预处理 → 模型训练 → 评估,需要定义作业间的拓扑顺序。
  • 公平共享与优先级:多个团队共享集群,需要防止资源被单一任务长期霸占。
  • 队列与配额管理:按项目或部门划分资源,并控制同时运行的作业数。
  • 高级资源感知:如 GPU 拓扑亲和性、NUMA 亲和性、节点超卖等。

Volcano 正是为解决这些问题而生的云原生批量调度器,它提供了完整的作业生命周期管理。

核心架构

Volcano 主要包含四个核心组件:

  • Volcano Scheduler:运行在 Kubernetes 控制平面的调度器,监听 PodGroup 和 Queue 等资源,执行高级调度逻辑。
  • Volcano Admission Controller:准入控制器,为 Volcano 管理的 Pod 注入标签、执行 PodGroup 准入校验。
  • Volcano Controllers:一组控制器,管理 Job、PodGroup、Queue 等 CRD 的生命周期。
  • Volcano CLI (vcctl):命令行工具,用于提交和管理 Volcano Job。

调度器通过 多插件机制 实现功能扩展,可以在调度流水线(Session)的不同阶段注入自定义逻辑,如 Filter、Score、Allocate 等。这种可插拔架构让 Volcano 能够灵活适应各种调度需求。

关键概念入门

开始使用 Volcano 前,先了解几个核心自定义资源(CRD):

  • Job:描述一个批量作业,可包含多个任务模板(Task),每个任务模板定义一组并行运行的 Pod。支持定义任务间的依赖关系、故障重试策略、最小可用数量等。
  • Task:Job 中的一个任务阶段,如 ps(参数服务器)、worker(计算节点)。每个 Task 可指定副本数、Pod 模板、依赖先决条件等。
  • PodGroup:由一组包含相同调度策略的 Pod 组成的集合。Volcano 倾向于以 PodGroup 为单位进行“一揽子调度”,要么全部调度成功,要么全部等待,从而避免资源死锁。
  • Queue:用于资源管理和多租户隔离的逻辑队列,支持设置权重、能力上限、回收策略等,实现不同团队或作业之间的公平分配。
  • Volcano Scheduler Policy:调度器配置,定义调度过程中启用哪些插件(如 gang、binpack、drf 等)及其参数。

快速上手:提交第一个 Volcano Job

在开始之前,请确保集群中已部署 Volcano。您可以参考官方文档通过 Helm 或 YAML 安装。

安装完成后,查看系统命名空间中是否运行了 volcano-scheduler 和 volcano-controllers。

kubectl get pods -n volcano-system

1. 创建队列(Queue)

为您的作业创建一个专用队列,定义资源配额和权重:

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: ai-training
spec:
  reclaimable: true
  weight: 1
  capability:
    cpu: "20"
    memory: "40Gi"

执行 kubectl apply -f queue.yaml 即可。

2. 编写 Job 定义

以常见的 “ps-worker” 模式的分布式 TensorFlow 训练为例:

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: tf-dist-train
spec:
  minAvailable: 3          # 最少需要3个 Pod 同时运行
  schedulerName: volcano   # 使用 volcano 调度器
  queue: ai-training       # 指定上一步创建的队列
  tasks:
    - replicas: 1
      name: ps
      template:
        spec:
          containers:
            - name: tensorflow
              image: tensorflow/tensorflow:latest
              command: ["python", "/run_ps.py"]
              resources:
                requests:
                  memory: "2Gi"
                  cpu: "2"
      restartPolicy: OnFailure
    - replicas: 2
      name: worker
      template:
        spec:
          containers:
            - name: tensorflow
              image: tensorflow/tensorflow:latest
              command: ["python", "/run_worker.py"]
              resources:
                requests:
                  memory: "4Gi"
                  cpu: "4"
      restartPolicy: OnFailure

该定义要求至少同时运行 3 个 Pod(1 个 ps + 2 个 worker)才启动作业,这就是 Gang Scheduling 的典型应用。

3. 提交并观察作业

kubectl apply -f job.yaml
# 查看作业状态
kubectl get job tf-dist-train -o yaml
# 查看所属 PodGroup
kubectl get podgroup

如果集群资源满足 3 个 Pod 的请求,Volcano 会一次性将它们调度到合适节点,否则作业将处于 Pending 状态,直到资源可用。

核心调度机制详解

Gang Scheduling(成组调度)

Gang Scheduling 确保作业的一组 Pod 要么全部调度成功,要么都不执行,避免部分 Pod 占用资源后等待其他 Pod 而造成资源浪费。Volcano 通过 PodGroup 实现这一机制,作业的 minAvailable 字段指定了必须同时运行的 Pod 最低数量。调度器会等待直到有足够资源一次性满足所有 Pod,再进行批量绑定。

队列与公平共享

Volcano 采用 DRF(主导资源公平) 或简单的份额公平算法,在多队列之间分配资源。每个 Queue 可以设置 weight(权重)和 capability(容量上限),同时支持动态回收(Reclaim):当高优先级队列有空闲资源时,可以分配给其他队列使用,但高优队列需要时能回收资源。通过 Queue 和 Scheduling Policy 的组合,可以实现多租户的细粒度资源管控。

拓扑感知调度

针对 AI 场景,Volcano 支持 GPU 拓扑亲和性调度。通过在作业或 PodGroup 上设置 topologyPolicy,可以让调度器感知节点内 GPU 的 NVLINK 连接关系,优先将 Task 的 Pod 调度到同一 NUMA 节点或高速互联的 GPU 上,以减少跨节点通信延迟,提升训练效率。常见策略包括 best-effortrestrictedsingle-numa-node 等。

其他高级特性

  • 作业依赖与 DAG:可以在 Job 中定义多个 Task 之间的依赖关系,实现阶段化执行。
  • 任务级别的优先级与抢占:可以配置 Tasks 优先级,高优先级作业可以抢占低优先级资源。
  • Pod 驱逐与重调度:支持在节点故障或资源平衡时触发 Pod 驱逐、优雅重调度。
  • 超卖与闲置资源利用:通过 over-subscription 插件,允许利用节点上未被申请的资源运行低优先级任务,提高集群利用率。

调度器插件配置示例

Volcano 调度器通过 ConfigMap volcano-scheduler-configmap 配置策略。例如,开启 Gang、Binpack 和 DRF 插件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: volcano-scheduler-configmap
  namespace: volcano-system
data:
  volcano-scheduler.conf: |
    actions: "enqueue, allocate, backfill"
    tiers:
    - plugins:
      - name: gang
      - name: priority
      - name: conformance
    - plugins:
      - name: drf
      - name: binpack
        arguments:
          binpack.weight: 5
      - name: proportion
      - name: task-topology    

上述配置中,actions 定义调度阶段,tiers 定义插件执行的先后层级。合理组合插件可以满足不同业务场景。

在生产环境使用的最佳实践

  1. 合理设置 minAvailable:避免设置过高导致作业永远无法调度,或设置过低导致作业提前启动而浪费资源。一般设为全部 worker 副本数加必要参数服务器的数量。
  2. 队列规划与权重:按业务线或优先级划分 Queue,通过权重控制资源分配比例,避免饥饿。
  3. 资源估计与 Limits:为容器设置准确的 requestslimits,确保调度器做出正确决策。
  4. 监控与可观测性:使用 Prometheus 指标和 Volcano Dashboard 监控队列积压、作业完成时间、调度延迟等。
  5. 升级与回滚策略:Volcano 版本迭代较快,建议在测试环境充分验证后再升级生产环境,并提前备份调度器配置。

总结

Volcano 是 Kubernetes 生态中成熟可靠的批量调度解决方案,它提供了从作业管理、成组调度、公平共享到高级拓扑感知的全套能力,尤其适合 AI/ML 训练和大数据工作负载。通过简单的 YAML 声明,即可让复杂的分布式训练任务高效运行在 Kubernetes 之上,大幅提升集群利用率和开发效率。