你好,最近用WPS总会会遇到未知的问题,突然闪退,没有保存的东西全部都没有了
741
2022-05-30
【背景】
安装华为云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(其他指标)获取度量值,根据伸缩算法,实现动态水平扩缩容。
HPA扩缩容按照Pod 水平自动扩缩算法如下:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
【案例分析】
用户反馈设置CPU和内存的HPA阈值为80%,但是某些POD在并未达到80%时发生了扩容,并且长时间未缩容,截图如下:
问题分析:
从用户的截图看到记录如上:
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。
弹性伸缩 AS Kubernetes
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。