HPA (Horizontal Pod Autoscaler) 的工作原理是什么?
Horizontal Pod Autoscaler (HPA) 是 Kubernetes 中用于自动扩展无状态应用(如 Deployment、ReplicaSet、StatefulSet)的关键组件。它的核心目标是根据当前的负载情况(如 CPU 利用率、内存使用量或自定义指标),自动调整 Pod 的副本数量(Replicas)。
HPA 的工作原理可以概括为一个“控制回路(Control Loop)”,其周期性地(默认 15 秒)执行“监测 -> 计算 -> 调整”的过程。
以下是 HPA 工作原理的详细步骤解析:
1. 核心组件
在理解流程之前,需要知道参与的几个关键角色:
- HPA Controller: 运行在
kube-controller-manager中,是 HPA 的大脑。 - Metrics Server: 负责收集集群的基础资源指标(CPU、内存)。如果没有安装它,HPA 无法基于 CPU/内存扩缩容。
- Custom/External Metrics API: 如果基于 QPS、队列长度等指标扩缩容,需要通过 Prometheus Adapter 等组件提供这些 API。
- Scale Target: 被扩缩容的对象(通常是 Deployment)。
2. 工作流程 (The Loop)
HPA 的工作流程是一个不断循环的闭环:
第一步:获取指标 (Retrieve Metrics)
HPA Controller 会按照配置的周期(默认 15 秒,通过 --horizontal-pod-autoscaler-sync-period 标志控制),向 Metrics API 查询目标 Pod 当前的资源使用情况。
- 如果是 CPU/内存,查询 Metrics Server。
- 如果是自定义指标(如 HTTP 请求数),查询 Custom Metrics API。
第二步:计算副本数 (Calculate Replicas)
这是 HPA 的核心算法。Controller 将获取到的当前指标值与用户设定的期望指标值进行比较,计算出需要的副本数量。
核心公式:
$$
期望副本数 = \lceil 当前副本数 \times \frac{当前指标值}{期望指标值} \rceil
$$
- : 表示向上取整(Ceiling)。
- 举例:
- 当前有 2 个 Pod。
- 当前平均 CPU 使用率为 90%。
- HPA 设定的期望 CPU 使用率为 50%。
- 计算:。
- 向上取整后,期望副本数为 4。
容忍度(Tolerance)机制:
为了防止频繁的扩缩容(Flapping),HPA 有一个默认的容忍度(默认为 0.1,即 10%)。
- 如果 的结果在 之间(即偏差在 10% 以内),HPA 会认为不需要调整,保持当前副本数不变。
第三步:稳定窗口与决策 (Stabilization & Decision)
计算出新的副本数后,HPA 不会立即盲目执行,特别是针对缩容(Scale Down)操作。
- 扩容(Scale Up):通常会尽快执行,以应对突发流量。
- 缩容(Scale Down):为了防止指标波动导致 Pod 被删掉后流量又上来(造成抖动),HPA 引入了稳定窗口(Stabilization Window)。默认情况下,缩容有一个 5 分钟(300秒)的冷却期。HPA 会查看过去一段时间内的建议副本数,并取最大值作为最终决策,确保系统平滑。
第四步:更新目标资源 (Update Target)
一旦确定了最终的副本数量,HPA Controller 会通过 Kubernetes API 更新目标资源(如 Deployment)的 spec.replicas 字段。
第五步:Reconciliation (由 Deployment Controller 完成)
HPA 本身不直接创建或删除 Pod。
- HPA 修改了 Deployment 的副本数(例如从 2 改为 4)。
- Deployment Controller 监听到副本数变化。
- Deployment Controller 负责创建新的 Pod 或删除多余的 Pod,直到实际状态与期望状态一致。
3. 特殊情况处理
- Pod 未就绪(Not Ready):
如果 Pod 正在启动中或未通过 Readiness Probe,HPA 在计算时通常会忽略这些 Pod 的指标,或者以保守的方式处理,防止在启动风暴期间错误地扩容。 - 缺少指标:
如果某些 Pod 无法获取指标,HPA 可能会暂停缩容操作,以防止误删。 - 多指标扩缩容:
如果 HPA 配置了多个指标(例如同时监控 CPU 和 QPS),HPA 会分别为每个指标计算期望副本数,然后取最大值(Max Policy)作为最终的扩容依据。
4. 总结图解
[ Metrics Server / Prometheus ]
^
| (1. 查询指标)
|
[ HPA Controller ] <--- (2. 算法计算: Current / Desired)
|
| (3. 更新 replicas 数量)
v
[ Deployment (Scale Target) ]
|
| (4. 监听变化)
v
[ ReplicaSet Controller ]
|
| (5. 创建/销毁 Pod)
v
[ Pod ] [ Pod ] [ Pod ] ...
关键点总结
- 依赖 Metrics:必须有 Metrics Server 或 Prometheus Adapter。
- 基于比率计算:核心是
当前值 / 期望值的比例。 - 防抖动:缩容默认有 5 分钟冷却期。
- 间接操作:HPA 修改 Deployment 的定义,Deployment 再去操作 Pod。