3. KEDA 核心概念:ScaledObject、ScaledJob、TriggerAuthentication、ClusterTriggeredScaler 原理

KEDA(Kubernetes Event-Driven Autoscaling)的核心价值在于将事件驱动的弹性伸缩能力无缝注入 Kubernetes 生态。理解其四大核心原语——ScaledObject、ScaledJob、TriggerAuthentication 与 ClusterTriggeredScaler——是掌握 KEDA 架构与容量规划实践的基础。本章将从原理、配置模型与适用场景三个维度深入剖析这些概念。

3.1 核心原语总览

KEDA 通过 CRD(Custom Resource Definition)扩展 Kubernetes API,以下表格概括了四大核心原语的角色与定位:

原语名称 作用对象 核心职责 典型场景
ScaledObject Deployment / StatefulSet / Custom Resource 定义事件源与目标工作负载的缩放规则 基于 Kafka 消息积压自动扩缩 Web 服务
ScaledJob Job 根据事件触发批处理任务的创建与清理 消息队列触发一次性数据处理任务
TriggerAuthentication Secret / Pod Identity / 环境变量 为 ScaledObject/ScaledJob 提供事件源认证凭据 连接 Azure Service Bus 时传递连接字符串
ClusterTriggeredScaler 集群级(跨命名空间) 全局统一管理多个命名空间的缩放策略 平台团队为所有租户定义统一的 RabbitMQ 缩放规则
关键设计原则: KEDA 不替代 HPA(Horizontal Pod Autoscaler),而是作为事件驱动的“触发器”向 HPA 或 Job 控制器提供指标。ScaledObject 内部会生成一个 HPA 对象,而 ScaledJob 则直接管理 Job 的创建与删除。

3.2 ScaledObject:事件驱动的工作负载缩放器

ScaledObject 是 KEDA 最常用的原语,它定义了“何时缩放”与“缩放多少”的规则。其核心工作原理包含三个步骤:

  1. 指标采集: KEDA Operator 根据 ScaledObject 中定义的 triggers 配置,启动对应的 Scaler(如 Kafka Scaler、Prometheus Scaler),定期从事件源拉取指标值。
  2. 指标暴露: KEDA 将采集到的指标转换为自定义指标(Custom Metrics),并通过 Kubernetes Metrics Server 或 Prometheus Adapter 暴露给 HPA。
  3. HPA 决策: HPA 根据指标值与目标值(targetValue 或 targetAverageValue)计算期望副本数,并调整 Deployment/StatefulSet 的副本数。
容量规划提示: 在 ScaledObject 中设置 minReplicaCount 与 maxReplicaCount 时,应结合业务低谷期的基线流量与峰值流量预留 20%-30% 的缓冲容量,避免频繁的冷启动与缩容震荡。

以下是一个典型的 ScaledObject YAML 示例,用于基于 Kafka 消息积压自动缩放一个 Web 服务:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-web-consumer-scaler
  namespace: production
spec:
  scaleTargetRef:
    name: web-consumer          # 目标 Deployment 名称
    kind: Deployment
    apiVersion: apps/v1
  pollingInterval: 15           # 每 15 秒轮询一次事件源
  cooldownPeriod: 60            # 缩容冷却期 60 秒
  minReplicaCount: 2            # 最小副本数
  maxReplicaCount: 20           # 最大副本数
  triggers:
  - type: kafka
    metadata:
      topic: orders-events
      bootstrapServers: kafka-cluster:9092
      consumerGroup: web-group
      lagThreshold: "100"       # 当积压超过 100 条时触发扩容
      activationLagThreshold: "10"  # 低于 10 条时允许缩容
    authenticationRef:
      name: kafka-auth-trigger  # 引用 TriggerAuthentication

3.3 ScaledJob:事件驱动的批处理任务

ScaledJob 专为批处理场景设计,它不依赖 HPA,而是直接管理 Kubernetes Job 的创建与删除。当事件源指标超过阈值时,KEDA 会创建新的 Job 实例;当指标回落时,Job 会被清理或允许自然完成。

ScaledJob 与 ScaledObject 的关键区别在于:

对比维度 ScaledObject ScaledJob
目标资源 Deployment / StatefulSet Job
缩放机制 通过 HPA 调整副本数 直接创建/删除 Job 对象
任务生命周期 Pod 持续运行 Job 执行完成后自动退出
适用负载 长运行服务(Web API、消息消费者) 短时批处理(数据清洗、文件转换)
缩容策略 HPA 逐步减少副本 允许当前 Job 完成,不再创建新 Job
容量规划陷阱: ScaledJob 的 maxReplicaCount 应结合 Job 的资源消耗与集群剩余容量谨慎设置。如果每个 Job 处理 1GB 数据,而集群节点内存有限,过高的并发可能导致节点 OOM。建议为 ScaledJob 设置 ResourceQuota 与 LimitRange。

3.4 TriggerAuthentication:安全连接事件源

TriggerAuthentication 是 KEDA 的认证抽象层,它解耦了事件源的凭据管理与缩放策略定义。支持三种认证模式:

  • Secret 引用: 直接引用 Kubernetes Secret 中的键值对。
  • Pod Identity: 使用 Azure AD Pod Identity、AWS IAM Roles for Service Accounts 等云原生身份。
  • 环境变量: 从 ScaledObject 所在 Pod 的环境变量中读取凭据。

以下示例展示了如何为 Kafka 连接创建 TriggerAuthentication:

apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: kafka-auth-trigger
  namespace: production
spec:
  secretTargetRef:
  - parameter: sasl                      # KEDA Scaler 需要的参数名
    name: kafka-credentials              # Kubernetes Secret 名称
    key: sasl-username                   # Secret 中的键
  - parameter: tls
    name: kafka-credentials
    key: tls-cert
  - parameter: password
    name: kafka-credentials
    key: sasl-password
安全最佳实践: 避免在 ScaledObject 的 metadata 中硬编码凭据。始终使用 TriggerAuthentication 并配合 RBAC 限制其访问范围。对于跨命名空间的认证共享,优先使用 ClusterTriggerAuthentication(集群级资源)。

3.5 ClusterTriggeredScaler:集群级缩放策略管理

ClusterTriggeredScaler 是 KEDA 2.8+ 引入的集群级原语,它允许平台管理员在集群范围内定义统一的缩放策略,并跨命名空间应用到多个工作负载。其核心价值在于:

  • 策略复用: 一个 ClusterTriggeredScaler 可以匹配多个命名空间中的 Deployment/Job。
  • 集中管理: 平台团队无需为每个命名空间重复创建 ScaledObject。
  • 租户隔离: 通过 namespaceSelector 与 resourceSelector 精确控制策略生效范围。

下图展示了 ClusterTriggeredScaler 如何将统一的缩放策略分发到多个命名空间:

ClusterTriggeredScaler 跨命名空间策略分发 ClusterTriggeredScaler 统一缩放策略(Kafka lagThreshold: 100) namespaceSelector: team-a namespaceSelector: team-b namespaceSelector: team-c team-a 命名空间 Deployment: web-consumer-a Deployment: worker-a team-b 命名空间 Deployment: web-consumer-b StatefulSet: stream-processor 说明: ClusterTriggeredScaler 通过 resourceSelector 匹配目标工作负载, 无需在每个命名空间单独创建 ScaledObject,实现“一次定义,全局生效”。

3.6 四大原语的协作流程

在实际的容量规划场景中,这四个原语通常协同工作。以下是一个完整的端到端事件驱动缩放流程:

  1. 平台管理员 创建 ClusterTriggeredScaler,定义全局缩放策略(如:所有 Kafka 消费者组积压超过 200 条时扩容)。
  2. 应用开发者 在各自命名空间创建 TriggerAuthentication,提供连接 Kafka 的 SASL/SSL 凭据。
  3. ClusterTriggeredScaler 根据 namespaceSelector 匹配到目标命名空间,并自动生成对应的 ScaledObject 或 ScaledJob。
  4. KEDA Operator 持续轮询事件源指标,当积压超过阈值时,通过 HPA 或 Job 控制器触发扩容。
  5. 容量规划监控:通过 KEDA 的 Metrics API 或 Prometheus 采集 ScaledObject 的 keda_scaler_metrics_value 指标,用于后续的容量趋势分析与预算规划。
容量规划最佳实践: 在 ClusterTriggeredScaler 中设置 fallback 字段,当事件源不可达时使用预设的副本数作为降级策略。例如:fallback: { replicas: 3, failureThreshold: 5 },确保在事件源故障时服务仍能维持基本容量。