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)]

HPA 控制器在决策时会引入冷却(Cooldown)与容忍窗口(Tolerance)机制,避免因指标抖动导致频繁扩缩容(即“抖动”现象)。默认容忍度为 0.1(10%),即当期望副本数与当前副本数偏差在 10% 以内时,不触发伸缩动作。

HPA 控制循环流程图 HPA 控制循环流程图 Metrics Server HPA Controller 计算期望副本数 Scale 子资源 关键参数 sync-period: 15s (默认) tolerance: 0.1 (10%) 冷却时间: 默认 3-5 min 数据来源 resource metrics API custom metrics API

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,适用于需要手动控制缩容的场景。
HPA 伸缩策略决策树 HPA 伸缩策略决策树 HPA 触发伸缩 扩容 (Scale Up) 缩容 (Scale Down) Percent: 100% Pods: 4 selectPolicy: Max Percent: 10% Pods: 2 selectPolicy: Min 稳定窗口 扩容: 0s | 缩容: 300s
常见陷阱:当同时配置 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 的“取最大值”策略天然具备“一票扩容”特性,但缩容需要所有指标都低于阈值且满足稳定窗口条件。这种不对称设计是为了优先保障服务可用性。