HPA 不扩容不一定是控制器故障。CPU 利用率目标以 requests.cpu 为分母,指标缺失、请求值为空或伸缩窗口限制都会让期望副本与直觉不同。
先读 HPA 决策
kubectl describe hpa api -n production
kubectl get hpa api -n production -w
kubectl top pod -n production -l app=api
kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/production/pods
关注 current/target、Conditions 和 Events。FailedGetResourceMetric 指向指标或 request 配置,ScalingLimited 则说明 min/max 或速率策略限制了结果。
核对工作负载
kubectl get deploy api -n production -o jsonpath='{.spec.template.spec.containers[*].resources}'
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl logs -n kube-system deploy/metrics-server --since=15m
多容器 Pod 中任一相关容器缺少 request,都可能使资源指标无法计算。自定义指标还要继续检查 adapter 查询和标签映射。
避免抖动
- 根据启动时间配置合理的 scaleUp 策略
- 为 scaleDown 设置稳定窗口,避免瞬时低谷缩容
- 不把 HPA 与固定副本的自动化同时作为控制源
- 容量规划要考虑扩容延迟和集群剩余资源
收尾清单
用可控压测验证触发、扩容、流量接入和回落全过程。记录指标延迟、期望副本和实际就绪副本,而不只看 Deployment replicas。