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 控制)执行一次完整的调谐流程。其核心步骤包括指标采集、计算期望副本、决策与执行。
关键流程节点:
- 指标查询:HPA 通过 API Server 查询指定的 Metrics 源(Metrics Server 或自定义 Metrics API),获取当前 Pod 的指标值。
- 聚合计算:对每个 Pod 的指标值进行聚合(默认取所有就绪 Pod 的平均值),得到当前实际指标值。
- 副本计算:将当前实际指标值与目标值(targetAverageValue 或 targetAverageUtilization)进行比较,计算期望副本数。
- 决策与限速:根据冷却窗口(Cooldown)、扩缩容策略(behavior)和副本数上下限(minReplicas/maxReplicas)进行决策。
- 更新工作负载:调用 Scale 子资源更新 Deployment/StatefulSet 的副本数,触发实际 Pod 的创建或删除。
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 会分别计算每个指标对应的期望副本数,并选择其中的 最大值 作为最终期望副本数。这种机制确保了即使某个指标未达到阈值,其他指标也可能触发扩容。
此外,Kubernetes v1.18+ 引入了 behavior 字段,允许精细控制扩缩容策略:
- scaleDown 策略:可设置缩容稳定窗口(stabilizationWindowSeconds)、选择策略(Max / Min)和每秒允许缩容的 Pod 数量。
- scaleUp 策略:可设置扩容稳定窗口、选择策略和每秒允许扩容的 Pod 数量。
- 禁用缩容:将
scaleDown的selectPolicy设置为Disabled。
连接池水位场景的最佳实践:
- 使用
targetAverageValue定义连接池水位目标值。 - 设置合理的
minReplicas和maxReplicas,避免过度扩缩容。 - 配置
behavior的扩容稳定窗口(如 30-60 秒),防止连接数瞬时波动导致频繁扩容。 - 缩容稳定窗口建议设置较长(如 5 分钟),避免连接池水位下降后立即缩容导致连接中断。