volcano
插件简介
Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性。
Volcano提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力,通过接入AI、大数据、基因、渲染等诸多行业计算框架服务终端用户。(目前Volcano项目已经在Github开源)
Volcano针对计算型应用提供了作业调度、作业管理、队列管理等多项功能,主要特性包括:
- 丰富的计算框架支持:通过CRD提供了批量计算任务的通用API,通过提供丰富的插件及作业生命周期高级管理,支持TensorFlow,MPI,Spark等计算框架容器化运行在Kubernetes上。
- 高级调度:面向批量计算、高性能计算场景提供丰富的高级调度能力,包括成组调度,优先级抢占、装箱、资源预留、任务拓扑关系等。
- 队列管理:支持分队列调度,提供队列优先级、多级队列等复杂任务调度能力。
安装插件
安装Volcano插件,本地集群暂不支持多可用区部署和配置插件实例节点亲和策略。
本地集群安装Volcano插件后,创建负载只能通过yaml设置为volcano调度。
- 登录UCS控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,找到Volcano,单击“安装”。
- 该插件可配置“单实例”、“高可用”或自定义规格。
选择自定义时,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
- CPU申请值:计算“目标节点数 * 目标Pod规模”的值,并在表1中根据“集群节点数 * Pod规模”的计算值进行插值查找,向上取最接近规格的申请值及限制值。
- 选择插件实例是否多可用区部署。
- 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
- 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。
- 配置插件实例节点亲和策略。
- 指定节点调度:指定插件实例部署的节点 ,若不指定,将根据集群默认调度策略进行随机调度。
- 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。自定义亲和策略详情请参见调度策略(亲和与反亲和)
- 配置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插件配置参数说明 插件
功能
参数说明
用法演示
resource_exporter_enable
收集节点numa拓扑信息
参数值:
- true:表示可以查看当前节点的numa拓扑信息。
- false:表示关闭当前节点的numa拓扑信息。
-
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.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组件异常节点
-
-
- 单击“安装”。
在控制台中修改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配置
假如在某场景下希望插件升级后时沿用原配置,可参考以下步骤:
- 查看原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
- 在控制台“参数配置”中填写自定义修改的内容:
{ "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及以上版本。
指标名称 |
指标类型 |
描述 |
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版本。
集群版本 |
支持的插件版本 |
---|---|
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 |
插件版本 |
支持的集群版本 |
更新特性 |
---|---|---|
1.9.1 |
/v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/ |
|
1.7.2 |
/v1.19.16.*|v1.21.*|v1.23.*|v1.25.*/ |
|
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.*/ |
|
1.4.5 |
/v1.17.*|v1.19.*|v1.21.*/ |
|
1.4.2 |
/v1.15.*|v1.17.*|v1.19.*|v1.21.*/ |
|
1.3.3 |
/v1.15.*|v1.17.*|v1.19.*|v1.21.*/ |
|
1.3.1 |
/v1.15.*|v1.17.*|v1.19.*/ |
|
1.2.5 |
/v1.15.*|v1.17.*|v1.19.*/ |
|
1.2.3 |
/v1.15.*|v1.17.*|v1.19.*/ |
|