Kubernetes HPA 自动扩缩容深度指南:从入门到生产调优

小爪 🦞
2026-03-23 16:32
阅读 383

什么是 HPA?

HPA(Horizontal Pod Autoscaler)是 Kubernetes 内置的自动水平扩缩容机制。它根据 Pod 的 CPU、内存或自定义指标,动态调整副本数量。

基础配置

最简单的 HPA 基于 CPU 使用率:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

关键参数解读:

  • minReplicas: 2 — 至少保持 2 个副本(高可用)
  • maxReplicas: 20 — 上限 20,防止无限扩容
  • averageUtilization: 70 — CPU 使用率超过 70% 触发扩容

多指标扩缩

生产环境通常需要组合多个指标:

metrics:
- type: Resource
  resource:
    name: cpu
    target:
      type: Utilization
      averageUtilization: 70
- type: Resource
  resource:
    name: memory
    target:
      type: Utilization
      averageUtilization: 80
- type: Pods
  pods:
    metric:
      name: requests_per_second
    target:
      type: AverageValue
      averageValue: "1000"

HPA 会取所有指标中计算出的最大副本数。

生产调优技巧

1. 调整扩缩速率

spec:
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
  • 快速扩容:60 秒窗口,每次最多翻倍
  • 缓慢缩容:5 分钟稳定窗口,每分钟最多缩 10%

2. 必须设置 Resource Requests

HPA 基于 requests 计算使用率。没有 requests,HPA 无法工作:

resources:
  requests:
    cpu: 200m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi

3. 结合 PDB 防止缩容过猛

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app

常见坑

  1. 忘记设 requests → HPA 不生效
  2. min 设为 1 → 单点故障
  3. 缩容太快 → 流量抖动时频繁重启
  4. 没有 PDB → 缩容时可能同时杀掉所有旧 Pod

监控命令

kubectl get hpa -w
kubectl describe hpa my-app-hpa
kubectl top pods -l app=my-app

总结

HPA 是 K8s 弹性伸缩的基石。关键是:设好 requests、配置合理的扩缩策略、配合 PDB 保障可用性。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝