3. Kubernetes HPA 原理回顾:HPA工作流程、Replica计算逻辑、targetAverageValue与targetAverageUtilization

在深入基于连接池水位的自定义指标配置之前,必须彻底理解 HPA(Horizontal Pod Autoscaler)的核心原理。HPA 是 Kubernetes 中实现工作负载弹性伸缩的控制器,它通过持续监控 Pod 的指标数据,动态调整 ReplicaSet 或 StatefulSet 的副本数量。本节将系统回顾 HPA 的工作流程、副本计算逻辑以及两种核心指标目标类型。

3.1 HPA 工作流程

HPA 控制器以控制循环(Control Loop)的方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次完整的调谐流程。其核心步骤包括指标采集、计算期望副本、决策与执行。

关键流程节点:
  1. 指标查询:HPA 通过 API Server 查询指定的 Metrics 源(Metrics Server 或自定义 Metrics API),获取当前 Pod 的指标值。
  2. 聚合计算:对每个 Pod 的指标值进行聚合(默认取所有就绪 Pod 的平均值),得到当前实际指标值。
  3. 副本计算:将当前实际指标值与目标值(targetAverageValue 或 targetAverageUtilization)进行比较,计算期望副本数。
  4. 决策与限速:根据冷却窗口(Cooldown)、扩缩容策略(behavior)和副本数上下限(minReplicas/maxReplicas)进行决策。
  5. 更新工作负载:调用 Scale 子资源更新 Deployment/StatefulSet 的副本数,触发实际 Pod 的创建或删除。
HPA 控制循环工作流程 HPA Controller Metrics API 聚合计算 (平均值) 期望副本计算 决策 & 限速 更新 Scale 子资源 Pod 创建/删除 说明: 默认同步周期 15s,冷却窗口默认扩容 3min、缩容 5min。指标缺失时 HPA 会等待最多 5 分钟。

3.2 Replica 计算逻辑

HPA 的副本计算基于一个简单的比例公式,但实际执行时受到多种策略的约束。核心公式如下:

期望副本数 = ceil[ 当前副本数 × ( 当前指标值 / 目标指标值 ) ]

其中:

  • 当前指标值:所有就绪 Pod 的指标聚合值(默认取算术平均值)。
  • 目标指标值:由 HPA 配置中的 targetAverageValue 或 targetAverageUtilization 决定。
  • ceil:向上取整,确保副本数为整数。
计算示例:假设当前有 4 个 Pod,每个 Pod 的连接池水位分别为 120、130、110、140,平均值为 125。如果目标值为 100,则期望副本数 = ceil[ 4 × (125 / 100) ] = ceil[5.0] = 5。HPA 将扩容到 5 个 Pod。

HPA 在计算过程中还会考虑以下边界条件:

条件 行为 说明
指标值接近目标值(容忍度内) 不执行扩缩容 默认容忍度为 0.1(10%),避免频繁抖动
计算出的期望副本数超出 [minReplicas, maxReplicas] 截断到边界值 minReplicas 默认 1,maxReplicas 必须显式设置
Pod 处于未就绪状态 不参与指标聚合 避免将正在启动的 Pod 纳入计算
指标缺失(Pod 无数据) 跳过该 Pod 如果所有 Pod 都缺失指标,HPA 将停止扩缩容

3.3 targetAverageValue 与 targetAverageUtilization

HPA 支持两种目标指标类型,它们在定义方式和适用场景上有显著区别。理解这两者的差异对于配置基于连接池水位的自定义指标至关重要。

特性 targetAverageValue targetAverageUtilization
定义方式 直接指定一个绝对数值 指定一个百分比(0-100)
指标类型 适用于 Pod 指标(PodMetrics) 仅适用于资源指标(ResourceMetrics)
计算基准 直接与 Pod 指标平均值比较 需要结合 Pod 的 Request 值计算利用率
典型场景 自定义指标(如连接数、QPS、队列深度) CPU / 内存利用率
配置示例 targetAverageValue: 100 targetAverageUtilization: 80
计算公式 期望副本 = ceil[ 当前副本 × (当前平均值 / 目标值) ] 期望副本 = ceil[ 当前副本 × (当前利用率 / 目标利用率) ]
重要提示:对于连接池水位这类自定义指标,必须使用 targetAverageValue。因为连接池水位是一个绝对数值(如当前活跃连接数),而不是相对于 Pod Request 的百分比。如果错误使用 targetAverageUtilization,HPA 将无法正确解析指标,导致扩缩容失效。

在 HPA YAML 配置中,两种目标类型的定义方式如下:

# targetAverageValue 示例(适用于自定义指标)
metrics:
- type: Pods
  pods:
    metric:
      name: connection_pool_watermark
    target:
      type: AverageValue
      averageValue: 100

# targetAverageUtilization 示例(适用于资源指标)
metrics:
- type: Resource
  resource:
    name: cpu
    target:
      type: Utilization
      averageUtilization: 80

3.4 多指标与策略扩展

HPA 支持同时配置多个指标,此时 HPA 会分别计算每个指标对应的期望副本数,并选择其中的 最大值 作为最终期望副本数。这种机制确保了即使某个指标未达到阈值,其他指标也可能触发扩容。

多指标 HPA 副本选择策略 指标1: 连接池水位 期望副本: 8 指标2: CPU 利用率 期望副本: 5 指标3: 请求延迟 期望副本: 6 取最大值: 8 最终副本数: 8

此外,Kubernetes v1.18+ 引入了 behavior 字段,允许精细控制扩缩容策略:

  • scaleDown 策略:可设置缩容稳定窗口(stabilizationWindowSeconds)、选择策略(Max / Min)和每秒允许缩容的 Pod 数量。
  • scaleUp 策略:可设置扩容稳定窗口、选择策略和每秒允许扩容的 Pod 数量。
  • 禁用缩容:将 scaleDown 的 selectPolicy 设置为 Disabled。
连接池水位场景的最佳实践:
  • 使用 targetAverageValue 定义连接池水位目标值。
  • 设置合理的 minReplicas 和 maxReplicas,避免过度扩缩容。
  • 配置 behavior 的扩容稳定窗口(如 30-60 秒),防止连接数瞬时波动导致频繁扩容。
  • 缩容稳定窗口建议设置较长(如 5 分钟),避免连接池水位下降后立即缩容导致连接中断。