写点什么

如何优化 k8s 中 HPA 的弹性速率

  • 2024-01-16
    广东
  • 本文字数:1617 字

    阅读完需:约 5 分钟

如何优化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/v2kind: HorizontalPodAutoscalermetadata:  name: app01  namespace: huspec:  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 该做的了。


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

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
如何优化k8s中HPA的弹性速率_k8s_华为云开发者联盟_InfoQ写作社区