linux中kubernetes hpa通过将流量转化为qps等可观测指标实现自动缩容,需依赖metrics server和custom metrics adapter,并配置resource requests及hpa的stabilizationwindowseconds等参数确保缩容生效。

在 Linux 环境中通过 Kubernetes 的 Horizontal Pod Autoscaler(HPA)实现“根据流量”自动缩容,核心不是直接识别“流量”本身,而是将流量转化为可观测、可采集的指标(如 QPS、请求延迟、HTTP 错误率等),再让 HPA 基于这些指标动态调整 Pod 副本数——缩容自然发生在负载持续下降、指标低于阈值之后。
确认基础依赖已就绪
HPA 不能凭空工作,需确保以下组件已部署并正常运行:
- Metrics Server:必须安装,用于采集 CPU、内存等内置资源指标;它是 HPA 的默认数据源
-
Custom Metrics Adapter(如 Prometheus Adapter 或 kube-metrics-server + Prometheus):若要用“QPS”“请求数”等业务流量指标,必须通过它把 Prometheus 中的指标暴露给 Kubernetes metrics API(
custom.metrics.k8s.io) - 目标工作负载已正确配置 resource requests:哪怕只用自定义指标,Pod 的容器也建议设置 CPU/Memory request,否则部分监控链路或调度行为可能异常
用流量指标(如 QPS)配置 HPA
假设你已用 Prometheus 抓取了服务每秒请求数(例如指标名为 http_requests_total,按 route 和 status 维度聚合),可通过如下 HPA v2 YAML 实现基于 QPS 的扩缩容:
注意:这里以平均每 Pod 每秒处理 100 个请求为扩容触发点,缩容则在均值稳定低于 50 后发生(由 HPA 内置的缩容延迟控制)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: http_requests_total
selector:
matchLabels:
route: "/order"
target:
type: AverageValue
averageValue: 100 # 每 Pod 平均每秒 100 请求 → 触发扩容
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # 连续 5 分钟低于阈值才开始缩容
policies:
- type: Percent
value: 10
periodSeconds: 60
验证缩容是否真正生效
缩容不是瞬间完成的,它受多个机制约束。执行后请检查:
-
查看 HPA 当前状态:
kubectl get hpa api-server-hpa -o wide,关注CURRENT REPLICAS和TARGETS列,确认实际指标值是否已低于设定目标 -
检查缩容延迟是否满足:HPA 默认有 5 分钟稳定窗口(
stabilizationWindowSeconds),即指标需持续低于目标值这么久,才会真正减少副本数 -
观察事件日志:
kubectl describe hpa api-server-hpa,查找类似scale-down: scaled down deployment api-server from 8 to 6的事件 -
确认底层 Deployment 已响应:
kubectl get deploy api-server,看READY和AVAILABLE数量是否同步下降
关键注意事项
避免缩容“失灵”或“过激”,需留意:
- HPA 不会缩容到低于
minReplicas,即使指标为 0;也不允许缩容后导致 Pod 不可用(如滚动更新中) - 若使用
AverageValue类型,务必确保指标是“每 Pod”粒度的聚合(如用rate(http_requests_total[1m]) by (pod)),否则平均值无意义 - 缩容行为受
behavior.scaleDown严格限制,不配置时采用默认策略(保守缩容),生产环境建议显式设置stabilizationWindowSeconds和policies - DaemonSet、Static Pod 等无法被 HPA 管理;StatefulSet 支持但需注意有序性影响











