2. HPA 工作原理:控制循环机制、Metrics Server 数据采集、目标副本数计算公式详解
理解 HPA(Horizontal Pod Autoscaler)的工作原理是进行调度策略调优的基础。HPA 并非实时响应每一个指标波动,而是基于一个控制循环(Control Loop)机制,周期性地从 Metrics Server 拉取资源指标,并通过目标副本数计算公式计算出期望的 Pod 副本数,最终驱动 Deployment 或 StatefulSet 完成扩缩容。
2.1 控制循环机制(Control Loop)
HPA 作为一个内置的控制器(Controller),遵循 Kubernetes 通用的“期望状态(Desired State)与当前状态(Current State)调和”模式。其核心控制循环默认每 15 秒执行一次(由 --horizontal-pod-autoscaler-sync-period 控制),但实际触发扩缩容动作会受到冷却窗口(Cooldown)和容忍度(Tolerance)的约束。
--horizontal-pod-autoscaler-sync-period:控制循环周期,默认 15s。--horizontal-pod-autoscaler-downscale-stabilization-window:缩容冷却窗口,默认 5 分钟。--horizontal-pod-autoscaler-tolerance:容忍度,默认 0.1(10%)。
2.2 Metrics Server 数据采集
Metrics Server 是 HPA 获取资源指标(CPU、内存)的核心数据源。它通过 Kubelet 的 Summary API 从每个 Node 上采集 Pod 和 Node 的资源使用数据,并聚合后暴露给 HPA。
| 组件 | 角色 | 数据流方向 |
|---|---|---|
| cAdvisor | 内嵌于 Kubelet,采集容器级别的 CPU、内存、网络、磁盘指标 | 容器 → cAdvisor → Kubelet |
| Kubelet | 通过 Summary API(/stats/summary)暴露节点和 Pod 的聚合指标 |
Kubelet → Metrics Server |
| Metrics Server | 集群级资源指标聚合器,缓存指标数据,通过 metrics.k8s.io API 提供服务 |
Metrics Server → HPA / kubectl top |
- Metrics Server 默认每 15 秒 从 Kubelet 拉取一次数据,与 HPA 控制循环周期一致。
- Metrics Server 仅保留最近 1 分钟 的指标数据,超出后会被丢弃。
- 如果 Metrics Server 不可用,HPA 将无法获取指标,不会触发任何扩缩容动作。
2.3 目标副本数计算公式详解
HPA 的核心计算逻辑基于一个简单的比例公式。当使用 CPU 或内存利用率时,计算公式如下:
期望副本数 = ceil[ 当前副本数 × ( 当前指标值 / 期望指标值 ) ]
其中:
- 当前指标值:所有匹配 Pod 的当前资源使用率的平均值(例如所有 Pod 的 CPU 使用率均值)。
- 期望指标值:HPA 配置中设定的目标利用率(例如
targetAverageUtilization: 50)。 - ceil:向上取整,确保副本数为整数。
2.3.1 计算示例
假设当前有 4 个 Pod,每个 Pod 的 CPU 请求为 100m,HPA 目标 CPU 利用率为 50%。当前 4 个 Pod 的 CPU 使用率分别为:60%、70%、50%、40%。
| Pod | CPU 请求 | 当前使用量 | 当前利用率 |
|---|---|---|---|
| Pod-1 | 100m | 60m | 60% |
| Pod-2 | 100m | 70m | 70% |
| Pod-3 | 100m | 50m | 50% |
| Pod-4 | 100m | 40m | 40% |
计算步骤:
- 当前指标值 = (60% + 70% + 50% + 40%) / 4 = 55%
- 期望指标值 = 50%
- 期望副本数 = ceil[ 4 × (55% / 50%) ] = ceil[ 4 × 1.1 ] = ceil[ 4.4 ] = 5
因此,HPA 会将 Deployment 的副本数从 4 扩容到 5。
2.3.2 容忍度(Tolerance)的影响
为了避免指标微小波动导致频繁扩缩容(抖动),HPA 引入了容忍度机制。默认容忍度为 0.1(10%)。只有当 |当前指标值 / 期望指标值 - 1| > 容忍度 时,才会触发扩缩容。
if abs(当前指标值 / 期望指标值 - 1) > 0.1:
触发扩缩容
else:
不触发扩缩容
在上面的例子中,55% / 50% = 1.1,|1.1 - 1| = 0.1,恰好等于容忍度边界,因此不会触发扩容。只有当平均利用率达到 55.1% 以上时,才会触发扩容。
2.3.3 多指标与自定义指标
当 HPA 配置了多个指标(如 CPU + 内存 + QPS)时,HPA 会分别计算每个指标对应的期望副本数,然后取最大值作为最终的期望副本数。这确保了任何一项指标超标时都能及时扩容。
| 指标类型 | 计算方式 | 适用场景 |
|---|---|---|
| ResourceMetric | 基于 Pod 的 requests 计算利用率(CPU/内存) | 通用场景,资源密集型应用 |
| PodMetric | 直接使用 Pod 的原始指标值(如 QPS、延迟) | 业务指标驱动,如 Web 服务、消息队列 |
| ObjectMetric | 基于集群对象(如 Ingress、Service)的指标 | 网关、负载均衡器级别的流量控制 |
- 对于 CPU 密集型应用,建议将目标利用率设置在 50% - 70% 之间,留出足够的突发余量。
- 对于内存密集型应用,注意内存指标通常不会像 CPU 那样快速波动,可以适当降低容忍度(如 0.05)以提高响应速度。
- 使用自定义指标时,确保指标采集频率高于 HPA 控制循环周期(15s),避免数据陈旧导致误判。