2. KEDA 架构解析:核心组件、工作流程与事件驱动伸缩原理

KEDA(Kubernetes Event-Driven Autoscaling)并非替代 Kubernetes 内置的 Horizontal Pod Autoscaler (HPA),而是作为事件驱动的“触发器”和“数据源”扩展层,与 HPA 协同工作。理解其架构是配置事件源和构建流水线集成方案的基础。

2.1 核心组件

KEDA 由三个核心组件构成,它们各司其职,共同实现从事件感知到 Pod 副本数调整的完整闭环。

组件 部署位置 核心职责 关键行为
Operator Kubernetes 集群内 生命周期管理与协调 监听 ScaledObject / ScaledJob CRD,创建并管理 HPA 对象
Scaler Operator 内部 / 独立进程 事件源数据采集与转换 连接外部事件源(Kafka、RabbitMQ、Prometheus 等),获取指标值
Metric Adapter Kubernetes API Server 扩展 指标暴露与接口适配 将 Scaler 采集的指标以 custom.metrics.k8s.io 或 external.metrics.k8s.io 格式暴露给 HPA
架构要点: Operator 是“大脑”,负责编排;Scaler 是“感官”,负责感知外部事件;Metric Adapter 是“翻译官”,负责将感知到的数据翻译成 HPA 能理解的指标格式。

2.2 工作流程

下图展示了从事件触发到 Pod 弹性伸缩的完整工作流程。该流程是事件驱动伸缩的核心执行路径。

KEDA 事件驱动伸缩工作流程 外部事件源 Kafka / RabbitMQ / HTTP Scaler 采集指标数据 ① 拉取事件 Metric Adapter 暴露指标给 API Server ② 转换指标 HPA 计算期望副本数 ③ 查询指标 Deployment 调整 Pod 副本数 ④ 扩缩容指令 Operator 管理 ScaledObject 📌 流程说明: Scaler 拉取事件 → 指标转换 → HPA 查询 → 扩缩容
流程关键点: 整个流程中,KEDA 并不直接操作 Pod 或 Deployment。它通过标准的 Kubernetes HPA 机制间接完成扩缩容,保证了与原生生态的完全兼容。

2.3 事件驱动伸缩原理

KEDA 的事件驱动伸缩原理可以概括为“监听-采集-暴露-决策-执行”五个步骤。其核心思想是将业务事件(如消息队列长度、HTTP 请求速率)转化为 Kubernetes 可理解的 Pod 指标。

2.3.1 核心原理分解

  1. 监听(Watch): Operator 持续监听 ScaledObject 自定义资源的创建、更新和删除事件。
  2. 采集(Collect): 当 ScaledObject 被创建后,Operator 实例化对应的 Scaler。Scaler 根据配置连接到外部事件源(如 Kafka 集群),并定期拉取目标指标值(例如:lag 消费者滞后量)。
  3. 暴露(Expose): Metric Adapter 作为 Kubernetes API Server 的扩展,将 Scaler 采集到的指标值注册为 external.metrics.k8s.io 或 custom.metrics.k8s.io 资源。
  4. 决策(Decide): HPA 定期(默认 15 秒)通过 API Server 查询该指标。HPA 根据当前指标值与目标值的比率,计算出期望的 Pod 副本数。计算公式为:期望副本数 = ceil[当前副本数 × (当前指标值 / 目标指标值)]。
  5. 执行(Execute): HPA 调用 Kubernetes Scale API,更新 Deployment 或 StatefulSet 的 replicas 字段,触发实际的 Pod 扩缩容操作。

2.3.2 关键设计:ScaledObject

ScaledObject 是 KEDA 的核心自定义资源,它定义了“伸缩什么”、“根据什么伸缩”以及“如何伸缩”。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-consumer-scaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: kafka-consumer          # 伸缩目标:Deployment
  triggers:
  - type: kafka
    metadata:
      bootstrapServers: kafka-cluster:9092
      consumerGroup: my-group
      topic: my-topic
      lagThreshold: "10"          # 事件源配置:Kafka 消费者滞后阈值
  minReplicaCount: 1
  maxReplicaCount: 20
  pollingInterval: 30             # 轮询间隔:30 秒
  cooldownPeriod: 300             # 冷却时间:5 分钟
重要概念: pollingInterval 控制 Scaler 采集指标的频率;cooldownPeriod 控制缩容的等待时间,防止指标抖动导致频繁扩缩容。这两个参数直接影响伸缩的灵敏度和稳定性。

2.4 组件交互关系总结

下表总结了三个核心组件在事件驱动伸缩过程中的交互关系与数据流向。

步骤 发起方 接收方 交互内容 协议/接口
1. 配置监听 Operator Kubernetes API Server Watch ScaledObject 资源 Kubernetes API
2. 指标采集 Scaler 外部事件源 拉取队列深度、请求速率等 gRPC / HTTP / 协议特定客户端
3. 指标注册 Metric Adapter Kubernetes API Server 注册为 external.metrics 资源 Kubernetes API 扩展
4. 指标查询 HPA Metric Adapter 获取当前指标值 custom.metrics.k8s.io API
5. 扩缩容执行 HPA Deployment / StatefulSet 更新 replicas 字段 Kubernetes Scale API
架构总结: KEDA 通过 Operator 模式扩展了 Kubernetes 的伸缩能力,将“基于 CPU/内存”的简单伸缩升级为“基于任意业务事件”的智能伸缩。这种架构使得流水线构建触发器可以根据代码提交、镜像构建完成、测试队列长度等事件,自动调整构建 Pod 的数量,显著提升资源利用率和构建效率。