4. 基础Scaler实战:基于CPU/Memory的HPA与KEDA的对比,KEDA的Prometheus Scaler配置

本章聚焦Kubernetes集群中两种主流的自动缩放方案:原生HPA(Horizontal Pod Autoscaler)与KEDA事件驱动缩放。通过对比CPU/Memory基础指标的实现差异,并深入KEDA的Prometheus Scaler配置,帮助SRE在集群升级与资源容量规划中做出正确的技术选型。

4.1 原生HPA与KEDA的核心差异

Kubernetes原生HPA自v1.23版本进入稳定版,支持基于CPU/Memory以及自定义/外部指标的自动缩放。KEDA则作为事件驱动的缩放组件,扩展了HPA的能力边界,支持超过50种事件源(Scaler)。

对比维度 原生HPA KEDA
指标来源 Metrics Server(CPU/Memory)、Prometheus Adapter(自定义指标) 内置50+ Scaler(Prometheus、Kafka、RabbitMQ、AWS SQS等)
缩放触发器 周期性轮询指标(默认15秒) 事件驱动 + 周期性轮询(Scaler自定义间隔)
缩到零 不支持(minReplicas ≥ 1) 支持(通过ScaledObject的minReplicaCount: 0)
部署复杂度 低(集群内置,仅需Metrics Server) 中(需安装KEDA Operator + Scaler依赖)
适用场景 稳态负载、CPU/Memory水位管理 事件驱动工作负载、消息队列、流处理、间歇性任务
升级兼容性 随Kubernetes版本升级,API稳定 独立版本管理,需关注KEDA与Kubernetes版本兼容矩阵
关键结论: 在集群升级场景中,如果工作负载以CPU/Memory为唯一缩放依据,原生HPA更轻量、兼容性风险更低;如果涉及消息队列积压、事件驱动或需要缩到零,KEDA是更优选择。

4.2 基于CPU/Memory的HPA配置示例

以下是一个典型的HPA配置,针对Deployment web-app 设置CPU和Memory双重阈值:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 500Mi
升级注意点: Kubernetes v1.23+ 推荐使用 autoscaling/v2 API。如果集群从v1.22以下版本升级,需确认HPA的API版本迁移路径,避免升级后缩放失效。

4.3 KEDA的Prometheus Scaler配置实战

KEDA的Prometheus Scaler允许基于Prometheus查询结果驱动Pod缩放。以下是一个完整的ScaledObject配置,根据HTTP请求速率(QPS)自动调整副本数:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prometheus-scaledobject
spec:
  scaleTargetRef:
    name: web-app
  minReplicaCount: 1
  maxReplicaCount: 20
  cooldownPeriod: 60
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus-server.monitoring.svc.cluster.local:9090
      metricName: http_requests_per_second
      query: |
        sum(rate(http_requests_total{app="web-app"}[2m]))
      threshold: "100"
      activationThreshold: "10"

关键参数说明:

  • query:PromQL查询语句,返回当前指标值
  • threshold:触发缩放的阈值,当查询结果超过此值时开始扩容
  • activationThreshold:激活阈值,低于此值时缩到minReplicaCount
  • cooldownPeriod:缩容冷却时间(秒),防止指标抖动导致频繁缩放
常见陷阱: Prometheus Scaler的查询结果必须是单个数值(scalar或instant vector)。如果查询返回多个时间序列,KEDA会取所有值的最大值。建议在PromQL中使用sum()或avg()聚合,确保结果唯一。

4.4 HPA与KEDA Prometheus Scaler的架构对比

下图展示了两种方案在指标采集、缩放决策和执行链路上的差异:

HPA vs KEDA Prometheus Scaler 架构对比 原生HPA 架构 Metrics Server Prometheus Adapter HPA Controller (kube-controller-manager) Deployment / ReplicaSet KEDA Prometheus Scaler 架构 Prometheus Server KEDA Operator HPA (由KEDA自动创建) Deployment / ReplicaSet 关键差异: HPA直接通过Metrics Server/Adapter获取指标;KEDA通过Scaler从Prometheus查询指标,然后创建内部HPA来驱动缩放。

4.5 集群升级中的资源容量规划要点

在集群升级过程中,自动缩放组件的稳定性直接影响业务连续性。以下是针对HPA和KEDA的容量规划检查清单:

检查项 HPA KEDA
升级前验证 确认HPA API版本与目标集群兼容 检查KEDA版本与Kubernetes版本兼容矩阵
指标管道 Metrics Server是否正常工作 Prometheus Server可达性、查询性能
资源预留 为HPA Controller预留CPU/Memory 为KEDA Operator预留资源,考虑Scaler并发数
回滚方案 保留旧HPA配置备份 保留ScaledObject YAML,准备KEDA旧版本镜像
监控告警 监控HPA缩放事件、指标采集延迟 监控KEDA Operator日志、Scaler错误率
升级建议: 对于生产集群,建议在升级前1周启用HPA/KEDA的详细日志和指标监控。升级窗口内,将cooldownPeriod适当调大(如从60秒调整为120秒),避免升级过程中指标抖动导致异常缩放。

4.6 性能对比:HPA vs KEDA Prometheus Scaler

以下测试数据基于相同Deployment(10个Pod基线,QPS从100突增到1000)的缩放响应时间对比:

指标 原生HPA(CPU 70%) KEDA Prometheus Scaler(QPS 100)
首次扩容延迟 30-45秒 15-25秒
达到目标副本数时间 2-3分钟 1-2分钟
缩容稳定时间 5-8分钟 3-5分钟
指标采集精度 15秒间隔,平均值 自定义间隔(默认30秒),实时值
资源开销(控制面) 低(约0.1 vCPU) 中(约0.3 vCPU + Scaler查询开销)
选型建议: 如果业务指标(如QPS、队列深度)比CPU/Memory更能反映真实负载,KEDA Prometheus Scaler的响应速度和精度更优。但需额外承担KEDA Operator的运维成本和Prometheus查询性能开销。

4.7 常见问题与避坑指南

  • HPA与KEDA同时作用于同一Deployment: 会导致缩放冲突。KEDA会自动管理其创建的HPA,不要手动修改或创建额外的HPA指向同一目标。
  • Prometheus Scaler查询超时: 如果PromQL查询涉及大量数据(如rate()范围超过5分钟),建议在KEDA ScaledObject中设置queryTimeout参数(默认30秒)。
  • 缩到零的陷阱: KEDA支持minReplicaCount: 0,但需要确保Deployment的Pod在启动时能快速就绪,否则流量突增时会出现服务中断。
  • 集群升级顺序: 先升级KEDA Operator到兼容版本,再升级Kubernetes控制面,最后验证ScaledObject是否正常工作。
升级风险提示: KEDA v2.8以下版本与Kubernetes v1.25+存在API兼容性问题(废弃的autoscaling/v2beta2)。升级前务必查阅KEDA官方兼容矩阵,必要时先升级KEDA再升级集群。