为何Kubernetes HPA测试中Pod CPU利用率会超100%达305%?
问题描述
我创建了一个简单的php-apache应用以测试Horizontal Pod Autoscaler(HPA)的工作机制。部署HPA时设置目标CPU利用率为50%,最小Pod数1,最大Pod数10,执行以下命令生成负载:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
2分钟后,我观察到目标CPU利用率超过了100%,具体HPA状态如下:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
请问CPU利用率为何能够超过100%?
原因解析
CPU利用率超过100%主要来自以下几个关键因素:
- HPA的响应延迟:HPA不是实时处理负载变化的,它默认每15秒采集一次CPU指标,接着计算扩容需求,再触发Deployment的扩容流程。从指标采集到新Pod完全就绪需要一段周期,这段时间里现有Pod的CPU会持续被高负载压榨,利用率自然突破阈值。
- 基于CPU请求的计算逻辑:HPA显示的CPU利用率是相对于Pod的**CPU请求(request)**计算的。如果你的php-apache Pod设置的CPU request数值较小,当实际负载远超这个请求值时,利用率就会超过100%。比如Pod的CPU request是0.1核,实际占用0.3核,利用率就是300%。
- 负载增长远快于扩容速度:你使用的负载生成命令是每隔0.01秒发起一次请求,这种高频请求会瞬间把单个Pod的CPU占满。而新Pod启动需要经历拉取镜像、初始化容器等步骤,在新Pod就绪前,所有负载都压在现有Pod上,导致利用率飙升。
- 指标采样的时间差:HPA计算的是一段时间内的平均CPU利用率,但如果负载突然暴增,实时的利用率会远高于平均计算值,你看到的305%就是最新采样的实时利用率,此时HPA还没完成扩容动作。
内容的提问来源于stack exchange,提问作者Rajeev KR
相关产品推荐
相关产品推荐

