更新时间:2024-02-01 GMT+08:00
分享

volcano

插件简介

Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性。

Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。(目前Volcano项目已经在Github开源)

Volcano针对计算型应用提供了作业调度、作业管理、队列管理等多项功能,主要特性包括:

  • 丰富的计算框架支持:通过CRD提供了批量计算任务的通用API,通过提供丰富的插件及作业生命周期高级管理,支持TensorFlow,MPI,Spark等计算框架容器化运行在Kubernetes上。
  • 高级调度:面向批量计算、高性能计算场景提供丰富的高级调度能力,包括成组调度,优先级抢占、装箱、资源预留、任务拓扑关系等。
  • 队列管理:支持分队列调度,提供队列优先级、多级队列等复杂任务调度能力。

项目开源地址:https://github.com/volcano-sh/volcano

安装插件

  1. 登录UCS控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,找到Volcano,单击“安装”
  2. 该插件可配置“单实例”“高可用”或自定义规格。

    选择自定义时,volcano-controller和volcano-scheduler的建议值如下:

    • 小于100个节点,可使用默认配置,即CPU的申请值为500m,限制值为2000m;内存的申请值为500Mi,限制值为2000Mi。
    • 高于100个节点,每增加100个节点(10000个Pod),建议CPU的申请值增加500m,内存的申请值增加1000Mi;CPU的限制值建议比申请值多1500m,内存的限制值建议比申请值多1000Mi。

      申请值推荐计算公式:

      • CPU申请值:计算“目标节点数 * 目标Pod规模”的值,并在表1中根据“集群节点数 * Pod规模”的计算值进行插值查找,向上取最接近规格的申请值及限制值。

        例如2000节点和2w个Pod的场景下,“目标节点数 * 目标Pod规模”等于4000w,向上取最接近的规格为700/7w(“集群节点数 * Pod规模”等于4900w),因此建议CPU申请值为4000m,限制值为5500m。

      • 内存申请值:建议每1000个节点分配2.4G内存,每1w个Pod分配1G内存,二者叠加进行计算。(该计算方法相比表1中的建议值会存在一定的误差,通过查表或计算均可)

        即:内存申请值 = 目标节点数/1000 * 2.4G + 目标Pod规模/1w * 1G。

        例如2000节点和2w个Pod的场景下,内存申请值 = 2 * 2.4G + 2 * 1G = 6.8G

      表1 volcano-controller和volcano-scheduler的建议值

      集群节点数/Pod规模

      CPU Request(m)

      CPU Limit(m)

      Memory Request(Mi)

      Memory Limit(Mi)

      50/5k

      500

      2000

      500

      2000

      100/1w

      1000

      2500

      1500

      2500

      200/2w

      1500

      3000

      2500

      3500

      300/3w

      2000

      3500

      3500

      4500

      400/4w

      2500

      4000

      4500

      5500

      500/5w

      3000

      4500

      5500

      6500

      600/6w

      3500

      5000

      6500

      7500

      700/7w

      4000

      5500

      7500

      8500

  3. 选择插件实例是否多可用区部署。

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。

  4. 配置插件实例节点亲和策略。

    • 指定节点调度:指定插件实例部署的节点 ,若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。自定义亲和策略详情请参见调度策略(亲和与反亲和)

  5. 配置volcano默认调度器配置参数,详情请参见表2

    colocation_enable: ''
    default_scheduler_conf:
      actions: 'allocate, backfill'
      tiers:
        - plugins:
            - name: 'priority'
            - name: 'gang'
            - name: 'conformance'
            - name: 'lifecycle'
              arguments:
                lifecycle.MaxGrade: 10
                lifecycle.MaxScore: 200.0
                lifecycle.SaturatedTresh: 1.0
                lifecycle.WindowSize: 10
        - plugins:
            - name: 'drf'
            - name: 'predicates'
            - name: 'nodeorder'
        - plugins:
            - name: 'cce-gpu-topology-predicate'
            - name: 'cce-gpu-topology-priority'
            - name: 'cce-gpu'
        - plugins:
            - name: 'nodelocalvolume'
            - name: 'nodeemptydirvolume'
            - name: 'nodeCSIscheduling'
            - name: 'networkresource'
    表2 Volcano插件配置参数说明

    插件

    功能

    参数说明

    用法演示

    colocation_enable

    是否开启混部能力。

    参数值:

    • true:表示开启混部。
    • false:不是不开启混部。

    -

    binpack

    将Pod调度到资源使用较高的节点以减少资源碎片

    • binpack.weight:binpack插件本身在所有插件打分中的权重
    • binpack.cpu:CPU资源在资源比重的比例,默认是1
    • binpack.memory:memory资源在所有资源中的比例,默认是1
    • binpack.resources:资源类型。
    - plugins:
      - name: binpack
        arguments:
          binpack.weight: 10
          binpack.cpu: 1
          binpack.memory: 1
          binpack.resources: nvidia.com/gpu, example.com/foo
          binpack.resources.nvidia.com/gpu: 2
          binpack.resources.example.com/foo: 3

    conformance

    跳过关键Pod,比如在kube-system命名空间的Pod,防止这些Pod被驱逐

    -

    -

    lifecycle

    通过统计业务伸缩的规律,将有相近生命周期的Pod优先调度到同一节点,配合autoscaler的水平扩缩容能力,快速缩容释放资源,节约成本并提高资源利用率。

    1. 统计业务负载中Pod的生命周期,将有相近生命周期的Pod调度到同一节点

    2. 对配置了自动扩缩容策略的集群,通过调整节点的缩容注解,优先缩容使用率低的节点

    arguments参数:
    • lifecycle.WindowSize:为int型整数,不小于1,默认为10。

      记录副本数变更的次数,负载变化规律、周期性明显时可适当调低;变化不规律,副本数频繁变化需要调大。若过大会导致学习周期变长,记录事件过多。

    • lifecycle.MaxGrade:为int型整数,不小于3,默认为3。

      副本分档数,如设为3,代表分为高中低档。负载变化规律、周期性明显时可适当调低;变化不规律,需要调大。若过小会导致预测的生命周期不够准确。

    • lifecycle.MaxScore:为float64浮点数,不小于50.0,默认为200.0。

      lifecycle插件的最大得分,等效于插件权重。

    • lifecycle.SaturatedTresh:为float64浮点数,小于0.5时取值为0.5;大于1时取值为1,默认为0.8。

      用于判断节点利用率是否过高的阈值,当超过该阈值,调度器会优先调度作业至其他节点。

    - plugins:
      - name: priority
      - name: gang
        enablePreemptable: false
      - name: conformance
      - name: lifecycle
        arguments:
          lifecycle.MaxGrade: 10
          lifecycle.MaxScore: 200.0
          lifecycle.SaturatedTresh: 1.0
          lifecycle.WindowSize: 10
    说明:
    • 对不希望被缩容的节点,需要手动标记长周期节点,为节点添加volcano.sh/long-lifecycle-node: true的annotation。对未标记节点,lifecycle插件将根据节点上负载的生命周期自动标记。
    • MaxScore默认值200.0相当于其他插件权重的两倍,当lifecycle插件效果不明显或与其他插件冲突时,需要关闭其他插件,或将MaxScore调大。
    • 调度器重启后,lifecycle插件需要重新记录负载的变化状况,需要统计数个周期后才能达到最优调度效果。

    gang

    将一组Pod看做一个整体去分配资源

    -

    -

    priority

    使用用户自定义负载的优先级进行调度

    -

    -

    overcommit

    将集群的资源放到一定倍数后调度,提高负载入队效率。负载都是deployment的时候,建议去掉此插件或者设置扩大因子为2.0。

    overcommit-factor: 扩大因子,默认是1.2

    - plugins:
      - name: overcommit
        arguments:
          overcommit-factor: 2.0

    drf

    根据作业使用的主导资源份额进行调度,用的越少的优先

    -

    -

    predicates

    预选节点的常用算法,包括节点亲和,Pod亲和,污点容忍,node ports重复,volume limits,volume zone匹配等一系列基础算法

    -

    -

    nodeorder

    优选节点的常用算法

    • nodeaffinity.weight:节点亲和性优先调度,默认值是1
    • podaffinity.weight:Pod亲和性优先调度,默认值是1
    • leastrequested.weight:资源分配最少的的节点优先,默认值是1
    • balancedresource.weight:node上面的不同资源分配平衡的优先,默认值是1
    • mostrequested.weight:资源分配最多的的节点优先,默认值是0
    • tainttoleration.weight:污点容忍高的优先调度,默认值是1
    • imagelocality.weight:node上面有Pod需要镜像的优先调度,默认值是1
    • selectorspread.weight: 把Pod均匀调度到不同的节点上,默认值是0
    • volumebinding.weight: local pv延迟绑定调度,默认值是1
    • podtopologyspread.weight: Pod拓扑调度,默认值是2
    - plugins:
      - name: nodeorder
        arguments:
          leastrequested.weight: 1
          mostrequested.weight: 0
          nodeaffinity.weight: 1
          podaffinity.weight: 1
          balancedresource.weight: 1
          tainttoleration.weight: 1
          imagelocality.weight: 1
          volumebinding.weight: 1
          podtopologyspread.weight: 2

    cce-gpu-topology-predicate

    GPU拓扑调度预选算法

    -

    -

    cce-gpu-topology-priority

    GPU拓扑调度优选算法

    -

    -

    cce-gpu

    结合UCS的GPU插件支持GPU资源分配,支持小数GPU配置

    说明:

    小数GPU配置的前提条件为UCS集群GPU节点为共享模式,检查集群是否关闭GPU共享,请参见集群配置管理中的enable-gpu-share参数。

    -

    -

    numaaware

    numa拓扑调度

    weight: 插件的权重

    -

    networkresource

    支持预选过滤ENI需求节点,参数由CCE传递,不需要手动配置

    NetworkType: 网络类型(eni或者vpc-router类型)

    -

    nodelocalvolume

    支持预选过滤不符合local volume需求节点

    -

    -

    nodeemptydirvolume

    支持预选过滤不符合emptydir需求节点

    -

    -

    nodeCSIscheduling

    支持预选过滤everest组件异常节点

    -

    -

  6. 单击“安装”

在控制台中修改volcano-scheduler配置

Volcano允许用户在安装,升级,编辑时,编写Volcano调度器配置信息,并将配置内容同步到volcano-scheduler-configmap里。

当前小节介绍如何使用自定义配置,以便用户让volcano-scheduler能更适合自己的场景。

仅Volcano 1.7.1及以上版本支持该功能。在新版插件界面上合并了原plugins.eas_service和resource_exporter_enable等选项,以新选项default_scheduler_conf代替。

您可登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到Volcano,单击“安装”“升级”,并在“参数配置”中设置Volcano调度器配置参数。

  • 使用resource_exporter配置,示例如下:
    {
        "ca_cert": "",
        "default_scheduler_conf": {
            "actions": "allocate, backfill",
            "tiers": [
                {
                    "plugins": [
                        {
                            "name": "priority"
                        },
                        {
                            "name": "gang"
                        },
                        {
                            "name": "conformance"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "drf"
                        },
                        {
                            "name": "predicates"
                        },
                        {
                            "name": "nodeorder"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "cce-gpu-topology-predicate"
                        },
                        {
                            "name": "cce-gpu-topology-priority"
                        },
                        {
                            "name": "cce-gpu"
                        },
                        {
                            "name": "numa-aware" # add this also enable resource_exporter
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "nodelocalvolume"
                        },
                        {
                            "name": "nodeemptydirvolume"
                        },
                        {
                            "name": "nodeCSIscheduling"
                        },
                        {
                            "name": "networkresource"
                        }
                    ]
                }
            ]
        },
        "server_cert": "",
        "server_key": ""
    }

    开启后可以同时使用volcano-scheduler的numa-aware插件功能和resource_exporter功能。

  • 使用eas_service配置,示例如下:
    {
        "ca_cert": "",
        "default_scheduler_conf": {
            "actions": "allocate, backfill",
            "tiers": [
                {
                    "plugins": [
                        {
                            "name": "priority"
                        },
                        {
                            "name": "gang"
                        },
                        {
                            "name": "conformance"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "drf"
                        },
                        {
                            "name": "predicates"
                        },
                        {
                            "name": "nodeorder"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "cce-gpu-topology-predicate"
                        },
                        {
                            "name": "cce-gpu-topology-priority"
                        },
                        {
                            "name": "cce-gpu"
                        },
                        {
                            "name": "eas",
                            "custom": {
                                "availability_zone_id": "",
                                "driver_id": "",
                                "endpoint": "",
                                "flavor_id": "",
                                "network_type": "",
                                "network_virtual_subnet_id": "",
                                "pool_id": "",
                                "project_id": "",
                                "secret_name": "eas-service-secret"
                            }
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "nodelocalvolume"
                        },
                        {
                            "name": "nodeemptydirvolume"
                        },
                        {
                            "name": "nodeCSIscheduling"
                        },
                        {
                            "name": "networkresource"
                        }
                    ]
                }
            ]
        },
        "server_cert": "",
        "server_key": ""
    }
  • 使用ief配置,示例如下:
    {
        "ca_cert": "",
        "default_scheduler_conf": {
            "actions": "allocate, backfill",
            "tiers": [
                {
                    "plugins": [
                        {
                            "name": "priority"
                        },
                        {
                            "name": "gang"
                        },
                        {
                            "name": "conformance"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "drf"
                        },
                        {
                            "name": "predicates"
                        },
                        {
                            "name": "nodeorder"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "cce-gpu-topology-predicate"
                        },
                        {
                            "name": "cce-gpu-topology-priority"
                        },
                        {
                            "name": "cce-gpu"
                        },
                        {
                            "name": "ief",
                            "enableBestNode": true
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "nodelocalvolume"
                        },
                        {
                            "name": "nodeemptydirvolume"
                        },
                        {
                            "name": "nodeCSIscheduling"
                        },
                        {
                            "name": "networkresource"
                        }
                    ]
                }
            ]
        },
        "server_cert": "",
        "server_key": ""
    }

保留原volcano-scheduler-configmap配置

假如在某场景下希望插件升级后时沿用原配置,可参考以下步骤:

  1. 查看原volcano-scheduler-configmap配置,并备份。

    示例如下:
    # kubectl edit cm volcano-scheduler-configmap -n kube-system
    apiVersion: v1
    data:
      default-scheduler.conf: |-
        actions: "enqueue, allocate, backfill"
        tiers:
        - plugins:
          - name: priority
          - name: gang
          - name: conformance
        - plugins:
          - name: drf
          - name: predicates
          - name: nodeorder
          - name: binpack
            arguments:
              binpack.cpu: 100
              binpack.weight: 10
              binpack.resources: nvidia.com/gpu
              binpack.resources.nvidia.com/gpu: 10000
        - plugins:
          - name: cce-gpu-topology-predicate
          - name: cce-gpu-topology-priority
          - name: cce-gpu
        - plugins:
          - name: nodelocalvolume
          - name: nodeemptydirvolume
          - name: nodeCSIscheduling
          - name: networkresource

  2. 在控制台“参数配置”中填写自定义修改的内容:

    {
        "ca_cert": "",
        "default_scheduler_conf": {
            "actions": "enqueue, allocate, backfill",
            "tiers": [
                {
                    "plugins": [
                        {
                            "name": "priority"
                        },
                        {
                            "name": "gang"
                        },
                        {
                            "name": "conformance"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "drf"
                        },
                        {
                            "name": "predicates"
                        },
                        {
                            "name": "nodeorder"
                        },
                        {
                            "name": "binpack",
                            "arguments": {
                                "binpack.cpu": 100,
                                "binpack.weight": 10,
                                "binpack.resources": "nvidia.com/gpu",
                                "binpack.resources.nvidia.com/gpu": 10000
                            }
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "cce-gpu-topology-predicate"
                        },
                        {
                            "name": "cce-gpu-topology-priority"
                        },
                        {
                            "name": "cce-gpu"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "nodelocalvolume"
                        },
                        {
                            "name": "nodeemptydirvolume"
                        },
                        {
                            "name": "nodeCSIscheduling"
                        },
                        {
                            "name": "networkresource"
                        }
                    ]
                }
            ]
        },
        "server_cert": "",
        "server_key": ""
    }

    使用该功能时会覆盖原volcano-scheduler-configmap中内容,所以升级时务必检查是否在volcano-scheduler-configmap做过修改。如果是,需要把修改内容同步到升级界面里。

Prometheus指标采集

volcano-scheduler通过端口8080暴露Prometheus metrics指标。您可以自建Prometheus采集器识别并通过http://{{volcano-schedulerPodIP}}:{{volcano-schedulerPodPort}}/metrics路径获取volcano-scheduler调度相关指标。

Prometheus指标暴露仅支持volcano插件1.8.5及以上版本。

表3 关键指标说明

指标名称

指标类型

描述

Labels

e2e_scheduling_latency_milliseconds

Histogram

端到端调度时延毫秒(调度算法+绑定)

-

e2e_job_scheduling_latency_milliseconds

Histogram

端到端作业调度时延(毫秒)

-

e2e_job_scheduling_duration

Gauge

端到端作业调度时长

labels=["job_name", "queue", "job_namespace"]

plugin_scheduling_latency_microseconds

Histogram

插件调度延迟(微秒)

labels=["plugin", "OnSession"]

action_scheduling_latency_microseconds

Histogram

动作调度时延(微秒)

labels=["action"]

task_scheduling_latency_milliseconds

Histogram

任务调度时延(毫秒)

-

schedule_attempts_total

Counter

尝试调度Pod的次数。“unschedulable”表示无法调度Pod,而“error”表示内部调度器问题

labels=["result"]

pod_preemption_victims

Gauge

选定的抢占受害者数量

-

total_preemption_attempts

Counter

集群中的抢占尝试总数

-

unschedule_task_count

Gauge

无法调度的任务数

labels=["job_id"]

unschedule_job_count

Gauge

无法调度的作业数

-

job_retry_counts

Counter

作业的重试次数

labels=["job_id"]

Volcano 1.0.0版本升级说明

Volcano 1.0.0版本与后续版本不兼容,不支持在控制台升级。如想使用新版本Volcano插件,需要先卸载1.0.0版本,然后再在控制台安装新版本。

执行如下命令可以卸载Volcano。

kubectl delete crd jobs.batch.volcano.sh

kubectl delete crd commands.bus.volcano.sh

版本记录

建议升级到跟集群配套的最新volcano版本。

表4 集群版本配套关系

集群版本

支持的插件版本

v1.25

1.7.1、1.7.2

v1.23

1.7.1、1.7.2

v1.21

1.7.1、1.7.2

v1.19.16

1.3.7、1.3.10、1.4.5、1.7.1、1.7.2

v1.19

1.3.7、1.3.10、1.4.5

v1.17(停止维护)

1.3.7、1.3.10、1.4.5

v1.15(停止维护)

1.3.7、1.3.10、1.4.5

表5 CCE插件版本记录

插件版本

支持的集群版本

更新特性

1.9.1

/v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/

  • 修复networkresource插件计数pipeline pod占用subeni问题
  • 修复binpack插件对资源不足节点打分问题
  • 修复对结束状态未知的pod的资源的处理
  • 优化事件输出
  • 默认高可用部署

1.7.2

/v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/

  • Volcano 支持 Kubernetes 1.25版本
  • 提升Volcano调度性能。

1.7.1

/v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/

Volcano 支持 Kubernetes 1.25版本

1.6.5

/v1.19.*|v1.21.*|v1.23.*/

  • 支持作为CCE的默认调度器
  • 支持混部场景下统一调度

1.4.5

/v1.17.*|v1.19.*|v1.21.*/

  • volcano-scheduler的部署方式由statefulset调整为deployment,修复节点异常时Pod无法自动迁移的问题

1.4.2

/v1.15.*|v1.17.*|v1.19.*|v1.21.*/

  • 修复跨GPU分配失败问题
  • 适配更新后的EAS API

1.3.3

/v1.15.*|v1.17.*|v1.19.*|v1.21.*/

  • 修复GPU异常导致的调度器崩溃问题;修复特权Init容器准入失败问题

1.3.1

/v1.15.*|v1.17.*|v1.19.*/

  • 升级Volcano框架到最新版本
  • 支持Kubernetes 1.19版本
  • 添加numa-aware插件
  • 修复多队列场景下Deployment扩缩容的问题
  • 调整默认开启的算法插件

1.2.5

/v1.15.*|v1.17.*|v1.19.*/

  • 修复某些场景下OutOfcpu的问题
  • 修复queue设置部分capability情况下Pod无法调度问题
  • 支持volcano组件日志时间与系统时间保持一致
  • 修复队列间多抢占问题
  • 修复ioaware插件在某些极端场景下结果不符合预期的问题
  • 支持混合集群

1.2.3

/v1.15.*|v1.17.*|v1.19.*/

  • 修复因为精度不够引发的训练任务OOM的问题
  • 修复CCE1.15以上版本GPU调度的问题,暂不支持任务分发时的CCE版本滚动升级
  • 修复特定场景下队列状态不明的问题
  • 修复特定场景下作业挂载PVC panic的问题
  • 修复GPU作业无法配置小数的问题
  • 添加ioaware插件
  • 添加ring controller
分享:

    相关文档

    相关产品