Pod弹性伸缩常见问题解析

举报
云技术搬运工 发表于 2020/11/18 10:13:29 2020/11/18
【摘要】 安装华为云mertic-server插件,并配置HPA策略后;可根据实时监控,动态扩缩容Pod实例数,此文档主要分析HPA的弹性算法。

【背景】

安装华为云mertic-server插件,并配置HPA策略后;可根据实时监控,动态扩缩容Pod实例数。此文档主要分析HPA的弹性算法,文档结构如下:

1) HPA原理

2) 案例分析

3) 使用扩展

                   

【HPA原理】

名词讲解:

HPA:Pod 水平自动扩缩(Horizontal Pod Autoscaler),用户设置扩缩容规则(cpu和内存使用率),利用mertric-server插件能力,实现pod根据业务量弹性变动

 

工作原理:

Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现,控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器构成。每个周期内(默认是15s),控制器管理器根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率,然后控制器管理器从资源度量指标 API(按 Pod 统计的资源用量)和自定义度量指标 API(其他指标)获取度量值,根据伸缩算法,实现动态水平扩缩容。

1.png 


HPA扩缩容按照Pod 水平自动扩缩算法如下:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]


【案例分析】

用户反馈设置CPU和内存的HPA阈值为80%,但是某些POD在并未达到80%时发生了扩容,并且长时间未缩容,截图如下:

2.png

 

问题分析:

从用户的截图看到记录如上:

ScalingActive   True  validMetricFound the HPA was able to successfully calculate ……………

ScalingLimited  False  DesireWithinRange the desire count is within the acceptable range

看到最后一条信息副本数变化为False,期望的副本数在可接受范围内,不工作了

 

定位思路:

未缩容策略中对应的服务指标如下:

当前指标:52%,期望指标:80%,当前副本数:2

伸缩目标: (52% / 80% * 2)=1.3向上取整为2,即当前值为2,伸缩最终副本数目标还是2,所以未触发扩缩容,也印证了日志报错:ScalingLimited  False  DesireWithinRange the desire count is within the acceptable range

用户扩缩容成功的实例:

当前指标:53%,期望指标:80%,当前副本数:3

缩容目标: (53% / 80% * 3)=1.9 向上取整为2所以缩容了

 

【使用扩展】

HorizontalPodAutoscaler 指定的是targetAverageValue 或 targetAverageUtilization, 那么将会把指定 Pod 度量值的平均值做为 currentMetricValue,此时无法将如下类型的指标 Pod 统计进去:

1:所有被标记了删除时间戳(Pod 正在关闭过程中)的 Pod 和 失败的 Pod 都会被忽略,即在界面或者命令行看到状态为terminating或者error的pod,这种不会被统计到,hpa不会采集;

2:如果某个 Pod 缺失度量值,它将会被搁置,只在最终确定扩缩数量时再考虑,即如果这个pod未设置limit和request,这种不会被统计到,hpa不会采集;

3:当使用 CPU 指标来扩缩时,任何还未就绪(例如还在初始化)状态的Pod最近的指标 度量值采集于就绪状态前的 Pod,该 Pod 也会被搁置。即pod如果应为其他原因未就绪,一直处于containercreating或者pending,这种不会被统计到,hpa不会采集;

4:Pod 水平扩缩控制器无法准确的知道 Pod 什么时候就绪, 也就无法决定是否暂时搁置该 Pod。 --horizontal-pod-autoscaler-initial-readiness-delay 参数(默认为 30s)用于设置 Pod 准备时间, 在此时间内的 Pod 统统被认为未就绪。 --horizontal-pod-autoscaler-cpu-initialization-period 参数(默认为5分钟) 用于设置 Pod 的初始化时间, 在此时间内的 Pod,CPU 资源度量值将不会被采纳。在排除掉被搁置的 Pod 后,扩缩比例就会根据currentMetricValue/desiredMetricValue 计算出来;

5:直接操控副本控制器执行滚动升级时,HPA 不能工作, 也就是说你不能将 HPA 绑定到某个 RC 再执行滚动升级 (例如使用 kubectl rolling-update 命令)。HPA 不能工作的原因是它无法绑定到滚动更新时所新创建的副本控制器,因此建议服务自身滚动升级过程中,停掉HPA的扩容策略,待服务更新升级完,在重新配置。

综合而言,hpa计算采集的pod,必须是处于running状态的pod,在服务升级过程中,建议关闭hpa。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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