1. HPA 基础概念

1.1 什么是 HPA

Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性扩缩容控制器,它根据工作负载的实时资源使用率(如 CPU、内存)或自定义指标,自动调整 Deployment、StatefulSet 等 workload 的 Pod 副本数。HPA 是 Kubernetes 实现应用级弹性的核心机制,也是 SLO 校准中“容量与成本平衡”的关键组件。

核心定位:HPA 解决的是“水平扩展”问题——增加或减少 Pod 实例数量,而非提升单个 Pod 的资源规格(垂直扩展)。在微服务架构中,水平扩展是更推荐的方式。

1.2 HPA 工作原理

HPA 以控制循环(Control Loop)方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次以下流程:

  1. 采集指标:通过 Metrics Server 或自定义指标 API 获取目标 Pod 的当前资源使用数据。
  2. 计算期望副本数:根据当前指标值与目标值的比值,计算期望的 Pod 副本数。
  3. 更新 workload:调用 Kubernetes API 更新 Deployment/StatefulSet 的 replicas 字段。
  4. 等待生效:等待 Pod 启动/终止完成,进入下一轮控制循环。
期望副本数计算公式:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
HPA 控制循环流程图 HPA 控制循环(每 15s) ① 采集指标 Metrics Server / 自定义 API ② 计算期望副本数 current / desired 比值 ③ 更新 workload Deployment replicas ④ Pod 启动/终止 等待就绪 下一轮循环 关键参数 --horizontal-pod-autoscaler- sync-period: 15s(默认) --horizontal-pod-autoscaler- tolerance: 0.1(默认)

1.3 核心组件

组件 角色 关键说明
Metrics Server 资源指标采集器 从 Kubelet 的 cAdvisor 接口采集 Pod/Node 的 CPU、内存使用数据,通过 metrics.k8s.io API 暴露。默认不安装,需手动部署。
Controller Manager HPA 控制器运行载体 Kubernetes 控制平面组件,内置 HPA Controller,负责执行控制循环、计算期望副本数、调用 API 更新 workload。
Custom Metrics API 自定义指标适配器 可选组件(如 Prometheus Adapter),用于接入业务指标(QPS、延迟等),扩展 HPA 的指标来源。
注意:Metrics Server 仅支持 CPU 和内存的平均值指标。若需要基于 P99 延迟、请求速率等业务指标做弹性,必须部署自定义指标适配器(如 Prometheus Adapter、KEDA)。

1.4 HPA 与手动扩缩容对比

手动扩缩容(kubectl scale)是运维人员根据经验或监控告警,手动调整副本数。HPA 则实现了自动化、指标驱动的弹性决策。两者对比如下:

对比维度 手动扩缩容 HPA 自动扩缩容
决策依据 人工经验、监控告警 实时指标数据(CPU/Memory/自定义)
响应速度 分钟级(人工发现 + 操作) 秒级(控制循环 15s)
准确性 依赖个人经验,容易过度/不足 基于指标比值计算,精确可预测
运维成本 7×24 人工值守,容易疲劳 声明式配置,自动化运行
适用场景 临时扩容、紧急故障恢复 日常弹性、SLO 驱动的容量管理
与 SLO 关系 无法与 SLO 直接联动 可基于 SLO 指标(如错误率、延迟)驱动扩缩容
HPA 与手动扩缩容对比 HPA 自动扩缩容 vs 手动扩缩容 手动扩缩容 👤 运维人员 📊 监控告警 💻 kubectl scale Pod 副本数变更 HPA 自动扩缩容 📝 HPA YAML 配置 📈 Metrics Server ⚙️ HPA Controller Pod 副本数自动调整 VS 人工 vs 自动 分钟级 vs 秒级

1.5 一个简单的 HPA 配置示例

以下 YAML 定义了一个基于 CPU 使用率的 HPA,目标 Pod 副本数范围 2~10,当 CPU 平均使用率超过 80% 时触发扩容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
关键字段说明:
  • scaleTargetRef:指定要扩缩容的 workload 对象(Deployment/StatefulSet)。
  • minReplicas / maxReplicas:副本数上下限,防止无限扩缩。
  • metrics[].target.averageUtilization:目标利用率,HPA 会尽力维持 Pod 平均 CPU 在此值附近。

1.6 本章小结

  • HPA 是 Kubernetes 原生的水平 Pod 自动扩缩容机制,基于控制循环实现。
  • 核心组件包括 Metrics Server(指标采集)和 Controller Manager(控制器运行)。
  • 与手动扩缩容相比,HPA 具备自动化、指标驱动、秒级响应的优势,是 SLO 校准中实现容量弹性的关键基础设施。
  • HPA 默认仅支持 CPU/Memory 指标,生产环境常需配合自定义指标适配器(如 Prometheus Adapter)来接入业务 SLO 指标。