2. KEDA 核心架构:四大组件详解

KEDA 的运行时架构围绕四个核心自定义资源(CRD)构建:ScaledObject、ScaledJob、TriggerAuthentication 和 ClusterTriggerAuthentication。这四个组件共同定义了“何时扩缩”、“扩缩什么”以及“如何安全访问指标源”的完整语义。理解它们之间的关系是掌握 KEDA 的关键。

2.1 组件全景与职责划分

下表从作用范围、目标负载类型和核心职责三个维度对四个组件进行对比:

组件名称 作用范围 目标负载类型 核心职责
ScaledObject 命名空间级 Deployment / StatefulSet / 自定义资源 定义基于指标的弹性扩缩规则,将外部指标映射到 HPA
ScaledJob 命名空间级 Job 基于事件驱动触发 Job 创建,适用于批处理与消息队列消费
TriggerAuthentication 命名空间级 ScaledObject / ScaledJob 提供单个命名空间内的指标源认证凭据
ClusterTriggerAuthentication 集群级 ScaledObject / ScaledJob 提供跨命名空间共享的指标源认证凭据
设计原则: ScaledObject 与 ScaledJob 是“策略声明”,TriggerAuthentication 与 ClusterTriggerAuthentication 是“安全凭据”。这种分离使得凭据管理可以独立于扩缩策略,符合最小权限与职责分离的安全基线要求。

2.2 ScaledObject:无状态工作负载的弹性引擎

ScaledObject 是 KEDA 最常用的资源,它定义了如何根据外部指标自动扩缩 Deployment 或 StatefulSet。KEDA 控制器会为每个 ScaledObject 自动生成一个对应的 HPA(Horizontal Pod Autoscaler)对象,并将外部指标源转换为 HPA 可消费的格式。

一个典型的 ScaledObject YAML 包含以下关键字段:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: consumer-scaler
  namespace: production
spec:
  scaleTargetRef:
    name: event-consumer          # 目标 Deployment 名称
    kind: Deployment              # 支持 Deployment / StatefulSet
  pollingInterval: 15             # 每 15 秒轮询一次指标源
  cooldownPeriod: 60              # 指标低于阈值后等待 60 秒再缩容
  minReplicaCount: 2              # 最小副本数(安全基线)
  maxReplicaCount: 50             # 最大副本数(削峰上限)
  triggers:
    - type: kafka                 # 触发器类型
      metadata:
        topic: orders
        bootstrapServers: kafka-cluster:9092
        lagThreshold: "100"       # 滞后超过 100 条时触发扩容
      authenticationRef:
        name: kafka-auth          # 引用 TriggerAuthentication
冷启动削峰策略: 设置 minReplicaCount: 2 确保基线容量;cooldownPeriod: 60 防止指标抖动导致频繁缩容;pollingInterval: 15 在流量突增时快速响应。这三个参数共同构成冷启动削峰的基础调优组合。

2.3 ScaledJob:事件驱动的批处理执行器

ScaledJob 专为 Job 类型负载设计。与 ScaledObject 持续维持副本数不同,ScaledJob 在检测到事件(如消息队列积压)时创建新的 Job 实例,任务完成后 Job 自动退出。这种模式非常适合非实时、可并行处理的批处理场景。

ScaledJob 与 ScaledObject 的关键区别:

  • 生命周期: ScaledObject 保持 Pod 长期运行;ScaledJob 创建短期 Job,任务即结束。
  • 扩缩方式: ScaledObject 通过 HPA 调整副本数;ScaledJob 直接控制 Job 的并发创建数量。
  • 适用场景: ScaledObject 适合 API 服务、流处理;ScaledJob 适合数据迁移、日志处理、视频转码。
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
  name: batch-processor
  namespace: data-pipeline
spec:
  jobTargetRef:
    template:
      spec:
        containers:
          - name: worker
            image: myrepo/batch-worker:1.2
            command: ["process", "--input", "/data/input"]
        restartPolicy: Never
  pollingInterval: 10
  maxScalingCount: 20              # 最大并发 Job 数
  scalingStrategy:
    strategy: "default"            # 可选:default / custom / accurate
  triggers:
    - type: rabbitmq
      metadata:
        queueName: tasks
        queueLength: "50"
        host: amqp://rabbitmq:5672
      authenticationRef:
        name: rabbitmq-creds

2.4 TriggerAuthentication 与 ClusterTriggerAuthentication:安全凭据管理

这两个组件专门用于管理访问外部指标源(如 Kafka、Prometheus、AWS CloudWatch)所需的认证信息。它们将敏感凭据从 ScaledObject/ScaledJob 中剥离,避免在触发器定义中硬编码密钥。

特性 TriggerAuthentication ClusterTriggerAuthentication
作用域 单个命名空间 整个集群
引用方式 authenticationRef.name authenticationRef.name + 跨命名空间引用
典型用途 团队隔离的指标源凭据 共享基础设施(如全局 Prometheus)
Secret 来源 同一命名空间的 Secret 任意命名空间的 Secret
# TriggerAuthentication 示例
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: kafka-auth
  namespace: production
spec:
  secretTargetRef:
    - parameter: saslPassword     # KEDA 触发器参数名
      name: kafka-secrets         # Kubernetes Secret 名称
      key: sasl-password          # Secret 中的键

# ClusterTriggerAuthentication 示例
apiVersion: keda.sh/v1alpha1
kind: ClusterTriggerAuthentication
metadata:
  name: global-prometheus-auth
spec:
  secretTargetRef:
    - parameter: bearerToken
      name: prometheus-      # 可引用任意命名空间的 Secret
      key: 
安全基线提醒: 优先使用 ClusterTriggerAuthentication 管理全局共享凭据,避免在每个命名空间重复创建相同的 TriggerAuthentication。同时确保 Secret 的 RBAC 权限严格限定,防止凭据泄露。

2.5 组件协作流程

下图展示了 ScaledObject、TriggerAuthentication 与底层 Kubernetes 资源之间的完整协作链路:

KEDA 核心组件协作流程 用户提交 ScaledObject 用户提交 TriggerAuth KEDA 控制器 HPA (自动生成) Deployment / Pod 外部指标源 (Kafka/Prom) Secret / 凭据 流程说明: ① 用户创建 ScaledObject 和 TriggerAuthentication → ② KEDA 控制器解析并生成 HPA → ③ HPA 根据外部指标调整 Deployment 副本数 ④ KEDA 通过 TriggerAuthentication 提供的凭据安全访问外部指标源 → ⑤ 指标数据驱动扩缩决策

2.6 组件关系总结

  • ScaledObject ↔ ScaledJob: 二选一,根据负载类型选择。前者用于长期服务,后者用于批处理。
  • ScaledObject/ScaledJob ↔ TriggerAuthentication: 通过 authenticationRef 字段建立引用关系,实现凭据与策略的解耦。
  • TriggerAuthentication ↔ ClusterTriggerAuthentication: 作用域不同,但接口一致。集群级认证可以被子命名空间的 ScaledObject 引用。
  • KEDA 控制器 ↔ HPA: KEDA 作为 HPA 的指标提供者,ScaledObject 的创建会触发 HPA 的自动生成与同步。
生产建议: 在部署 KEDA 时,优先使用 ClusterTriggerAuthentication 管理 Prometheus、Kafka 等全局基础设施的凭据,减少重复配置。对于多租户场景,使用命名空间级的 TriggerAuthentication 隔离不同团队的指标源访问权限。