本文分享自华为云社区《基于volcano实现节点真实负载感知调度》,作者: 可以交个朋友。

背景

默认调度器调度器视某个节点的空闲可调度资源=节点可分配资源 - 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” 上

点击关注,第一时间了解华为云新鲜技术~

基于volcano实现节点真实负载感知调度的更多相关文章

  1. Crane-scheduler:基于真实负载进行调度

    作者 邱天,腾讯云高级工程师,负责腾讯云 TKE 动态调度器与重调度器产品. 背景 原生 kubernetes 调度器只能基于资源的 resource request 进行调度,然而 Pod 的真实资 ...

  2. HAProxy详解(三):基于虚拟主机的HAProxy负载均衡系统配置实例【转】

    一.基于虚拟主机的HAProxy负载均衡系统配置实例 1.通过HAProxy的ACL规则配置虚拟主机: 下面将通过HAProxy的ACL功能配置一套基于虚拟主机的负载均衡系统.这里操作系统环境为:Ce ...

  3. 基于开源Tars的动态负载均衡实践

    一.背景 vivo 互联网领域的部分业务在微服务的实践过程当中基于很多综合因素的考虑选择了TARS微服务框架. 官方的描述是:TARS是一个支持多语言.内嵌服务治理功能,与Devops能很好协同的微服 ...

  4. 基于Nginx反向代理及负载均衡

    基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...

  5. 90-95年CPU功耗感知调度研究

    最近读了三篇1990-1995年的通过调度来降低cpu能耗的文章[1] [2] [3],简单总结一下该年代单核CPU功耗感知的调度策略. Motivation 随着便携式设备逐渐兴起,人们对降低其功耗 ...

  6. Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

    负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesa ...

  7. 反向代理负载均衡调度:nginx

    一.概述 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个 ...

  8. Ignite集群管理——基于Zookeeper的节点发现

    Ignite支持基于组播,静态IP,Zookeeper,JDBC等方式发现节点,本文主要介绍基于Zookeeper的节点发现. 环境准备,两台笔记本电脑A,B.A笔记本上使用VMware虚拟机安装了U ...

  9. 基于Apache和tomcat实现负载均衡

    1.基于Apache和tomcat实现负载均衡 准备三个虚拟机一个安装Apache两个安装Tomcat 关闭防火墙 systemctl stop firewalld Iptabled -F Seten ...

  10. Kubernetes K8S之固定节点nodeName和nodeSelector调度详解

    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

随机推荐

  1. VS Code 2022路线图:大量Spring Boot优化提上日程

    1月20日,一名微软开发者发布了一篇标题为<Java on Visual Studio Code Update>的文章. 文中介绍了VS Code 2021年的亮点,同时还透露了VS Co ...

  2. Qt 的Cmake方式如何创建资源文件和添加类

    CLion(误,QT Creator) 添加资源文件时 选择Qt 然后选择Qt Resource File 单击choose,然后给你的资源文件输入一个名字比如res单击下一步,然后完成,保存 这时候 ...

  3. 针对Python基本数据类型的操作

    在学习Python语法前,请大家务必注意,Python是通过缩进来定义代码层次的,即同一层次的代码都是左对齐,而下个层次的代码块与当前代码块相比,会有4个空格的缩进. 这里缩进的空格数是约定俗成的,当 ...

  4. 应用 Serverless 化,让业务开发心无旁骛

    我们希望让用户做得更少而收获更多,通过Serverless化,用云就像用电一样简单."张建锋表示,Serverless 让云计算从一种资源真正变成一种能力,未来云将全面 Serverless ...

  5. 【驱动】SPI驱动分析(四)-关键API解析

    关键API 设备树 设备树解析 我们以Firefly 的SPI demo 分析下dts中对spi的描述: /* Firefly SPI demo */ &spi1 { spi_demo: sp ...

  6. java项目实践-webapp-mytomcat-day16

    目录 1. http协议 2. 自定义的web框架 3. 具体实现 4. 启动 1. http协议 CS架构 建立连接"三次握手" 断开连接 "四次挥手" 三次 ...

  7. Jackson 使用 @JsonFormat 注解进行时间格式化

    本文为博主原创,未经允许不得转载: 最近帮同事定位了一个现网问题,记录一下: 项目中对所有请求的参数都进行了 Jackson 序列化,在接收请求的实体类字段上使用 @JsonFormat 注解,该注解 ...

  8. Spring Boot+Vue实现汽车租赁系统(毕设)

    一.前言 汽车租赁系统,很常见的一个系统,但是网上还是以前的老框架实现的,于是我打算从设计到开发都用现在比较流行的新框架.想学习或者做毕设的可以私信联系哦!! 二.技术栈 - 后端技术 Spring ...

  9. 【SHELL】在指定格式的文件中查找字符串

    在指定格式的文件中查找字符串 grep -nr "string" --include=*.{c,cpp,h} 在排除指定格式的文件中查找字符串 grep -nr "str ...

  10. Oracle数据库统计信息_执行计划_sharedpool等的知识梳理

    Oracle数据库统计信息_执行计划_sharedpool等的知识梳理 背景 最近有项目出现了年底业务量增加时卡顿的情况. 同事多次发现执行SQL缓慢. 但是重新执行统计信息更新后问题就优化的现象. ...