Learn
Kubernetes/15-hpa

自动扩缩容

第 6 章我们手动 kubectl scale 调整副本数,但人工盯流量既不现实也来不及。HPA(Horizontal Pod Autoscaler,水平 Pod 自动伸缩器) 能根据指标(如 CPU 使用率)自动增减副本,让应用"该扩容时扩容、该缩容时缩容"。

ℹ️HPA 的前提:必须设 resources.requests

HPA 计算 CPU 使用率时,分母用的是 Pod 的 requests.cpu。若容器没设 requests,HPA 无法计算利用率,会不工作。务必给 Deployment 写好 resources。

1. HPA 的工作原理

HPA 控制器周期性(默认 15s)查询指标服务器,算出当前平均利用率,与目标值比较,再调整 Deployment 的 replicas。

当前平均 CPU 利用率 80%   > 目标 50%   →  增加副本
当前平均 CPU 利用率 20%   < 目标 50%   →  减少副本

2. 基于 CPU 的 HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx              # 要伸缩的目标
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50    # 目标平均 CPU 利用率 50%

先确保目标 Deployment 设了 requests:

resources:
  requests: { cpu: "100m" }
  limits:   { cpu: "500m" }
💡min/max 兜底保护

minReplicas 保证低峰也不少于 2 个(高可用),maxReplicas 防止流量洪峰把集群资源吃光。二者都要设。

3. 查看 HPA 状态

kubectl get hpa
# NAME        REFERENCE          TARGETS   MINPODS  MAXPODS  REPLICAS
# nginx-hpa   Deployment/nginx   45%/50%   2        10       3
# 观察伸缩事件
kubectl describe hpa nginx-hpa

4. 基于自定义/多指标

HPA v2 支持多指标组合,也能用内存或自定义指标(需 Prometheus Adapter 等采集):

metrics:
  - type: Resource
    resource:
      name: cpu
      target: { type: Utilization, averageUtilization: 60 }
  - type: Resource
    resource:
      name: memory
      target: { type: Utilization, averageUtilization: 70 }
⚠️缩容有冷却时间

HPA 缩容比扩容保守(默认有冷却窗口,约 5 分钟),避免指标抖动造成副本频繁增减("抖动")。调优时可关注 behavior 字段。

5. 压测验证

# 在 Pod 里制造 CPU 压力,观察副本数是否上涨
kubectl exec -it <pod> -- sh -c "yes > /dev/null &"
🎯练习

为 nginx Deployment 配一个 HPA(目标 CPU 50%,2–10 副本),用上面的 yes 命令制造负载,观察 kubectl get hpa 中 REPLICAS 上升;停止负载后看它是否自动缩回。

小结

  • HPA 按指标(默认 CPU 利用率)自动调副本数
  • 目标 Deployment 必须设 resources.requests,否则 HPA 不工作
  • minReplicas/maxReplicas 提供高可用与资源保护
  • 支持 CPU/内存/自定义多指标组合
  • 下一章系统学习运维排障思路 →