2. HPA 与 Kubernetes 架构:HPA 在 K8s 控制平面中的位置、与 Deployment/StatefulSet 的关系、资源请求与限制的关联

2.1 HPA 在控制平面中的位置

HPA(Horizontal Pod Autoscaler)是 Kubernetes 控制平面中负责自动水平扩缩 Pod 副本数的核心控制器。它位于 kube-controller-manager 内部,以控制循环(Control Loop)的方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)评估一次指标并调整副本数。

关键路径: HPA 控制器 → Metrics Server(或自定义指标 API)→ 目标资源(Deployment/StatefulSet)→ ReplicaSet → Pod。

HPA 不直接管理 Pod,而是通过修改目标资源的 spec.replicas 字段来触发扩缩容。控制平面中的完整链路如下:

HPA 在 Kubernetes 控制平面中的位置与数据流 kube-apiserver HPA Controller Metrics Server 自定义指标 API Deployment / StatefulSet ReplicaSet 指标查询(resource/custom) 外部指标(external)

2.2 HPA 与 Deployment / StatefulSet 的关系

HPA 通过 scale 子资源与目标工作负载交互。Deployment 和 StatefulSet 都实现了 Scale 接口,因此 HPA 可以统一操作两者。但两者在扩缩容行为上存在关键差异:

对比维度 Deployment StatefulSet
底层控制器 ReplicaSet StatefulSet 自身(Pod 有序编号)
Pod 标识 随机名称,无状态 固定序号(如 web-0, web-1),有状态
扩缩容顺序 并行创建/删除 缩容时逆序删除(从最大序号开始),扩容时顺序创建
HPA 适用场景 无状态应用(Web、API、微服务) 有状态应用(数据库、消息队列、缓存)
缩容风险 低(Pod 无状态,可随时替换) 高(需确保数据迁移或优雅关闭)
实践警告: 对 StatefulSet 使用 HPA 时,务必配合 PodDisruptionBudget(PDB)防止同时缩容过多有状态 Pod。同时建议设置 behavior.scaleDown.stabilizationWindowSeconds 避免频繁缩容导致数据迁移风暴。

2.3 资源请求与限制的关联

HPA 的指标计算与 Pod 的 resources.requests 和 resources.limits 有直接关联。理解这一关联是正确配置 HPA 的前提:

  • CPU 指标: HPA 使用 requests 作为基准值。例如目标利用率 80% 意味着:当前 CPU 使用量 / Pod 的 CPU request 达到 0.8 时触发扩容。
  • 内存指标: 同样基于 requests 计算。但内存使用量不会自动下降(除非进程释放),因此内存 HPA 通常需要配合 behavior 策略防止抖动。
  • 自定义指标: 不依赖 requests/limits,直接使用指标值(如 QPS、连接数)。
资源请求/限制与 HPA 指标计算的关系 Pod 资源定义 requests.cpu: 500m limits.cpu: 1000m requests.memory: 256Mi limits.memory: 512Mi (HPA 只读 requests) HPA 指标计算 当前 CPU: 400m 利用率 = 400m / 500m = 80% 目标利用率: 50% 期望副本 = ceil(80%/50% × 当前副本) (基于 requests 计算) 扩缩结果 当前副本: 3 期望副本: 5 扩容 2 个 Pod (修改 replicas)

2.4 关键配置参数对比

参数 作用 推荐值 与资源请求的关联
targetCPUUtilizationPercentage CPU 目标利用率 50% ~ 80% 基于 requests.cpu 计算
targetMemoryUtilizationPercentage 内存目标利用率 50% ~ 70% 基于 requests.memory 计算
behavior.scaleUp.stabilizationWindowSeconds 扩容稳定窗口 0 ~ 60s 无直接关联,但影响扩缩响应速度
behavior.scaleDown.stabilizationWindowSeconds 缩容稳定窗口 60 ~ 300s 建议有状态应用设置较大值
--horizontal-pod-autoscaler-sync-period HPA 评估周期 15s(默认) 无直接关联
最佳实践: 始终为工作负载设置合理的 requests 值。如果 requests 设置过高(如接近 limits),HPA 将难以触发扩容;如果设置过低,HPA 可能过早扩容导致资源浪费。建议通过 Vertical Pod Autoscaler(VPA)或历史监控数据校准 requests 基线。

2.5 资源限制对 HPA 的间接影响

虽然 HPA 不直接读取 limits,但 limits 通过以下方式间接影响 HPA 行为:

  • CPU Throttling: 当 Pod 实际使用超过 limits.cpu 时,CPU 被限流(Throttle),导致指标下降,可能使 HPA 误判为负载降低而缩容。
  • OOM Kill: 当 Pod 内存使用超过 limits.memory 时,Pod 被 OOM Kill,HPA 检测到 Pod 消失后可能触发扩容,形成“OOM → 扩容 → 新 Pod 再 OOM”的恶性循环。
  • QoS 等级: requests 与 limits 的关系决定了 Pod 的 QoS 等级(Guaranteed / Burstable / BestEffort),影响调度优先级和驱逐顺序,间接影响 HPA 的稳定性。
避坑指南: 对于 HPA 管理的 Pod,建议设置 limits 为 requests 的 1.2~2 倍(Burstable QoS),避免 CPU Throttling 干扰 HPA 判断。同时确保 limits.memory 足够容纳应用峰值内存,防止 OOM 导致 HPA 震荡。