1. HPA 基础概念

1.1 HPA 定义

Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性伸缩控制器,用于根据工作负载的实时资源使用率或自定义指标,自动调整工作负载(如 Deployment、StatefulSet)的 Pod 副本数量。HPA 属于水平扩缩容,即通过增加或减少 Pod 实例数来应对流量变化,而非调整单个 Pod 的资源规格(垂直扩缩容)。

核心目标:在保证服务质量(SLA)的前提下,实现资源利用率与成本的最优平衡。

1.2 工作原理

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

  1. 采集指标:通过 Metrics Server 或自定义指标 API 获取目标工作负载的当前指标值(如 CPU 使用率、QPS)。
  2. 计算期望副本数:根据当前指标值与目标值的比率,使用公式 期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值)) 计算。
  3. 决策与执行:若期望副本数与当前副本数差异超过容忍阈值(默认 0.1,即 10%),则更新工作负载的 replicas 字段,触发 Deployment 等控制器执行滚动更新或扩缩容。
  4. 冷却与回退:HPA 内置冷却机制,防止指标抖动导致频繁扩缩容(即“抖动”现象)。
HPA 控制循环流程图 HPA Controller Metrics Server 自定义指标 API 计算期望副本数 更新 Deployment/RS 冷却机制 扩缩容间隔 ≥ 3 分钟 / 5 分钟

1.3 核心组件

组件 角色 关键说明
Metrics Server 资源指标采集器 从 Kubelet 的 cAdvisor 接口聚合 CPU、内存等资源指标,通过 metrics.k8s.io API 暴露。默认每 15 秒采集一次,仅保留最近 1 分钟数据。
Controller Manager HPA 控制器宿主 运行在 kube-controller-manager 进程中,负责 HPA 对象的调谐循环。通过 --horizontal-pod-autoscaler-* 系列参数控制行为。
自定义指标适配器 扩展指标桥接 如 Prometheus Adapter、KEDA,将外部指标(QPS、连接数、队列深度)转换为 HPA 可消费的 custom.metrics.k8s.io 或 external.metrics.k8s.io API。
生产建议:Metrics Server 是 HPA 工作的前提条件,务必在集群中提前部署并验证 kubectl top node 和 kubectl top pod 命令可用。

1.4 HPA 与手动扩缩容对比

对比维度 手动扩缩容 HPA 自动扩缩容
操作方式 kubectl scale deployment/foo --replicas=5 声明式 YAML 定义,控制器自动执行
响应速度 即时生效(秒级) 依赖指标采集 + 调谐周期(通常 30s~3min)
运维成本 高,需 7×24 值班盯屏 低,策略配置后自动运行
适用场景 计划性扩容(大促前)、紧急故障恢复 日常流量波动、周期性负载、不可预测突发
风险控制 依赖人工经验,易过度/不足 支持最大/最小副本数限制、冷却窗口、容忍阈值
多指标协同 不支持 支持 CPU + 内存 + 自定义指标联合决策
常见误区:HPA 并非“实时”伸缩。从指标采集到 Pod 就绪,完整链路可能耗时 2~5 分钟。对于秒级突增流量,建议配合 Cluster Autoscaler(节点级弹性)和 PDB(Pod 中断预算)使用。

1.5 最小 HPA 配置示例

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: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Pods
        value: 4
        periodSeconds: 60

上述配置定义了:

  • 目标 Deployment web-app,副本数范围 2~10。
  • CPU 平均利用率目标 70%,内存平均利用率目标 80%。
  • 缩容冷却窗口 300 秒(5 分钟),每次最多缩容 10%。
  • 扩容无冷却窗口,每次最多增加 4 个 Pod,防止扩容滞后。