2. HPA 基础回顾:工作原理、核心指标与伸缩策略
Horizontal Pod Autoscaler(HPA)是 Kubernetes 中实现工作负载弹性伸缩的核心控制器。在生产环境中,HPA 的稳定性直接决定了服务能否平稳应对流量波动。本节从工作原理、指标体系与伸缩策略三个维度进行系统回顾,为后续的故障注入与复测打下理论基础。
2.1 HPA 工作原理
HPA 采用控制循环(Control Loop)模式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)从 Metrics Server 或自定义指标 API 拉取当前 Pod 的指标数据,计算期望副本数,并与当前副本数进行比较,最终通过 Scale 子资源调整 Deployment / StatefulSet 的副本数。
核心计算逻辑:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
HPA 控制器在决策时会引入冷却(Cooldown)与容忍窗口(Tolerance)机制,避免因指标抖动导致频繁扩缩容(即“抖动”现象)。默认容忍度为 0.1(10%),即当期望副本数与当前副本数偏差在 10% 以内时,不触发伸缩动作。
2.2 核心指标体系
HPA 支持三类指标来源,生产环境中通常组合使用以覆盖不同维度的伸缩需求。
| 指标类型 | 数据来源 | 典型指标 | 适用场景 |
|---|---|---|---|
| Resource Metrics | Metrics Server | CPU 使用率、Memory 使用率 | 通用型工作负载,资源密集型服务 |
| Custom Metrics | Prometheus Adapter / 自定义 API | QPS、请求延迟 P99、连接数 | 业务型工作负载,需要按业务指标伸缩 |
| External Metrics | 外部系统(如云厂商监控) | 队列深度、Kafka Lag、数据库连接数 | 依赖外部中间件的有状态服务 |
实践建议:CPU 指标响应快但容易受“CPU Throttling”干扰;Memory 指标相对稳定但存在“内存泄漏误判”风险。建议将 Resource Metrics 与 Custom Metrics 结合使用,例如以 CPU 作为快速扩容触发条件,以 QPS 作为精确容量控制依据。
2.3 伸缩策略详解
Kubernetes v1.23+ 引入了 HPA 伸缩策略(Scaling Policies),允许用户精细控制扩缩容的行为,包括速率限制、窗口大小与优先级策略。
2.3.1 策略结构
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # 稳定窗口,防止频繁缩容
policies:
- type: Percent
value: 10
periodSeconds: 60
- type: Pods
value: 2
periodSeconds: 60
selectPolicy: Min # 选择策略:Min / Max / Disabled
scaleUp:
stabilizationWindowSeconds: 0 # 扩容通常不设稳定窗口
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
2.3.2 策略参数对比
| 参数 | 含义 | 典型值 | 注意事项 |
|---|---|---|---|
stabilizationWindowSeconds |
稳定窗口,窗口内取最大/最小期望值 | 扩容 0,缩容 300 | 窗口过大可能导致缩容滞后 |
type: Percent |
按当前副本数的百分比限制 | 扩容 100%,缩容 10% | 副本数较小时百分比策略可能过于激进 |
type: Pods |
按 Pod 数量限制 | 扩容 4,缩容 2 | 副本数较大时 Pods 策略可能过于保守 |
selectPolicy |
多策略生效时的选择逻辑 | 扩容 Max,缩容 Min | Min 策略用于保守缩容,Max 用于激进扩容 |
2.3.3 常见策略模式
- 快速扩容 + 慢速缩容:扩容使用 Percent + Max 策略,缩容使用 Pods + Min 策略,适用于流量突增场景。
- 稳定窗口优先:缩容设置较长的稳定窗口(如 5-10 分钟),避免因瞬时指标下降导致 Pod 被误回收。
- 禁用缩容:将
scaleDown的selectPolicy设为Disabled,适用于需要手动控制缩容的场景。
常见陷阱:当同时配置 Percent 和 Pods 策略时,如果
selectPolicy 选择不当,可能导致扩容不足或缩容过快。例如,在副本数较少时(如 2 个 Pod),Percent 策略的 10% 向下取整为 0,此时若 selectPolicy 为 Min,缩容将永远不会触发。建议在副本数较小的场景优先使用 Pods 策略。
2.4 多指标组合与优先级
HPA 支持在同一个资源对象中配置多个指标,控制器会分别计算每个指标对应的期望副本数,最终取最大值作为实际伸缩目标。这意味着只要有一个指标满足扩容条件,就会触发扩容动作。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 500
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 2
periodSeconds: 60
selectPolicy: Min
上述配置中,HPA 会同时监控 CPU 利用率和每秒 HTTP 请求数,只要任一指标超过阈值即触发扩容,缩容则受稳定窗口和 Pods 策略约束。
关键理解:多指标组合时,HPA 的“取最大值”策略天然具备“一票扩容”特性,但缩容需要所有指标都低于阈值且满足稳定窗口条件。这种不对称设计是为了优先保障服务可用性。