K8s HPA弹性伸缩性能优化之路

举报
可以交个朋友 发表于 2024/01/12 10:59:58 2024/01/12
【摘要】 纵观整个链路如何优化HPA的弹性速率呢?

一 背景

以弹性指标为cpu、memory为例。在Kubernetes 1.7版本中引入了聚合层,允许第三方应用程序注册相关API接口到kube-apiserver上。其中 /apis/metrics.k8s.io/v1beta1 一般由metrics-server程序提供,以插件的形式安装在K8s集群中。相关流程如下:
image.png
纵观整个链路如何优化HPA的弹性速率呢?


二 关键时间点分析

  1. 首先对于HPA controller
    Kubernetes 将HPA pod自动扩缩实现为一个间歇运行的控制回路,间隔由kube-controller-manager的 --horizontal-pod-autoscaler-sync-period参数设置,默认间隔为15s。

  2. 然后kubelet指标汇总。kubelet提供指标端点:10250/metrics/resource 15刷新一次指标数据。容器指标由cadvisor负责采集,cAdvisor已经集成到kubelet程序当中。

  3. metrics-server默认抓取时间为60s一次,60s的时间间隔内,kubelet的指标已经刷新4轮了,HPAcontroller也运行4轮了。

所以我们优化的思路可以从metrics-server程序入手,可以将HPA弹性响应速率提高45s左右。kube-controller-manager的参数不宜修改,设置过短会对集群控制面造成压力,产生过载风险。kubelet刷新指标间隔15s 同样也是一个合理且推荐的数值。


三 优化方案

metrics-server启动参数--metric-resolution可用于设置指标保留的时间。默认是60s,我们可以将该值设置为15s 加快pod资源指标的获取速率。


  1. 未修改指标保存时间前,查看metrics-server日志可以发现平均60s抓取一次指标
    image.png

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

四 验证过程

主要是对比优化该参数后,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弹性的灵敏度
image.png
通过上图我们可以发现,HPA对指标变化感知滞后
其中60s-90s区间内,指标数值一直为250%,未发生变化。实际情况是HPAcontroller已经运转三次,但是每次获取的指标均为250%。

4m-7m15s区间内,每隔60s HPA状态刷新一次,也就是说60s后 HPAcontroller才能感知下游服务的状态变化。

可能大家也会有疑问,在执行 kubectl get xxx -w 的时候,每隔15s也刷新了一次数据,那是因为有其它value值发生了变化,例如REPLICAS值发生了变化,所以被记录了下来,并不是因为指标刷新触发的。


4.2 优化后

对工作负载进行压测,探知HPAcontroller感知metrics的变化并观察HPA弹性的灵敏度
image.png
通过上图我们可以发现,HPA对指标变化的获取提升明显,几乎每隔15s指标都会变化一次,如果获取的指标满足扩容条件则会立马扩容。
其中 60s-90s 区间内,其它选项保持不变(MINPODS、MAXPODS、REPLICAS),指标每隔15s就会刷新一次。HPA会根据当前获取的指标结合特定算法进行扩缩的实例的判断。

其中2m15s-4m 区间内,其它选项保持不变,指标固定每隔15s会刷新一次。

可能大家会有疑问,明明指标已经达到扩容条件了,例如60s那个时间点,这就和HPA算法有关系了,如果存在未就绪状态或者不健康的pod,这些pod会被搁置掉不参与计算,所以75s那个时间,并未看到扩容行为。但是这些动作不与metrics指标层面冲突,metrics-server每隔15s上报一次指标,剩下具体的扩缩就是HPA controller该做的了。


五 关于自定义指标HPA如何优化响应速率

自定义指标HPA相比资源指标(cpu、memory)流程上稍微复杂点,但是主要逻辑不变。流程如下:
image.png


5.1 关键时间点分析

  1. 首先对于HPA controller
    Kubernetes 将HPA pod自动扩缩实现为一个间歇运行的控制回路,间隔由kube-controller-manager的 --horizontal-pod-autoscaler-sync-period参数设置,默认间隔为15s。

  2. prometheus-adapter会查询prometheus获取指标并缓存下来,默认10min会更新一次缓存指标,一般设置为60s,如果需要优化可设置为30s或者15s(通过 启动参数--metrics-relist-interval=30s进行设置),最低不能低于prometheus的指标抓取间隔,否则会出现指标消失问题。

  3. prometheus会定期抓取指标并存储下来。prometheus默认抓取间隔为1m,建议将指标抓取间隔设置为15s。


5.2 组件说明

如果使用华为云CCE,可在插件市场安装云原生监控插件(kube-prometheus-stack),选择server模式。会在monitoring命名空间下一键安装prometheus监控系统,包括prometheus-adapter组件(又名custom-metrics-apiserver)。插件已对相关参数进行优化,例如prometheus-adapter的指标更新时间等

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。