基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

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
$$

  • ...\lceil ... \rceil: 表示向上取整(Ceiling)。
  • 举例
    • 当前有 2 个 Pod。
    • 当前平均 CPU 使用率为 90%。
    • HPA 设定的期望 CPU 使用率为 50%。
    • 计算:2×(90/50)=3.62 \times (90 / 50) = 3.6
    • 向上取整后,期望副本数为 4

容忍度(Tolerance)机制
为了防止频繁的扩缩容(Flapping),HPA 有一个默认的容忍度(默认为 0.1,即 10%)。

  • 如果 当前指标值期望指标值\frac{当前指标值}{期望指标值} 的结果在 0.91.10.9 \sim 1.1 之间(即偏差在 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。

  1. HPA 修改了 Deployment 的副本数(例如从 2 改为 4)。
  2. Deployment Controller 监听到副本数变化。
  3. Deployment Controller 负责创建新的 Pod 或删除多余的 Pod,直到实际状态与期望状态一致。

3. 特殊情况处理

  • Pod 未就绪(Not Ready)
    如果 Pod 正在启动中或未通过 Readiness Probe,HPA 在计算时通常会忽略这些 Pod 的指标,或者以保守的方式处理,防止在启动风暴期间错误地扩容。
  • 缺少指标
    如果某些 Pod 无法获取指标,HPA 可能会暂停缩容操作,以防止误删。
  • 多指标扩缩容
    如果 HPA 配置了多个指标(例如同时监控 CPU 和 QPS),HPA 会分别为每个指标计算期望副本数,然后取最大值(Max Policy)作为最终的扩容依据。

4. 总结图解

plaintext
[ 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 ] ...

关键点总结

  1. 依赖 Metrics:必须有 Metrics Server 或 Prometheus Adapter。
  2. 基于比率计算:核心是 当前值 / 期望值 的比例。
  3. 防抖动:缩容默认有 5 分钟冷却期。
  4. 间接操作:HPA 修改 Deployment 的定义,Deployment 再去操作 Pod。
00:00
00:00