1. KEDA 概述:事件驱动自动伸缩的核心

1.1 KEDA 是什么

KEDA(Kubernetes Event-Driven Autoscaling)是一个基于 Kubernetes 的事件驱动自动伸缩组件。它能够监控外部事件源(如消息队列、数据库、监控系统等)的负载指标,并根据这些指标动态调整工作负载的副本数。KEDA 由 Microsoft 和 Red Hat 联合开源,现已成为 CNCF 孵化项目。

一句话定义:KEDA 让 Kubernetes 工作负载能够根据任何事件源的指标进行自动伸缩,而不仅仅是 CPU/内存。

1.2 KEDA 的核心价值

  • 事件源全覆盖:支持 50+ 内置 Scaler(Kafka、RabbitMQ、AWS SQS、Azure Queue、Prometheus、MySQL、PostgreSQL 等),无需自定义开发。
  • 零副本伸缩:当事件源无消息时,KEDA 可将工作负载缩到 0 副本,节省资源;事件到达时自动从 0 扩展到 1+。
  • 与 HPA 原生集成:KEDA 作为 Metrics Server 的指标提供者,生成的指标直接由 Kubernetes HPA 消费,无需替换现有组件。
  • Serverless 友好:为 Knative、OpenFaaS 等 Serverless 框架提供底层自动伸缩能力,实现真正的按需付费。
  • 多租户安全:支持 ClusterScaledObject 跨命名空间管理,满足企业级隔离需求。

1.3 KEDA 与传统 HPA 的区别

对比维度 传统 HPA KEDA
指标来源 仅支持 Kubernetes 内置指标(CPU/内存)或自定义 Metrics API 支持 50+ 外部事件源,包括消息队列、数据库、监控系统、云服务等
缩到零 不支持缩到 0 副本(最小副本数通常为 1) 支持缩到 0 副本,事件到达时自动从 0 扩展
伸缩延迟 依赖 Metrics Server 轮询周期(默认 15s),响应较慢 事件驱动触发,秒级响应,尤其适合突发流量
配置复杂度 需要额外部署 Metrics Server 和自定义指标适配器 通过 ScaledObject CRD 声明式配置,一行 YAML 即可接入事件源
适用场景 稳态负载、CPU/内存密集型应用 事件驱动、消息队列、流处理、Serverless 工作负载
最佳实践:KEDA 并非替代 HPA,而是增强 HPA。KEDA 负责提供外部指标,HPA 负责执行伸缩决策,两者协同工作。

1.4 KEDA 的架构组件

KEDA 由以下核心组件构成,它们协同完成事件感知、指标暴露和伸缩触发:

KEDA 架构组件图 事件源(Event Sources) Kafka / RabbitMQ AWS SQS / Azure Queue Prometheus / MySQL PostgreSQL / Redis ... 50+ 内置 Scaler KEDA Operator ScaledObject Controller Scaler 管理 & 指标采集 CRD 校验 & 状态更新 事件源连接管理 Metrics Server KEDA Metrics Adapter 暴露外部指标 Metrics API 端点 HPA 读取外部指标 计算目标副本数 触发 Deployment 伸缩 Deployment / StatefulSet 工作负载副本管理 Pod 创建 / 销毁 滚动更新 / 回滚 消费/处理 KEDA 通过 ScaledObject CRD 声明事件源连接信息,Operator 采集指标后由 Metrics Adapter 暴露,HPA 消费指标完成伸缩

1.5 组件职责详解

组件 职责 关键资源
KEDA Operator 监听 ScaledObject CRD,管理 Scaler 生命周期,采集事件源指标 ScaledObject、ClusterScaledObject、TriggerAuthentication
Metrics Adapter 将 KEDA 采集的外部指标转换为 Kubernetes Metrics API 格式 APIService、PodMonitor
Scaler 每个事件源对应一个 Scaler 实现,负责连接事件源并获取当前负载值 内置 50+ Scaler,支持自定义 Scaler
HPA Kubernetes 原生组件,读取外部指标并执行伸缩决策 HorizontalPodAutoscaler
工作负载 被伸缩的目标,通常是 Deployment、StatefulSet 或 Custom Resource Deployment、StatefulSet、Knative Service
注意:KEDA 不直接管理 Pod 副本数,而是通过 HPA 间接控制。KEDA 负责“感知事件”,HPA 负责“执行伸缩”。这种解耦设计保证了与 Kubernetes 生态的兼容性。

1.6 工作流程总结

  1. 定义 ScaledObject:用户创建 ScaledObject CRD,声明事件源类型、连接参数、目标工作负载和伸缩策略。
  2. Operator 监听:KEDA Operator 监听 ScaledObject 事件,实例化对应的 Scaler 并建立与事件源的连接。
  3. 指标采集:Scaler 定期从事件源拉取当前负载指标(如队列深度、消息积压数、请求延迟等)。
  4. 指标暴露:Metrics Adapter 将采集到的指标注册到 Kubernetes Metrics API,供 HPA 读取。
  5. HPA 伸缩:HPA 根据指标值和目标阈值计算期望副本数,调整工作负载的 replicas 字段。
  6. 零副本处理:当事件源无消息时,KEDA 通知 HPA 将副本数缩到 0;新消息到达时,KEDA 立即触发扩容。
关键设计理念:KEDA 的“事件驱动”体现在 Scaler 层,而非 HPA 层。HPA 仍然是基于指标的周期性轮询,但 KEDA 通过 Scaler 将事件源的实时状态转化为指标,实现了事件到指标的桥接。