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