写点什么

基于 volcano 实现节点真实负载感知调度

  • 2024-01-31
    福建
  • 本文字数:2282 字

    阅读完需:约 7 分钟

背景


默认调度器调度器视某个节点的空闲可调度资源=节点可分配资源 - SUM(节点上已调度 Pod 们的 request),当某个 Pod 处于 pending 状态待调度时,默认调度器根据 Pod 中指定的 request 值和各个节点的空闲可调度资源比较,如果某个节点空闲可调度资源 < pod 的 request 值,则节点不可被调度,反之则可能被调度。

从这里可以看出,默认调度主要是依据各个 pod 创建时设置的 request 值,可能导致:


  • 业务实际负载需要的资源远大于创建时指定的 request 值,导致节点部署过密,影响业务运行稳定性;

  • 业务实际负载需要的资源小于创建时候指定的 request 值,导致节点部署稀疏,造成资源浪费


基于 volcano 节点真实负载感知调度方案介绍


默认调度器基于上述调度策略的主要原因是,k8s 自己没有真实去获取节点真实资源消耗,导致无法实现更合理的节点的空闲可调度资源=节点可分配资源 - 节点真实资源使用。开源 Prometheus 可以获取到各个节点的真实负载情况,基于 volcano 调度插件的能力可以实现基于应用能够基于真实负载调度,在资源满足的情况下,Pod 优先被调度至真实负载低的节点,集群各节点负载趋于均衡。



CCE 集群开启负载感知调度


限制


已创建 v1.21 及以上版本的集群

已安装 Volcano 1.11.14 及以上版本的插件

已安装 CCE 云原生监控插件(kube-prometheus-stack),并选择 server 模式


开启负载感知调度


安装 Volcano 调度器、云原生监控插件(安装 server 模式,agent 模式没有 custom-metrics API)



集群通过 Custom Metrics API 提供资源指标,修改 adapter-config 的 configMap,添加自定义指标采集规则。配置项与密钥->命名空间选择 “monitoring” ->找到 user-adapter-config 点击 “更新”



编辑->添加新规则



- 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])
复制代码


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 平均利用率,如果希望调整平均值的计算周期,可以修改上述标红的 10m。(30s 是分辨率)


Memory 平均利用率采集规则:


node_memory_usage_avg: 表示节点的 Memory 利用率,该指标名不可修改。


metricsQuery:avg_over_time(((1-node_memory_MemAvailable_bytes/<<.Series>>))[10m:30s]) 为节点 Memory 平均利用率的查询语句。


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


新部署 metrics-api-server 负载,使其加载 user-adapter-config 的最新配置



开启负载感知调度能力。配置中心->调度配置->默认调度器”volcano”->资源利用率优化调度->支持负载感知调度




说明:


负载感知调度根据 CPU、Memory 真实负载信息对节点进行打分排序,优先选择负载更低的节点参与调度。


如果我们更偏向于将负载调度到 cpu 真实负载低的节点,或内存真实负载低的节点,可以通过调整权重来影响节点打分,负载优先选择得分最高的节点参与调度


节点打分公式:


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


真实负载阈值,从 CPU 和内存两方面限制节点真实负载的水位,防止节点压力过高,真实负载阈值的生效方式分为“软约束“和“硬约束“


软约束:节点 CPU、内存真实负载达到阈值后,新的任务优先被分配至真实负载未达到阈值的节点,但是该节点依然允许调度。


硬约束:节点 CPU、内存真实负载达到阈值后,该节点不允许调度新的任务。


效果验证


环境准备


创建 1 个负载 cpu:request 0.1 limit 6,使其调度在 “192.168.64.81” 这个节点上,节点 CPU request 的分配率:42.48% 实际占用率 76.9%




创建 1 个负载 cpu:request 4 limit 4,使其调度在 “192.168.64.219” 这个节点上,节点 CPU request 的分配率:91.15% 实际占用率 1.4%




验证未开启负载感知调度时,新建负载的调度情况


创建 1 个负载,CPU request 0.1 limit 0.1 内存 request 100MiB limit 100MiB



查看工作负载的调度情况,发现负载调度到了 cpu request 分配率低,但是实际 CPU 占用率高的节点 “192.168.64.81” 上



再添加 1 个副本,仍然调度到"192.168.64.81"上



验证开启负载感知调度时,新建负载的调度情况


开启负载感知调度,CPU 真实负载阈值设置为 70% 硬约束



创建 1 个负载,CPU request 0.1 limit 0.1 内存 request 100MiB limit 100MiB



信息填写完整后,点击右上角 yaml 创建,添加一行 shcedulerName: volcano



查看工作负载调度情况,发现负载调度到了 cpu request 分配率高,但是实际 CPU 占用率低的节点 “192.168.64.219” 上



再添加 1 个副本,仍然调度在节点 “192.168.64.219” 上


文章转载自:华为云开发者联盟

原文链接:https://www.cnblogs.com/huaweiyun/p/17995835

体验地址:http://www.jnpfsoft.com/?from=001

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
基于volcano实现节点真实负载感知调度_架构_快乐非自愿限量之名_InfoQ写作社区