更新时间:2024-03-22 GMT+08:00
分享

负载感知调度

Volcano调度器提供节点CPU、Memory的负载感知调度能力,感知集群内节点CPU、Memory的负载情况,将Pod优先调度到负载较低的节点,实现节点负载均衡,避免出现因单个节点负载过高而导致的应用程序或节点故障。

前提条件

功能介绍

原生Kubernetes调度器只能基于资源的申请值进行调度,然而Pod的真实资源使用率,往往与其所申请资源的Request/Limit差异很大,这直接导致了集群负载不均的问题:

  1. 集群中的部分节点,资源的真实使用率远低于资源申请值的分配率,却没有被调度更多的Pod,这造成了比较大的资源浪费。
  2. 集群中的另外一些节点,其资源的真实使用率事实上已经过载,却无法为调度器所感知到,这极大可能影响到业务的稳定性。

Volcano提供基于真实负载调度的能力,在资源满足的情况下,Pod优先被调度至真实负载低的节点,集群各节点负载趋于均衡。

随着集群状态,工作负载流量与请求的动态变化,节点的利用率也在实时变化,为防止Pod调度完成后,集群再次出现负载极端不均衡的情况下,Volcano同时提供重调度能力,通过负载感知和热点打散重调度结合使用,可以获得集群最佳的负载均衡效果。关于热点打散重调度能力的使用请参见重调度(Descheduler)

工作原理

负载感知调度能力由Volcano与CCE云原生监控插件配合完成,开启该能力时,按照Prometheus adapt规则定义负载感知调度所需的CPU、Memory指标信息,CCE云原生监控系统按照定义的指标规则采集并保存各节点的CPU、Memory的真实负载信息,Volcano根据CCE云原生监控系统提供的CPU、Memory真实负载信息对节点进行打分排序,优先选择负载更低的节点参与调度。

负载感知调度能力考虑CPU和Memory两个维度,采用加权平均的方式对个节点打分,包括CPU、Memory资源维度权重和负载感知策略自身权重,优先选择得分最高的节点参与调度。CPU、Memory和插件自身权重可以通过“配置中心>调度配置”自定义配置。

节点得分计算公式: 负载感知策略权重 *((1 - CPU资源利用率) * CPU权重 + (1 - Memory资源利用率) * 内存权重)/(CPU权重 + 内存权重)

  • CPU资源利用率:所有节点最近10分钟的CPU平均利用率,采集频率可通过Prometheus adapt规则进行修改。
  • Memory资源利用率:所有节点最近10分钟的Memory平均利用率

设置负载感知调度

  1. 集群通过Metrics API提供资源指标,并添加自定义指标采集规则。

    安装CCE云原生监控插件后,开启CCE云原生监控插件通过Metrics API提供资源指标的能力,详情请参见通过Metrics API提供资源指标

    添加自定义指标采集规则,详情请参见使用自定义指标创建HPA策略。自定义指标采集规则如下,红色为本次添加的指标采集规则,黑色为已有规则,在已有规则基础上添加红色规则即可。
    rules:
      - seriesQuery: '{__name__=~"node_cpu_seconds_total"}'
        resources:
          overrides:
            instance:
              resource: node
        name:
          matches: node_cpu_seconds_total
          as: node_cpu_usage_avg
        metricsQuery: avg_over_time((1 - avg (irate(<<.Series>>{mode="idle"}[5m])) by (instance))[10m:30s])
      - seriesQuery: '{__name__=~"node_memory_MemTotal_bytes"}'
        resources:
          overrides:
            instance:
              resource: node
        name:
          matches: node_memory_MemTotal_bytes
          as: node_memory_usage_avg
        metricsQuery: avg_over_time(((1-node_memory_MemAvailable_bytes/<<.Series>>))[10m:30s])
    resourceRules:
      cpu:
        containerQuery: sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>,container!="",pod!=""}[1m])) by (<<.GroupBy>>)
        nodeQuery: sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>, id='/'}[1m])) by (<<.GroupBy>>)
        resources:
          overrides:
            instance:
              resource: node
            namespace:
              resource: namespace
            pod:
              resource: pod
        containerLabel: container
      memory:
        containerQuery: sum(container_memory_working_set_bytes{<<.LabelMatchers>>,container!="",pod!=""}) by (<<.GroupBy>>)
        nodeQuery: sum(container_memory_working_set_bytes{<<.LabelMatchers>>,id='/'}) by (<<.GroupBy>>)
        resources:
          overrides:
            instance:
              resource: node
            namespace:
              resource: namespace
            pod:
              resource: pod
        containerLabel: container
      window: 1m
    • CPU平均利用率采集规则
      • node_cpu_usage_avg:表示节点的CPU平均利用率,该指标名不可修改。
      • metricsQuery: avg_over_time((1 - avg (irate(<<.Series>>{mode="idle"}[5m])) by (instance))[10m:30s]):为节点CPU平均利用率的查询语句。

        当前metricsQuery表示查询所有节点最近10分钟的CPU平均利用率,如果希望调整平均值的计算周期为最近5分钟或者30分钟,可以修改上述标红的10m为5m或者30m即可。

    • Memory平均利用率采集规则
      • node_memory_usage_avg:表示节点的Memory利用率,该指标名不可修改。
      • metricsQuery: avg_over_time(((1-node_memory_MemAvailable_bytes/<<.Series>>))[10m:30s]):为节点Memory平均利用率的查询语句。

        当前metricsQuery表示查询所有节点最近10分钟的Memory平均利用率,如果希望调整平均值的计算周期为最近5分钟或者30分钟,可以修改上述标红的10m为5m或者30m即可。

  2. 开启负载感知调度能力。

    安装Volcano后,您可通过“配置中心 > 调度配置”选择开启或关闭负载感知调度能力,默认关闭。
    1. 登录CCE控制台。
    2. 单击集群名称进入集群,在左侧选择“配置中心”,在右侧选择“调度配置”页签。
    3. 在“资源利用率优化调度”配置中,修改负载感知调度配置。

      为达到最优的负载感知调度效果,可以选择关闭装箱(binpack)策略。装箱策略(binpack)根据Pod的Request资源信息,将Pod优先调度到资源消耗较多的节点,在一定程度上会影响负载感知调度的效果。

分享:

    相关文档

    相关产品