4. HPA基础:Horizontal Pod Autoscaler工作原理、指标采集与扩缩容决策
Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心控制器。在 Serverless 与容量 SLO 场景中,HPA 负责根据实时负载指标自动调整 Pod 副本数,从而在满足性能目标的同时控制资源成本。理解 HPA 的完整工作链路——从指标采集、聚合计算到扩缩容决策——是构建可靠容量管理面板的前提。
4.1 HPA 核心工作流程
HPA 以控制循环(Control Loop)方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次完整的“采集-计算-决策-执行”流程。下图展示了 HPA 从指标源到最终扩缩容动作的完整链路:
4.2 指标采集机制
HPA 支持三类指标源,每种指标的采集路径与聚合方式不同:
| 指标类型 | 采集源 | 聚合方式 | 典型指标 |
|---|---|---|---|
| Resource Metric | Metrics Server(kubelet cAdvisor) | 所有 Pod 当前值取平均 | CPU 使用率、内存使用率 |
| Custom Metric | 自定义 API(Prometheus Adapter 等) | 按 Pod 标签聚合或取平均值 | QPS、请求延迟 P99 |
| External Metric | 外部系统 API(云服务、消息队列) | 全局单一值,不按 Pod 拆分 | 队列深度、连接数 |
实践建议:在 Serverless 容量 SLO 场景中,推荐优先使用 Custom Metric(如请求速率、错误率)作为扩缩容依据,因为 CPU 使用率在突发流量下存在滞后性,且受 Pod 规格影响较大。
4.3 扩缩容决策算法
HPA 控制器在每个同步周期执行以下核心计算:
期望副本数 = ceil( 当前副本数 × ( 当前指标值 / 目标指标值 ) )
以 CPU 使用率为例,假设目标值为 50%,当前 Pod 平均使用率为 80%,当前副本数为 3:
期望副本数 = ceil( 3 × ( 80% / 50% ) ) = ceil( 4.8 ) = 5
HPA 在决策过程中还包含以下关键机制:
- 容忍度(Tolerance):默认 0.1(10%),当
|当前指标值 / 目标指标值 - 1| < 0.1时,不触发扩缩容,避免频繁抖动。 - 冷却窗口(Cooldown):通过
--horizontal-pod-autoscaler-downscale-stabilization-window(默认 5 分钟)防止快速缩容导致的服务波动。 - 扩缩容速率限制:每 15 秒周期内,扩容最多翻倍,缩容最多减半,防止系统过载。
4.4 多指标组合决策
当 HPA 配置了多个指标时,控制器会分别计算每个指标对应的期望副本数,然后取 最大值 作为最终决策:
注意:多指标配置时,如果某个指标数据缺失(例如 Metrics Server 重启导致 CPU 数据暂时不可用),HPA 会跳过该指标,仅基于可用指标进行决策。这可能导致扩缩容行为与预期不符,建议在面板中监控指标健康状态。
4.5 HPA 配置示例
以下是一个生产级 HPA 配置,同时使用 CPU 使用率和自定义 QPS 指标:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: serverless-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: serverless-app
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Pods
pods:
metric:
name: requests_per_second
target:
type: AverageValue
averageValue: 800
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
- type: Pods
value: 4
periodSeconds: 60
selectPolicy: Max
4.6 关键参数速查表
| 参数 | 默认值 | 说明 | 调优建议 |
|---|---|---|---|
--horizontal-pod-autoscaler-sync-period |
15s | HPA 控制循环周期 | Serverless 场景可缩短至 10s |
--horizontal-pod-autoscaler-downscale-stabilization-window |
5min | 缩容稳定窗口 | 延迟敏感服务可缩短至 2min |
--horizontal-pod-autoscaler-tolerance |
0.1 | 扩缩容容忍度 | 高精度场景可设为 0.05 |
behavior.scaleDown.stabilizationWindowSeconds |
300 | HPA 行为配置中的缩容窗口 | 覆盖全局默认值 |
关键要点:
- HPA 是 Kubernetes 原生弹性控制器,通过控制循环实现自动扩缩容。
- 指标采集支持 Resource、Custom、External 三类,Serverless 场景推荐使用 Custom Metric。
- 扩缩容决策基于
期望副本数 = ceil(当前副本数 × 当前指标值 / 目标指标值)。 - 多指标时取最大值,配合容忍度和冷却窗口防止抖动。
- 生产环境应配置
behavior字段精细控制扩缩容速率。