Kubernetes HPA 基础:工作原理、Metrics Server 与自定义指标、水平扩缩容触发条件
水平 Pod 自动扩缩容(Horizontal Pod Autoscaler,HPA)是 Kubernetes 实现弹性伸缩的核心机制。它通过持续监控工作负载的资源利用率或自定义业务指标,自动调整 Pod 副本数量,使应用始终运行在预期的容量范围内。理解 HPA 的工作原理、指标来源与触发条件是构建容量调优体系的第一步。
HPA 工作原理
HPA 以控制循环(Control Loop)的方式运行,默认每 15 秒从 Metrics Server 或自定义指标 API 拉取一次指标数据,计算期望副本数,并与当前副本数对比,最终通过 Scale 子资源调整 Deployment、StatefulSet 或 ReplicaSet 的副本数。
核心计算逻辑:
期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值))
当指标值超过目标值时,副本数向上取整扩容;低于目标值时,缩容。HPA 内置了冷却机制(Cooldown)和容忍窗口(Tolerance),防止指标抖动导致频繁扩缩。
冷却机制说明:默认扩容冷却时间为 3 分钟,缩容冷却时间为 5 分钟。这意味着 HPA 在触发一次扩缩动作后,必须等待冷却时间结束才能执行下一次扩缩,避免系统震荡。
Metrics Server 与自定义指标
HPA 的指标来源分为三个层级,从基础资源指标到业务自定义指标,覆盖不同的扩缩容场景。
| 指标层级 | 数据来源 | 典型指标 | 适用场景 |
|---|---|---|---|
| 资源指标 | Metrics Server(kubelet cAdvisor) | CPU 使用率、内存使用率 | 通用型工作负载,资源敏感型应用 |
| 自定义指标 | 自定义指标 API(Prometheus Adapter / KEDA) | QPS、请求延迟 P99、队列深度 | 业务驱动型扩缩容,如 Web 服务、消息处理 |
| 外部指标 | 外部指标 API(云厂商或第三方系统) | Kafka 消费延迟、CloudWatch 队列长度 | 依赖外部系统的弹性场景 |
Metrics Server 部署前提:Metrics Server 不是 Kubernetes 默认安装的组件,必须手动部署。它通过 kubelet 的 Summary API 收集每个节点的资源使用数据,聚合后暴露给 HPA。如果集群中未部署 Metrics Server,基于 CPU/内存的 HPA 将无法工作。
水平扩缩容触发条件
HPA 的触发条件由 spec.metrics 字段定义,支持多种指标类型和聚合方式。以下是最常用的三种触发模式:
1. 基于资源指标的触发
直接使用 CPU 或内存的平均利用率(相对于 Pod 的 Request)作为触发条件。这是最基础的 HPA 配置方式。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
2. 基于自定义指标的触发
通过 Prometheus Adapter 或 KEDA 将业务指标暴露给 HPA,实现更精细的弹性策略。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-custom-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
3. 多指标组合触发
HPA 支持同时配置多个指标,系统会分别计算每个指标对应的期望副本数,最终取最大值作为扩缩容依据。
多指标决策逻辑:当 CPU 利用率要求扩容到 8 个副本,而 QPS 指标要求扩容到 12 个副本时,HPA 会选择 12 作为最终副本数。缩容时同样取最大值,确保不会因单一指标下降而过早缩容。
触发条件的关键参数
HPA 的行为不仅取决于指标值,还受以下参数影响,这些参数直接决定了扩缩容的激进程度和稳定性。
| 参数 | 默认值 | 作用 | 调优建议 |
|---|---|---|---|
--horizontal-pod-autoscaler-sync-period |
15s | HPA 控制循环的轮询间隔 | 对延迟敏感的应用可缩短至 10s |
--horizontal-pod-autoscaler-downscale-stabilization |
5m | 缩容稳定窗口,防止频繁缩容 | 突发流量场景可延长至 10m |
--horizontal-pod-autoscaler-tolerance |
0.1 | 容忍度,当前指标与目标指标的偏差比例 | 指标抖动大时可增大至 0.2 |
behavior.scaleUp.stabilizationWindowSeconds |
0 | 扩容稳定窗口(HPA v2 行为配置) | 快速扩容场景保持默认 |
behavior.scaleDown.stabilizationWindowSeconds |
300 | 缩容稳定窗口(HPA v2 行为配置) | 根据业务波动周期调整 |
生产环境最佳实践:在配置 HPA 时,始终设置
minReplicas 和 maxReplicas 的合理边界。minReplicas 应保证基础流量承载,maxReplicas 应防止无限扩容耗尽集群资源。同时,建议为关键业务配置多个指标(如 CPU + QPS),避免单一指标误判。