更新时间: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. 配置volcano默认调度器配置参数,详情请参见表2

    colocation_enable: ''
    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'
        - plugins:
            - name: 'nodelocalvolume'
            - name: 'nodeemptydirvolume'
            - name: 'nodeCSIscheduling'
            - name: 'networkresource'
    表2 Volcano插件配置参数说明

    插件

    功能

    参数说明

    用法演示

    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被驱逐

    -

    -

    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配置

    -

    -

    numaaware

    numa拓扑调度

    weight: 插件的权重

    -

    networkresource

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

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

    -

    nodelocalvolume

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

    -

    -

    nodeemptydirvolume

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

    -

    -

    nodeCSIscheduling

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

    -

    -

  4. 单击“安装”

在控制台中修改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做过修改。如果是,需要把修改内容同步到升级界面里。

版本记录

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

表3 集群版本配套关系

集群版本

支持的插件版本

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

表4 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