华为云云容器引擎CCE | Volcano调度篇:装箱调度(Binpack)
华为云云容器引擎CCE支持多种资源与任务调度策略,有助于提升应用性能和集群整体资源利用率,CPU资源调度、GPU/NPU异构资源调度以及Volcano调度的主要功能。本系列文章将介绍Volcano调度在华为云云容器引擎CCE中的运用。
Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性,提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力。

装箱调度(Binpack)是一种优化算法,以最小化资源使用量为目标,将资源合理地分配给每个任务,使所有资源都可以实现最大化的利用价值。在集群工作负载的调度过程中使用Binpack调度策略,调度器会优先将Pod调度到资源消耗较多的节点,减少各节点空闲资源碎片,提高集群资源利用率。
前提条件
✅ 已创建v1.19及以上版本的集群,详情请参见购买Standard/Turbo集群。
✅ 已安装Volcano插件,详情请参见Volcano调度器。
Binpack功能介绍
Binpack调度算法的目标是最大限度地填满现有节点,尽量避免将Pod调度至空闲节点。具体实现中,调度器会对所有满足条件的节点进行打分,资源利用率越高,得分越高,调度优先级也越高。Binpack算法能够尽可能填满节点,将应用负载靠拢在部分节点,这非常有利于集群节点的自动扩缩容功能。
Binpack为Volcano调度器的多个调度插件之一,与其他调度插件协同工作,共同影响节点的最终得分。用户可自定义Binpack插件的全局权重,并分别为CPU、内存基础资源以及 GPU、NPU等扩展资源配置打分权重,从而控制Binpack在调度决策中的影响程度。在计算Binpack得分时,调度器会综合考虑Pod所请求的各类资源,并基于各资源的打分权重进行加权平均,以确定节点的最终得分。
Binpack算法原理
在对节点打分时,Binpack会结合插件的全局权重和各资源维度(如CPU、内存、GPU等)的权重值,计算出节点Binpack得分。节点Binpack得分的计算流程如下:
1️⃣ 首先,对Pod请求资源中的每类资源依次打分,以CPU为例,CPU资源在待调度节点的得分信息如下:
CPU.weight * (request + used) / allocatable
即CPU权重值越高,得分越高,节点资源使用量越满,得分越高。Memory、GPU等资源原理类似。其中:
- CPU.weight为用户设置的CPU权重
- request为当前Pod请求的CPU资源量
- used为当前节点已经分配使用的CPU量
- allocatable为当前节点CPU可用总量
2️⃣ 通过Binpack策略的节点总得分如下:
binpack.weight * (CPU.score + Memory.score + GPU.score) / (CPU.weight+ Memory.weight+ GPU.weight) * 100
即binpack插件的权重值越大,得分越高,某类资源的权重越大,该资源在打分时的占比越大。其中:
- binpack.weight为用户设置的装箱调度策略权重
- CPU.score为CPU资源得分,CPU.weight为CPU权重
- Memory.score为Memory资源得分,Memory.weight为Memory权重
- GPU.score为GPU资源得分,GPU.weight为GPU权重

图1 Binpack策略示例
3️⃣ 如图1所示,假设集群中存在两个节点,分别为Node 1和Node 2,当前有一个Pod请求了CPU、内存和GPU资源。在调度Pod时,Binpack策略将对两个节点进行打分。
假设集群中CPU.weight配置为1,Memory.weight配置为1,GPU.weight配置为2,binpack.weight配置为5。
1、Binpack对Node 1的打分信息如下:
各资源按照公式计算得分,具体信息如下:
- CPU Score:CPU.weight * (request + used) / allocatable = 1 * (2 + 4)/ 8 = 0.75
- Memory Score:Memory.weight * (request + used) / allocatable = 1 * (4 + 8) / 16 = 0.75
- GPU Score: GPU.weight * (request + used) / allocatable = 2 * (4 + 4)/ 8 = 2
2、节点总得分按照 binpack.weight * (CPU.score + Memory.score + GPU.score) / (CPU.weight+ Memory.weight+ GPU.weight) * 100 公式进行计算,具体如下:
假设binpack.weight配置为5,Node 1在Binpack策略下的得分:5 * (0.75 + 0.75 + 2)/(1 + 1 + 2)* 100 = 437.5
3、Binpack对Node 2的打分信息如下:
- CPU Score:CPU.weight * (request + used) / allocatable = 1 * (2 + 6)/ 8 = 1
- Memory Score:Memory.weight * (request + used) / allocatable = 1 * (4 + 8) / 16 = 0.75
- GPU Score:GPU.weight * (request + used) / allocatable = 2 * (4 + 4)/ 8 = 2
4、Node 2在Binpack策略下的得分:5 * (1 + 0.75 + 2)/(1 + 1 + 2)* 100 = 468.75
4️⃣ 综上,Node 2得分大于Node 1,按照Binpack策略,Pod将会优先调度至Node 2。
配置装箱调度策略
安装Volcano后,Binpack策略默认生效。如果默认配置无法达到您降低资源碎片的目标,可以通过“配置中心 > 调度配置”页面自定义Binpack策略权重和各资源维度权重值,增加或降低Binpack策略在整体调度中的影响力。
1、登录CCE控制台,单击集群名称进入集群。
2、在左侧选择“配置中心”,在右侧选择“调度配置”页签。
3、在“资源利用率优化调度”配置中,启用装箱策略 (binpack)。
| 名称 | 说明 | 默认值 |
| 装箱调度策略权重 | 增大该权重值,可提高装箱策略在整体调度中的影响力。 | 10 |
| CPU权重 | 增大该权重值,优先提高集群CPU利用率。 | 1 |
| 内存权重 | 增大该权重值,优先提高集群Memory利用率。 | 1 |
| 自定义资源类型 | 指定Pod请求的其他自定义资源类型,例如nvidia.com/gpu。增大该权重值,优先提高指定资源的利用率。 | - |
4、

图2 资源利用率优化调度
5、修改完成后,单击“确认配置”。
📌 更多Volcano云原生批量计算 技术应用,请访问社区仓库或官网:
1️⃣ Volcano云原生批量计算社区官网:https://volcano.sh
2️⃣ Volcano GitHub 仓库: https://github.com/volcano-sh/volcano
3️⃣ Volcano云原生批量计算公开课:https://edu.huaweicloud.com/roadmap/cloudnative.html
4️⃣ 华为云云容器引擎CCE:https://www.huaweicloud.com/product/cce.html
Volcano 是业界首个云原生批量计算引擎,也是 CNCF 首个和唯一的批量计算项目。项目主要用于 AI、大数据、基因、渲染等诸多高性能计算场景,对主流通用计算框架均有很好的支持。目前,Volcano在人工智能、大数据、基因测序等海量数据计算和分析场景已得到快速应用,已完成对 Spark、Flink、Ray、 Tensorflow、PyTorch、Argo、MindSpore、Paddlepaddle 、Kubeflow、MPI、Horovod、Mxnet、KubeGene 等众多主流计算框架的支持,并构建起完善的上下游生态。
更多云原生技术动向
关注容器魔方
- 点赞
- 收藏
- 关注作者

评论(0)