如何优化 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 负载配置,添加启动参数
查看 metrics-server 日志发现抓取指标间隔为 15s
四 验证过程
主要是对比优化该参数后,HPA 弹性的速率是否提高。
基于负载 app01 创建伸缩策略,以 cpu 指标为例,HPA 配置清单如下:
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 该做的了。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/3d18aa704450e0986e377328e】。文章转载请联系作者。
评论