3. KEDA 架构总览:核心组件、数据流与事件驱动模型

KEDA(Kubernetes Event-Driven Autoscaling)并非简单地替代 Horizontal Pod Autoscaler(HPA),而是在 Kubernetes 原生水平弹性之上,构建了一层事件驱动的感知与触发层。理解其架构,是掌握触发器与协同机制的基础。本章将拆解 KEDA 的三大核心组件,并梳理从事件发生到 Pod 副本数变化的关键数据流。

3.1 核心组件:Operator、Scaler、Metric Adapter

KEDA 由三个紧密协作的组件构成,它们各自承担不同的职责,共同将外部事件源的状态转化为 Kubernetes 可理解的伸缩指令。

组件 职责 部署形态 关键行为
Operator 生命周期管理与协调 Deployment(通常 2 副本) 监听 ScaledObject / ScaledJob CRD,管理 HPA 的创建、更新与删除。
Scaler 事件源数据采集与指标计算 Operator 内部模块(或 gRPC 插件) 连接外部系统(Kafka、Prometheus、RabbitMQ 等),获取指标值并返回给 Metric Adapter。
Metric Adapter 指标暴露与 HPA 对接 Deployment(通常 2 副本) 实现 Kubernetes 的 custom.metrics.k8s.io API,将 Scaler 计算的指标值暴露给 HPA。
架构要点: Operator 是“大脑”,负责策略与编排;Scaler 是“感官”,负责感知外部世界;Metric Adapter 是“翻译官”,负责将感知结果翻译成 HPA 能读懂的指标格式。

3.2 核心数据流:从事件到伸缩

一个完整的事件驱动伸缩周期,遵循以下 6 个步骤。理解这个数据流,是排查伸缩异常和优化触发器配置的前提。

  1. 用户定义:运维人员创建 ScaledObject 或 ScaledJob 自定义资源,声明目标工作负载、触发器类型(如 Kafka Lag)、阈值等参数。
  2. Operator 监听与协调:KEDA Operator 通过 Informer 机制监听到 CRD 的创建/更新事件,开始协调循环。
  3. 创建/更新 HPA:Operator 根据 ScaledObject 的配置,动态生成一个指向 KEDA Metric Adapter 的 HPA 资源。
  4. HPA 轮询指标:Kubernetes HPA 按照默认(或自定义)的间隔(通常 15s),通过 custom.metrics.k8s.io API 向 KEDA Metric Adapter 请求指标值。
  5. Scaler 采集与计算:Metric Adapter 收到请求后,调用对应的 Scaler(如 Kafka Scaler)。Scaler 连接外部事件源,获取当前指标(如消费者组 Lag),并根据 ScaledObject 中的 targetValue 或 targetAverageValue 计算出期望的副本数。
  6. HPA 执行伸缩:Metric Adapter 将计算后的指标值返回给 HPA。HPA 根据当前指标值与目标值的比值,计算出期望的 Pod 副本数,并调整 Deployment 或 StatefulSet 的 replicas 字段。
关键延迟点: 从事件发生到 Pod 扩容,主要延迟来自 HPA 的轮询周期(默认 15s)和 Scaler 的查询耗时。对于延迟敏感的场景,可以通过调整 HPA 的 --horizontal-pod-autoscaler-sync-period 参数来缩短轮询间隔。

3.3 事件驱动模型与组件协同

KEDA 的事件驱动模型并非简单的“事件-动作”直连,而是一种基于控制循环的“感知-决策-执行”模型。下图展示了核心组件之间的协同关系与数据流向。

KEDA 核心组件协同与数据流 KEDA 核心组件协同与数据流 外部事件源 Kafka / RabbitMQ / HTTP Scaler 模块 采集 & 计算指标 ① 拉取指标 Metric Adapter custom.metrics.k8s.io ② 返回指标值 HPA Kubernetes 原生 ③ 暴露指标 Operator 管理 HPA 生命周期 ④ 创建/更新 目标工作负载 Deployment / StatefulSet ⑤ 调整副本数 💡 控制循环 HPA 持续轮询 → Scaler 持续采集 → 闭环反馈

3.4 ScaledObject 与 ScaledJob:事件驱动的入口

KEDA 通过两个核心 CRD 来定义伸缩规则。它们是用户与 KEDA 交互的主要接口,也是 Operator 协调循环的输入源。

  • ScaledObject:用于无状态或有状态服务的持续伸缩。它管理一个 HPA,并根据实时指标动态调整 Deployment、StatefulSet 或任何实现了 /scale 子资源的自定义资源的副本数。
  • ScaledJob:专为批处理任务设计。它不创建 HPA,而是根据事件(如 Kafka 消息积压)直接创建 Kubernetes Job。每个事件单元(如一个分区的一个消息批次)可以触发一个 Job 实例,任务完成后 Pod 自动退出。
选择依据: 如果工作负载需要持续运行并处理请求(如 Web 服务、API 网关),使用 ScaledObject。如果工作负载是离散的、可并行处理的批处理任务(如数据清洗、图片转码),使用 ScaledJob。错误的选择会导致资源浪费或任务处理延迟。

3.5 组件部署拓扑与高可用

在生产环境中,KEDA 的 Operator 和 Metric Adapter 通常以多副本 Deployment 的形式部署,以确保控制面的高可用。Scaler 作为 Operator 进程内的模块或独立的 gRPC 插件运行,其可用性依赖于 Operator 的可用性。

组件 推荐副本数 高可用策略 故障影响
Operator 2 Leader Election(基于 ConfigMap 或 Lease) Leader 故障时,Follower 接管,期间 CRD 协调暂停。
Metric Adapter 2 无状态水平扩展,前端 Service 负载均衡 单个实例故障不影响指标查询,HPA 请求被路由到健康实例。
Scaler 随 Operator Operator 内部模块,依赖 Operator 高可用 Operator 故障时,Scaler 无法被调用,指标查询失败。
生产建议: 将 KEDA 组件部署在独立的命名空间(如 keda)中,并配置资源请求与限制(Request/Limit),避免被业务 Pod 挤占资源。同时,为 Metric Adapter 配置 PodDisruptionBudget(PDB),确保滚动更新期间至少有一个副本可用。