3. 架构总览:KEDA核心组件及其交互流程

KEDA(Kubernetes Event-Driven Autoscaling)的架构设计遵循“事件驱动、解耦控制”的原则。整个控制面由三个核心组件构成:Operator、Metrics Server 和 Admission Webhooks。它们各司其职,通过标准 Kubernetes API 扩展机制协同工作,将外部事件指标转化为 HPA 可消费的指标数据,实现从“被动轮询”到“事件触发”的弹性伸缩范式转变。

3.1 核心组件职责与定位

组件 部署形态 核心职责 关键接口
Operator Deployment(通常 2 副本) 管理 ScaledObject / ScaledJob CRD 的生命周期;协调 HPA 的创建与更新;驱动事件源连接器的激活/去激活 Reconcile 循环、Kubernetes API
Metrics Server Deployment(通常 2 副本) 实现 custom.metrics.k8s.io 与 external.metrics.k8s.io API;从 Scaler 拉取指标值并缓存;响应 HPA 的指标查询请求 Kubernetes API Aggregation Layer
Admission Webhooks Deployment(与 Operator 合并部署或独立) 对 ScaledObject / ScaledJob 的创建/更新操作进行校验与默认值注入;防止配置错误导致控制面异常 MutatingWebhookConfiguration / ValidatingWebhookConfiguration
架构要点:Operator 是“大脑”,负责决策与编排;Metrics Server 是“感官”,负责感知与传递指标;Admission Webhooks 是“守门员”,负责在配置进入系统前进行校验。三者缺一不可,共同构成闭环的控制面。

3.2 组件交互流程:从事件到伸缩

下图展示了 KEDA 控制面在收到外部事件后,各组件之间的完整交互链路:

KEDA 核心组件交互流程 KEDA 核心组件交互流程 外部事件源 Kafka / RabbitMQ / Prometheus Scaler 连接器 指标拉取与转换 Operator Reconcile 循环 HPA Metrics Server 指标缓存与 API 聚合 Admission Webhooks 校验与默认值注入 kubectl apply ScaledObject Deployment scale 交互流程说明: ① 用户创建 ScaledObject → ② Webhooks 校验并注入默认值 → ③ Operator 创建/更新 HPA → ④ HPA 通过 Metrics Server 查询指标 → ⑤ Metrics Server 通过 Scaler 拉取外部事件指标 → ⑥ HPA 根据指标调整 Deployment 副本数

3.3 交互流程分步详解

  1. 配置提交与准入控制:用户通过 kubectl apply 提交 ScaledObject 或 ScaledJob 资源。请求到达 API Server 后,Admission Webhooks 拦截请求,执行校验逻辑(如检查触发器类型是否合法、命名空间是否存在)并注入默认值(如默认 pollingInterval、cooldownPeriod)。
  2. Operator 协调循环:校验通过后,资源持久化到 etcd。Operator 通过 Informer 机制监听到资源变化,进入 Reconcile 循环。Operator 根据 ScaledObject 的触发器定义,创建或更新对应的 HPA 资源,并将 ScaledObject 的状态同步到 Status 字段。
  3. HPA 指标查询:Kubernetes 内置的 HPA Controller 定期(默认 15 秒)向 Metrics Server 查询指标。Metrics Server 实现了 custom.metrics.k8s.io 和 external.metrics.k8s.io API,通过 Kubernetes API Aggregation Layer 注册。
  4. Scaler 指标拉取:Metrics Server 收到查询请求后,根据指标名称找到对应的 Scaler 连接器(如 Kafka Scaler、Prometheus Scaler),调用其 GetMetrics() 方法从外部事件源拉取实时指标值,并缓存结果。
  5. 伸缩决策与执行:HPA Controller 获取到指标值后,计算期望副本数,并更新目标 Deployment / StatefulSet 的 replicas 字段。Kubernetes 控制面随后执行实际的 Pod 扩缩容操作。
关键设计决策:Metrics Server 与 Scaler 之间的交互是“拉取(Pull)”模式,而非“推送(Push)”。这保证了 HPA 的查询节奏由 Kubernetes 控制面统一调度,避免事件洪峰时 Scaler 被大量并发请求打满。同时,Metrics Server 内置缓存层,在 pollingInterval 内重复查询直接返回缓存值,降低外部系统压力。

3.4 组件间通信协议与端口

通信路径 协议 默认端口 安全机制
API Server → Admission Webhooks HTTPS (Webhook) 443 (Service) TLS 证书验证
Operator → Kubernetes API HTTPS 6443 (API Server) ServiceAccount + RBAC
HPA Controller → Metrics Server HTTPS (Aggregated API) 443 (API Server 代理) API 聚合层认证
Metrics Server → Scaler gRPC / HTTP 自定义(Scaler 暴露) 可选 mTLS

3.5 高可用与故障隔离设计

KEDA 控制面在生产环境中通常以多副本部署,并利用 Kubernetes 原生能力实现高可用:

  • Operator 多副本:通过 leader election(基于 ConfigMap 或 Lease)确保同一时刻只有一个活跃的 Reconcile 循环,避免资源竞争。故障时备用副本自动接管。
  • Metrics Server 无状态设计:所有指标缓存存储在内存中,多副本之间不共享状态。HPA 查询会随机路由到任意副本,单副本故障仅影响缓存命中率,不会导致伸缩中断。
  • Admission Webhooks 故障模式:Webhooks 配置了 failurePolicy: Fail 或 failurePolicy: Ignore。关键校验场景使用 Fail 模式确保配置正确性;非关键场景使用 Ignore 模式避免 Webhooks 故障阻塞整个集群的资源创建。
生产注意事项:Metrics Server 的缓存过期时间(cacheTTL)需要与 ScaledObject 的 pollingInterval 协调。如果 cacheTTL 大于 pollingInterval,可能导致 HPA 读到过期指标,造成伸缩滞后。建议 cacheTTL 设置为 pollingInterval 的 50%-70%。