如何优化k8s中HPA的弹性速率
本文分享自华为云社区《K8s 核心资源指标HPA性能优化之路》,作者:可以交个朋友。
一 背景
以弹性指标为cpu、memory为例。在Kubernetes 1.7版本中引入了聚合层,允许第三方应用程序注册相关API接口到kube-apiserver上。其中 /apis/metrics.k8s.io/v1beta1 一般由metrics-server程序提供,以插件的形式安装在K8s集群中。相关流程如下:
纵观整个链路如何优化HPA的弹性速率呢?
二 关键时间点分析
首先对于HPA controller
Kubernetes 将HPA pod自动扩缩实现为一个间歇运行的控制回路,间隔由kube-controller-manager的 --horizontal-pod-autoscaler-sync-period参数设置,默认间隔为15s。
然后kubelet指标汇总。kubelet提供指标端点:10250/metrics/resource 15刷新一次指标数据。容器指标由cadvisor负责采集,cAdvisor已经集成到kubelet程序当中。
metrics-server默认抓取时间为60s一次,60s的时间间隔内,kubelet的指标已经刷新4轮了,HPAcontroller也运行4轮了。
所以我们优化的思路可以从metrics-server程序入手,可以将HPA弹性响应速率提高45s左右。kube-controller-manager的参数不宜修改,设置过短会对集群控制面造成压力,产生过载风险。kubelet刷新指标间隔15s 同样也是一个合理且推荐的数值。
三 优化方案
metrics-server启动参数--metric-resolution可用于设置指标保留的时间。默认是60s,我们可以将该值设置为15s 加快pod资源指标的获取速率。
未修改指标保存时间前,查看metrics-server日志可以发现平均60s抓取一次指标

修改metrics-server负载配置,添加启动参数
containers:
- command:
- /metrics-server
- --metric-resolution=15s # 添加该参数,加快指标更新速率
- --v=6 # 可设置日志级别,可以通过日志查看进程工作信息
- xxx
查看metrics-server日志发现抓取指标间隔为15s

四 验证过程
主要是对比优化该参数后,HPA弹性的速率是否提高。
基于负载app01创建伸缩策略,以cpu指标为例,HPA配置清单如下:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app01
namespace: hu
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app01
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
4.1 优化前
对工作负载进行压测,探知HPAcontroller感知metrics的变化并观察HPA弹性的灵敏度

通过上图我们可以发现,HPA对指标变化感知滞后:
其中60s-90s区间内,指标数值一直为250%,未发生变化。实际情况是HPAcontroller已经运转三次,但是每次获取的指标均为250%。
4m-7m15s区间内,每隔60s HPA状态刷新一次,也就是说60s后 HPAcontroller才能感知下游服务的状态变化。
可能大家也会有疑问,在执行 kubectl get xxx -w 的时候,每隔15s也刷新了一次数据,那是因为有其它value值发生了变化,例如REPLICAS值发生了变化,所以被记录了下来,并不是因为指标刷新触发的。
4.2 优化后
对工作负载进行压测,探知HPAcontroller感知metrics的变化并观察HPA弹性的灵敏度

通过上图我们可以发现,HPA对指标变化的获取提升明显,几乎每隔15s指标都会变化一次,如果获取的指标满足扩容条件则会立马扩容。
其中 60s-90s 区间内,其它选项保持不变(MINPODS、MAXPODS、REPLICAS),指标每隔15s就会刷新一次。HPA会根据当前获取的指标结合特定算法进行扩缩的实例的判断。
其中2m15s-4m 区间内,其它选项保持不变,指标固定每隔15s会刷新一次。
可能大家会有疑问,明明指标已经达到扩容条件了,例如60s那个时间点,这就和HPA算法有关系了,如果存在未就绪状态或者不健康的pod,这些pod会被搁置掉不参与计算,所以75s那个时间,并未看到扩容行为。但是这些动作不与metrics指标层面冲突,metrics-server每隔15s上报一次指标,剩下具体的扩缩就是HPA controller该做的了。
如何优化k8s中HPA的弹性速率的更多相关文章
- k8s 中的 Pod 细节了解
k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...
- 容器编排系统K8s之HPA资源
前文我们了解了用Prometheus监控k8s上的节点和pod资源,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14287942.html:今天我们来了解下 ...
- 一:优化Docker中的Spring Boot应用:单层镜像方法
优化Docker中的Spring Boot应用:单层镜像方法 1.Docker关键概念 2.镜像层内容很重要 3.镜像层影响部署 4.Docker中的Spring Boot应用 5.单层方法 5.1 ...
- k8s中部署springcloud
安装和配置数据存储仓库MySQL 1.MySQL简介 2.MySQL特点 3.安装和配置MySQL 4.在MySQL数据库导入数据 5.对MySQL数据库进行授权 1.MySQL简介 MySQL 是一 ...
- 不使用pvc的方式在K8S中部署apisix-gateway
不使用pvc的方式在K8S中部署apisix-gateway 简介 我的apisix使用etcd作为数据存储服务器,官方的使用pvc方式或者docker-compose的方式,对于新手不太友好,本篇是 ...
- K8S中部署apisix(非ingress)
不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构,现在做技术储备,之前公司项目使用的ocelot做网关,ocelot是.net平台下的一个网关,也是很不错,但是 ...
- 优化Web中的性能
优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...
- k8s中yaml文常见语法
在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...
- 新版的K8S中的flannel.yaml文件中要注意的细节
部署flannel作为k8s中的网络插件,yaml文件都大小同异. 但在要注意以下细节. 以前,只需要前面master判断. 现在也需要有not-ready状态了. tolerations: - ke ...
- 转 docker创建私有仓库和k8s中使用私有镜像
docker私有仓库建立 环境说明我们选取192.168.5.2做私有仓库地址yum install docker -y1.启动docker仓库端口服务 docker run -d -p 5000:5 ...
随机推荐
- 🔥🔥Java开发者的Python快速进修指南:函数基础
话不多说,今天我们要介绍的是函数.本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别.与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用"d ...
- require()、import、import()有哪些区别?
require().import.import()是我们常用的引入模块的三种方式,代码中几乎处处用到.如果对它们存在模糊,就会在工作过程中不断产生困惑,更无法做到对它们的使用挥洒自如.今天我们来一起捋 ...
- 文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题
六.用go语言,考虑一棵二叉搜索树 T ,其关键字互不相同.证明:如果 T 中一个结点 x 的右子树为空,且 x 有一个后继 y ,那么 y 一定是 x 的最底层祖先,并且其左孩子也是 x 的祖先.( ...
- 构建一个语音转文字的WebApi服务
构建一个语音转文字的WebApi服务 简介 由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装 ...
- Nacos 配置中心源码
客户端 入口 在引入配置中心 maven 依赖的 jar 文件中找到 spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar!/META ...
- 【UniApp】-uni-app-数据缓存
前言 好,经过上个章节的介绍完毕之后,给大家补充了一下 uni-app-数据传递的内容 那么补充了 uni-app-数据传递的内容之后,这篇文章来给大家介绍一下 uni-app-数据缓存 搭建项目 首 ...
- ClickHouse(18)ClickHouse集成ODBC表引擎详细解析
目录 创建表 用法示例 资料分享 参考文章 ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库. 为了安全地实现 ODBC 连接,ClickHouse 使用了一个独立程序 ...
- 华企盾DSC防泄密客户端安装卡住
解决方法: 1.安装了杀毒或者同行软件,退出后安装不行的话卸载掉 2.注册表编辑被管理员禁用,导致客户端安装时一直卡住,启用注册表编辑(后续2021.6.21后发布的版本可直接安装) 由于安装了卡巴斯 ...
- 数字孪生和GIS融合会为各自带来什么样的改变?
数字孪生和地理信息系统(GIS)是两个强大的技术,它们在各自领域发挥着重要作用.而当数字孪生与GIS融合时,将会为它们带来更加深远的改变和增益. 数字孪生技术以数字化的方式模拟和复制现实世界中的物理对 ...
- 38. 干货系列从零用Rust编写负载均衡及代理,负载均衡中ip通行与禁止
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...