装箱调度(Binpack)
装箱调度(Binpack)是一种优化算法,以最小化资源使用量为目标,将资源合理地分配给每个任务,使所有资源都可以实现最大化的利用价值。在集群工作负载的调度过程中使用Binpack调度策略,调度器会优先将Pod调度到资源消耗较多的节点,减少各节点空闲资源碎片,提高集群资源利用率。
前提条件
- 已创建v1.19及以上版本的集群,详情请参见购买Standard/Turbo集群。
- 已安装Volcano插件,详情请参见Volcano调度器。
Binpack功能介绍
Binpack调度算法的目标是尽量把已有的节点填满(即尽量不往空白节点分配)。具体实现上,Binpack调度算法为满足调度条件的节点打分,节点的资源利用率越高得分越高。Binpack算法能够尽可能填满节点,将应用负载靠拢在部分节点,这非常有利于集群节点的自动扩缩容功能。
Binpack为调度器的多个调度插件之一,与其他插件共同为节点打分,用户可以自定义该插件整体权重和各资源维度打分权重,用以提高或降低Binpack在整体调度中的影响力。调度器在计算Binpack策略得分时,会考虑Pod请求的各种资源,如:CPU、Memory和GPU等扩展资源,并根据各种资源所配置的权重做平均。
Binpack算法原理
Binpack在对一个节点打分时,会根据Binpack插件自身权重和各资源设置的权重值综合打分。首先,对Pod请求资源中的每类资源依次打分,以CPU为例,CPU资源在待调度节点的得分信息如下:
CPU.weight * (request + used) / allocatable
即CPU权重值越高,得分越高,节点资源使用量越满,得分越高。Memory、GPU等资源原理类似。其中:
- CPU.weight为用户设置的CPU权重
- request为当前Pod请求的CPU资源量
- used为当前节点已经分配使用的CPU量
- allocatable为当前节点CPU可用总量
通过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权重
如图所示,集群中存在两个节点,分别为Node 1和Node 2,在调度Pod时,Binpack策略对两个节点分别打分。
假设集群中CPU.weight配置为1,Memory.weight配置为1,GPU.weight配置为2,binpack.weight配置为5。
- 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
节点总得分按照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
- 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
Node 2在Binpack策略下的得分:5 * (1 + 0.75 + 2)/(1 + 1 + 2)* 100 = 468.75
综上,Node 2得分大于Node 1,按照Binpack策略,Pod将会优先调度至Node 2。
配置装箱调度策略
安装Volcano后,Binpack策略默认生效。如果默认配置无法达到您降低资源碎片的目标,可以通过“配置中心 > 调度配置”页面自定义Binpack策略权重和各资源维度权重值,增加或降低Binpack策略在整体调度中的影响力。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“配置中心”,在右侧选择“调度配置”页签。
- 在“资源利用率优化调度”配置中,启用装箱策略 (binpack)。
表1 装箱策略权重配置 名称
说明
默认值
装箱调度策略权重
增大该权重值,可提高装箱策略在整体调度中的影响力。
10
CPU权重
增大该权重值,优先提高集群CPU利用率。
1
内存权重
增大该权重值,优先提高集群Memory利用率。
1
自定义资源类型
指定Pod请求的其他自定义资源类型,例如nvidia.com/gpu。增大该权重值,优先提高指定资源的利用率。
-
图2 资源利用率优化调度
- 修改完成后,单击“确认配置”。