更新时间:2024-09-02 GMT+08:00

装箱调度(Binpack)

装箱调度(Binpack)是一种优化算法,以最小化资源使用量为目标,将资源合理地分配给每个任务,使所有资源都可以实现最大化的利用价值。在集群工作负载的调度过程中使用Binpack调度策略,调度器会优先将Pod调度到资源消耗较多的节点,减少各节点空闲资源碎片,提高集群资源利用率。

前提条件

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权重
图1 Binpack策略示例

如图所示,集群中存在两个节点,分别为Node 1和Node 2,在调度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

    节点总得分按照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

  2. 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策略在整体调度中的影响力。

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“配置中心”,在右侧选择“调度配置”页签。
  3. “资源利用率优化调度”配置中,启用装箱策略 (binpack)。

    表1 装箱策略权重配置

    名称

    说明

    默认值

    装箱调度策略权重

    增大该权重值,可提高装箱策略在整体调度中的影响力。

    10

    CPU权重

    增大该权重值,优先提高集群CPU利用率。

    1

    内存权重

    增大该权重值,优先提高集群Memory利用率。

    1

    自定义资源类型

    指定Pod请求的其他自定义资源类型,例如nvidia.com/gpu。增大该权重值,优先提高指定资源的利用率。

    -

    图2 资源利用率优化调度

  4. 修改完成后,单击“确认配置”