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:激活阈值,低于此值时缩到minReplicaCountcooldownPeriod:缩容冷却时间(秒),防止指标抖动导致频繁缩放
常见陷阱: Prometheus Scaler的查询结果必须是单个数值(scalar或instant vector)。如果查询返回多个时间序列,KEDA会取所有值的最大值。建议在PromQL中使用
sum()或avg()聚合,确保结果唯一。
4.4 HPA与KEDA Prometheus Scaler的架构对比
下图展示了两种方案在指标采集、缩放决策和执行链路上的差异:
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再升级集群。