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 缩放规则 |
3.2 ScaledObject:事件驱动的工作负载缩放器
ScaledObject 是 KEDA 最常用的原语,它定义了“何时缩放”与“缩放多少”的规则。其核心工作原理包含三个步骤:
- 指标采集: KEDA Operator 根据 ScaledObject 中定义的
triggers配置,启动对应的 Scaler(如 Kafka Scaler、Prometheus Scaler),定期从事件源拉取指标值。 - 指标暴露: KEDA 将采集到的指标转换为自定义指标(Custom Metrics),并通过 Kubernetes Metrics Server 或 Prometheus Adapter 暴露给 HPA。
- HPA 决策: HPA 根据指标值与目标值(
targetValue或targetAverageValue)计算期望副本数,并调整 Deployment/StatefulSet 的副本数。
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 |
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
metadata 中硬编码凭据。始终使用 TriggerAuthentication 并配合 RBAC 限制其访问范围。对于跨命名空间的认证共享,优先使用 ClusterTriggerAuthentication(集群级资源)。
3.5 ClusterTriggeredScaler:集群级缩放策略管理
ClusterTriggeredScaler 是 KEDA 2.8+ 引入的集群级原语,它允许平台管理员在集群范围内定义统一的缩放策略,并跨命名空间应用到多个工作负载。其核心价值在于:
- 策略复用: 一个 ClusterTriggeredScaler 可以匹配多个命名空间中的 Deployment/Job。
- 集中管理: 平台团队无需为每个命名空间重复创建 ScaledObject。
- 租户隔离: 通过
namespaceSelector与resourceSelector精确控制策略生效范围。
下图展示了 ClusterTriggeredScaler 如何将统一的缩放策略分发到多个命名空间:
3.6 四大原语的协作流程
在实际的容量规划场景中,这四个原语通常协同工作。以下是一个完整的端到端事件驱动缩放流程:
- 平台管理员 创建 ClusterTriggeredScaler,定义全局缩放策略(如:所有 Kafka 消费者组积压超过 200 条时扩容)。
- 应用开发者 在各自命名空间创建 TriggerAuthentication,提供连接 Kafka 的 SASL/SSL 凭据。
- ClusterTriggeredScaler 根据
namespaceSelector匹配到目标命名空间,并自动生成对应的 ScaledObject 或 ScaledJob。 - KEDA Operator 持续轮询事件源指标,当积压超过阈值时,通过 HPA 或 Job 控制器触发扩容。
- 容量规划监控:通过 KEDA 的 Metrics API 或 Prometheus 采集 ScaledObject 的
keda_scaler_metrics_value指标,用于后续的容量趋势分析与预算规划。
fallback 字段,当事件源不可达时使用预设的副本数作为降级策略。例如:fallback: { replicas: 3, failureThreshold: 5 },确保在事件源故障时服务仍能维持基本容量。