WEBKT

Volcano 在 K8s 集群中的生产级部署与插件配置实战

2 0 0 0

Volcano 是 CNCF 孵化的云原生批处理调度系统,专为 AI、大数据、HPC 等高并发计算场景设计。相比默认的 Kube-scheduler,它提供了 Gang SchedulingQueue 管理任务拓扑感知 等企业级能力。本文提供从安装到插件调优的完整生产路径。


前置条件检查

部署前确保集群满足以下条件:

# 检查 K8s 版本(要求 1.16+)
kubectl version --short

# 确认节点资源充足(建议预留 2C4G 用于 Volcano 组件)
kubectl top nodes

# 关闭默认调度器对批处理任务的抢占(避免冲突)
kubectl get cm -n kube-system kube-scheduler -o yaml | grep disablePreemption

快速部署:Helm vs 原生 YAML

方式一:Helm 安装(推荐生产环境)

# 添加 Volcano 仓库
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update

# 安装指定版本(当前稳定版 v1.8.2)
helm install volcano volcano-sh/volcano \
  --namespace volcano-system \
  --create-namespace \
  --set basic.image_tag_version=v1.8.2 \
  --set scheduler.kubeConfigPath=/etc/kubernetes/scheduler.conf

关键参数说明:

  • scheduler.kubeConfigPath:指定 kubeconfig 路径,确保调度器有权限监听 Pod 事件
  • basic.image_tag_version:锁定版本避免自动升级导致兼容性问题

方式二:kubectl 快速体验(开发测试)

kubectl apply -f https://raw.githubusercontent.com/volcano-sh/volcano/release-1.8/installer/volcano-development.yaml

安装完成后验证组件状态:

kubectl get pods -n volcano-system
# 预期输出:volcano-scheduler、volcano-controller-manager、volcano-admission 均 Running

核心组件架构解析

Volcano 在 K8s 之上增加了三个关键组件,理解其协作机制是配置调优的基础:

组件 功能 关键配置 ConfigMap
Scheduler 调度决策核心,支持多插件链式调用 volcano-scheduler-configmap
Controllers 管理 Job、Queue、PodGroup 生命周期 命令行参数 --worker-threads
Admission Webhook 拦截,自动注入默认配置 证书管理(自动轮转)

插件系统深度配置

Volcano 的调度能力通过插件实现,位于 /etc/kubernetes/volcano/scheduler.conf(或 ConfigMap)中配置。

1. 生产级调度器配置模板

apiVersion: v1
kind: ConfigMap
metadata:
  name: volcano-scheduler-configmap
  namespace: volcano-system
data:
  volcano-scheduler.conf: |
    actions: "enqueue, allocate, backfill"  # 动作链顺序
    tiers:
    - plugins:
      - name: priority
      - name: gang               # Gang Scheduling 防死锁
        enablePreemptable: false
      - name: conformance        # 遵守节点污点/容忍
    - plugins:
      - name: drf                # 主导资源公平调度
        arguments:
          drf.weight: 1
      - name: predicates         # 节点过滤(资源/端口/亲和性)
      - name: proportion         # Queue 容量比例分配
      - name: nodeorder          # 节点打分策略
        arguments:
          nodeorder.weight: 1
    - plugins:
      - name: cdp                # 任务拓扑感知
      - name: pipelining         # 流水线优化

配置逻辑解析:

  • ** tiers[0]**:必备插件(优先级、Gang、合规性),任一失败直接拒绝调度
  • ** tiers[1]**:优化类插件(DRF 公平性、Proportion 队列容量),影响打分但不否决
  • ** tiers[2]**:加速类插件(拓扑感知、流水线),提升吞吐

2. 关键插件详解

Gang Scheduling(防资源死锁)

AI 训练任务通常需要 N 个 Pod 同时运行(如 4 卡 GPU 训练)。默认 K8s 调度器可能先调度部分 Pod 导致资源碎片化,剩余 Pod pending 造成死锁。

启用 Gang 插件后,Volcano 会等待所有 minAvailable Pod 资源就绪才统一绑定:

# 使用示例:PyTorchJob 配置
apiVersion: kubeflow.org/v1
kind: PyTorchJob
metadata:
  name: pytorch-gang-demo
spec:
  schedulerName: volcano      # 关键:指定调度器
  runPolicy:
    cleanPodPolicy: Running
  pytorchReplicaSpecs:
    Worker:
      replicas: 4
      template:
        spec:
          containers:
          - name: pytorch
            resources:
              limits:
                nvidia.com/gpu: 1
          schedulerName: volcano
          # PodGroup 自动创建,minAvailable=4

Queue 资源隔离

多租户场景下通过 Queue 实现资源配额管控:

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: ai-training-queue
spec:
  weight: 1                    # 相对权重(与其他 Queue 比较)
  capability:                  # 硬上限
    cpu: "100"
    memory: "200Gi"
    nvidia.com/gpu: "20"
  reclaimable: false           # 是否允许资源回收
  families:                    # 层级队列(v1.8+ 支持)
    - name: sub-queue-1
      weight: 2

使用策略:

  • 生产环境建议关闭 reclaimable(避免运行中任务被抢占)
  • 通过 capability 设置物理上限,防止某团队占满集群

NodeOrder 与拓扑感知

针对 GPU/高性能计算节点优化调度位置:

# 在 scheduler config 中启用
- name: nodeorder
  arguments:
    leastRequested.weight: 0    # 禁用默认最少请求策略
    mostRequested.weight: 0     # 禁用最多请求策略
    nodeAffinity.weight: 10     # 优先满足节点亲和性
    podAffinity.weight: 5       # 优先共址调度(减少通信延迟)

验证与排错

功能验证

# 1. 检查 Queue 状态
kubectl get queue ai-training-queue -o yaml | grep state
# 预期:state: Open

# 2. 查看调度器日志(排查 Gang 调度失败)
kubectl logs -n volcano-system deployment/volcano-scheduler | grep "Failed to bind"

# 3. 验证 PodGroup 创建(Job 提交后自动创建)
kubectl get podgroups.scheduling.volcano.sh

常见问题排查

现象 根因 解决
Pod 处于 Pending,scheduler 无日志 未指定 schedulerName: volcano 检查 PodTemplate 或 Job 配置
Gang 调度超时 资源不足或 minAvailable 设置过大 调整资源或降低 minAvailable
Queue 任务积压 weight 配置过低或 capability 已满 扩容资源或调整 Queue weight
Admission Webhook 超时 网络策略拦截 443 端口 放行 volcano-system namespace 的入站规则

生产环境最佳实践

  1. 双调度器共存:保留默认 scheduler 处理在线服务,Volcano 专注批处理。通过 schedulerName 显式区分:

    # 在线服务(无状态)
    schedulerName: default-scheduler
    # AI 训练任务(有状态批处理)
    schedulerName: volcano
    
  2. 监控埋点:暴露 Volcano 指标到 Prometheus:

    # 在 scheduler 启动参数添加
    --listen-address=:8080
    --enable-metrics=true
    

    关键指标:schedule_attempts_totale2e_scheduling_latency_milliseconds

  3. 插件热更新:修改 ConfigMap 后无需重启,Volcano 会自动重载配置(约 30 秒生效),但建议低峰期操作。

  4. 资源预留:为 volcano-system 设置 PodDisruptionBudget,避免节点维护时调度器中断:

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: volcano-scheduler-pdb
      namespace: volcano-system
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          app: volcano-scheduler
    
K8s调优师 VolcanoKubernetes批处理调度

评论点评