Docker KubernetesNotes

第 21 章:Horizontal Pod Autoscaler

zjc 于 2026-01-21 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 HPA 根据指标自动调整 Pod 副本数,适合无状态、可水平扩展的服务。它不能替代容量规划和资源限制。

21.1 HPA 对象

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: order-service
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-service
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60

21.2 扩缩容算法

简化公式:

desired = currentReplicas * currentMetric / targetMetric

结果会受 min / max、容忍度、稳定窗口和指标质量影响。

21.3 指标来源

常见指标:

指标 场景
CPU 通用基线
内存 缓存类需谨慎
QPS 入口流量
队列长度 消费者
自定义延迟 核心体验

自定义指标依赖 Metrics Server、Prometheus Adapter 或自定义指标 API。

21.4 行为控制

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
  scaleUp:
    stabilizationWindowSeconds: 30

扩容可以更快,缩容应更保守,避免流量震荡。

21.5 前提条件

  1. Deployment 设置资源 requests;
  2. 应用无状态;
  3. Pod 可安全加入和退出;
  4. 下游依赖可承受并发;
  5. 指标可靠;
  6. 命名空间配额足够;
  7. 节点资源可扩容。

21.6 排查

kubectl get hpa order-service -w
kubectl describe hpa order-service

常见问题:

现象 原因
unknown 缺 requests 或指标
不扩容 指标未达阈值
达到 max 容量或配额上限
震荡 稳定窗口太短
Pod Pending 节点资源不足

本章小结

HPA 通过指标维护副本数。CPU 是基础,QPS 和队列长度更能反映业务压力。稳定扩缩容依赖 requests、健康检查、下游容量和节点弹性。

思考题

  1. HPA 为什么依赖 requests?
  2. 队列长度指标适合什么服务?
  3. 扩容和缩容窗口为什么不同?
  4. HPA 能否解决节点资源不足?
  5. 如何避免 HPA 震荡?