首页/云/Kubernetes 速查/HPA 水平自动扩缩容
调度与资源52 条

HPA 水平自动扩缩容

基于指标自动调整工作负载副本数:扩缩有计算周期与稳定窗口,不是实时跟随;min/max 与目标利用率的账要先算清。

Kubernetes 速查云更新于 2026-10-13

自动扩缩是什么

水平自动扩缩根据指标自动调整工作负载的副本数:用量高于目标就加副本,低于目标就减副本,副本数被限制在设定的上下限之间。它解决的是容量与流量不匹配的问题,让基础设施随业务波动伸缩。但它的动作有延迟,不是实时的,因此下限与指标目标需要按业务特性选好。

指标从哪来

最常用的是基于资源用量的指标,数值相对每个副本的请求值计算,因此目标对象必须先声明请求值,否则该指标不可用,扩缩状态会一直显示未知。也可以接入自定义指标,但需要额外的采集与适配组件,复杂度明显高于资源类指标。

基本信息

适用环境任何 Kubernetes 发行版,接口版本不同功能有差异
依据指标资源用量、自定义指标或外部指标
依赖组件指标采集组件,资源类指标还需请求值已声明
调节范围副本数在设定的上下限之间变化
动作节奏按周期计算,且缩容通常带有稳定窗口
与手工操作手工调整会被控制器按指标拉回

典型使用场景

  • 流量波峰波谷明显:白天扩容、夜间缩容节省资源
  • 突发流量承接:在监控指标超过目标时自动增加副本
  • 发布期间保底:配合副本下限保证滚动更新期间有足够实例
  • 成本优化:把长期空闲的副本数压到合理下限
  • 配合队列类服务:依据积压量扩缩消费者数量
  • 压测验证:观察扩容触发点与速度是否符合预期

扩缩配置示例

扩缩配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 3           # 下限决定保底容量
  maxReplicas: 30          # 上限决定成本封顶
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60   # 相对请求值的百分比

查看与排查

查看与排查
kubectl get hpa                              # 看当前副本数与指标值
kubectl describe hpa web-hpa                 # 看扩缩事件与原因
kubectl get deploy web -o jsonpath='{.spec.replicas}'   # 与工作负载副本数对照
kubectl top pod -n prod --sort-by=cpu        # 看真实用量分布

常见异常状态

现象原因处理
指标显示未知目标对象缺少请求值或指标组件未就绪补上请求值并确认采集组件正常
始终不扩容已达上限或指标未超过目标核对上限与目标值设置
频繁抖动目标值过严或指标波动大放宽目标值并设置稳定窗口
扩了但仍然慢扩容只是加副本,实例启动仍需时间提高下限作为保底容量
基于资源用量的指标按每个副本的相对请求值计算,没有声明请求值时该指标不可用,这是自动扩缩失败最常见的原因。
扩缩对象存在时手工调整副本数会被控制器按指标拉回,需要临时固定副本数时应先暂停或移除扩缩对象。

易错点

  • 目标对象没有声明请求值:扩缩指标不可用,状态一直显示未知且扩容永不触发
  • 副本下限设置过低:突发流量时扩容需要时间,冷启动明显的服务会先出现超时
  • 目标值设置过严:指标轻微波动就触发扩缩,副本数来回抖动影响稳定性
  • 扩容后仍追不上流量:新实例启动与就绪需要时间,应有保底容量或配合更快的预热手段

数据来源与参考

  • Kubernetes 官方文档 · Horizontal Pod Autoscaling
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌