Kubernetes HPA 自动扩缩容详解:指标、策略、资源与常见故障

本文只讲 Kubernetes Horizontal Pod Autoscaler,重点覆盖 HPA 原理、Metrics Server、CPU/内存指标、自定义指标、扩缩容策略和生产排障。

一、HPA 是什么

HPA 是 Kubernetes 的水平 Pod 自动扩缩容控制器。它周期性读取指标,根据当前值和目标值计算需要的副本数量,然后修改 Deployment 或其他可扩缩资源的副本数。

HPA 只改变 Pod 副本数,不负责创建节点,也不保证下游数据库、缓存和外部 API 能承受更多流量。如果集群没有空闲资源,HPA 扩容后的 Pod 可能一直 Pending。

二、最基础的 HPA 配置

yaml 复制代码
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

这里的目标是让 Pod 平均 CPU 使用率接近 70%,副本数不低于 2、不超过 10。实际计算还会受到当前副本数、指标采集周期和稳定窗口影响。

三、为什么 requests 很重要

如果使用 CPU 或内存利用率指标,Pod 必须正确设置资源 requests。利用率通常是实际使用量相对于 request 的比例。

yaml 复制代码
resources:
  requests:
    cpu: "200m"
    memory: "256Mi"
  limits:
    cpu: "1"
    memory: "512Mi"

没有合理 requests,HPA 可能无法计算利用率,或者计算出的扩容结果与业务实际容量不一致。requests 太小会导致利用率看起来很高,requests 太大又可能造成扩容迟钝和资源浪费。

四、HPA 支持的指标

1. CPU 和内存

适合基础资源型服务,但不能直接代表请求量和用户体验。

2. 自定义指标

可以根据请求速率、队列长度、并发数、消息积压和业务指标扩缩容。自定义指标需要 Metrics Adapter 或监控系统提供相应接口。

3. 外部指标

例如云队列长度、消息系统积压和外部流量。使用外部指标时必须考虑权限、网络和指标可用性。

五、扩缩容策略

HPA 需要避免频繁扩缩容。生产环境应配置稳定窗口和行为策略:

yaml 复制代码
behavior:
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
      - type: Percent
        value: 100
        periodSeconds: 60
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
      - type: Percent
        value: 25
        periodSeconds: 60

通常扩容希望更快,缩容则更谨慎,避免流量波动导致副本来回变化。应用启动慢时,扩容策略还要结合启动时间、就绪探针和预热机制。

六、HPA 与 Cluster Autoscaler 的关系

HPA 增加 Pod 副本,Cluster Autoscaler 根据 Pending Pod 再增加节点。两者解决的是不同层次的问题:

text 复制代码
流量上升 -> HPA 增加 Pod -> 节点资源不足 -> Cluster Autoscaler 增加节点

只有 HPA 没有节点扩容能力时,扩容的 Pod 可能无法调度;只有节点自动扩容没有 HPA 时,节点增加也不会自动增加应用副本。

七、常见问题排查

1. HPA 显示 unknown

检查 Metrics Server、APIService、证书、网络和 Pod 的 requests 配置:

bash 复制代码
kubectl get hpa
kubectl describe hpa web-hpa
kubectl top pods
kubectl top nodes

2. CPU 很高但 HPA 不扩容

确认目标对象正确、指标可用、requests 存在、HPA 没有达到 maxReplicas,且控制器没有报权限或指标错误。

3. 扩容后 Pod 一直 Pending

检查节点 CPU、内存、亲和性、污点、资源配额和拓扑约束。HPA 只修改副本数,不会自动解决所有调度条件。

4. 副本频繁上下波动

检查指标抖动、启动探针、稳定窗口、缩容策略和请求突发。适当延长缩容稳定窗口,并降低缩容速度。

5. 扩容了但业务仍然变慢

检查数据库连接、缓存、队列、外部 API、网络和限流。应用副本增加不代表所有下游都能承受更高并发。

八、生产实践建议

  1. 先为 Deployment 设置准确的 requests 和 limits。
  2. 选择能反映业务容量的指标,不只依赖 CPU。
  3. 明确 minReplicas 和 maxReplicas 的容量依据。
  4. 为慢启动应用配置合理探针和预热时间。
  5. 扩容快、缩容慢,避免抖动。
  6. 配合 Cluster Autoscaler 或预留节点资源。
  7. 监控 HPA 当前副本、期望副本、指标值和事件。
  8. 评估数据库、缓存和消息系统的承载能力。
  9. 压测验证扩缩容延迟和最大容量。

九、总结

HPA 是 Kubernetes 中根据指标自动调整 Pod 副本数的控制器。它的效果取决于指标质量、requests 配置、扩缩容策略、调度资源、应用启动速度和下游依赖。

真正可靠的自动扩缩容不是把 maxReplicas 设置得很大,而是知道业务高峰需要多少容量、扩容需要多久、下游能承受多少请求,以及扩容失败时如何降级和告警。

CSDN 发布时先上传 k8s-hpa-autoscaling.png,再替换图片路径。

相关推荐
一级新生1 小时前
Dify 日常使用手册(小白版)
人工智能·docker·云原生·eureka·dify·ai工具
Z21-X2 小时前
云原生运维学习笔记:KVM实战——从环境搭建到热迁移的硬核体验
运维·笔记·学习·云原生
阿里云云原生17 小时前
Personal Agent 观察:拆解全天候运行的技术挑战
云原生·agent
SelectDB技术团队18 小时前
Snowflake 的开源替代怎么选:能力对照、三条部署路径与迁移执行
大数据·数据库·云原生·开源·snowflake·apache doris
时间售卖铺18 小时前
Nginx 反向代理
运维·nginx·云原生
Regentsoft丽晶软件18 小时前
服装B2B分销返利规则引擎:多返利池与历史订单区分的技术设计
云原生·产品运营·需求分析
阿里云云原生19 小时前
非算法工程师也能看懂,推理框架的来龙去脉
云原生
Lysander.Jovian21 小时前
Node 和 Cluster部署
kubernetes
m0_6174939421 小时前
昇腾 NPU Docker 部署实战:解决 stub library 报错并实现模型正常加载
运维·docker·容器