装箱调度(Binpack)
装箱调度(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得分的计算流程如下:
首先,对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权重
如图1所示,假设集群中存在两个节点,分别为Node 1和Node 2,当前有一个Pod请求了CPU、内存和GPU资源。在调度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 资源利用率优化调度 - 修改完成后,单击“确认配置”。