记录一下那天晚上的排查过程。K8s 1.25 上给一个 PHP 应用配了 HPA,目标 CPU 60%,ab 压到接口排队,kubectl top pod 显示 CPU 只有 3%,副本数一直停在 2。
刚开始盯着「metrics-server 采样窗口是十五秒,压测刚起量时还没进统计」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。HPA 算的是相对 requests 的使用率,requests 设成 2 核而实际只用 0.06 核,百分比自然很低。少数情况下是应用的瓶颈在外部数据库连接,Pod 自身 CPU 并不高。
另外,多容器 Pod 里 sidecar 的资源没算进去,分母与分子口径不一致。
先看 HPA 当前指标与目标的差距
kubectl describe hpa php-web | sed -n '/Metrics/,$p'
然后核对 requests 与实际用量的比例
kubectl top pod -l app=php-web --containers
随后把 requests 调到贴近真实基线
kubectl set resources deploy php-web --requests=cpu=100m --limits=cpu=500m
压测期间持续观察副本变化
kubectl get hpa php-web -w
怎么算真的好了,看的是同一批现象。压测开始一分钟后 TARGETS 显示百分之六十以上,副本数从 2 涨到 5,接口 P99 回落到三百毫秒以内。
容易忽略的是,requests 写得太大等于把 HPA 的尺子拉长,永远触发不了;CPU 型 HPA 也管不了 IO 瓶颈,连接池类问题要换成自定义指标。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
