2. KEDA 核心概念:ScaledObject、ScaledJob、Trigger、Authentication、HPA 关系
KEDA 的核心在于将 Kubernetes 原生的 HPA(Horizontal Pod Autoscaler) 与外部事件源解耦,通过自定义资源对象实现事件驱动的动态扩缩。本章深入剖析五大核心概念:ScaledObject、ScaledJob、Trigger、ClusterTriggerAuthentication/TriggerAuthentication,以及它们与 HPA 的协作关系。
2.1 核心概念总览
KEDA 通过以下 CRD(Custom Resource Definition)扩展 Kubernetes API:
| 概念 | 资源类型 | 核心职责 | 适用场景 |
|---|---|---|---|
| ScaledObject | CRD | 定义 Deployment/StatefulSet 的扩缩规则,自动创建 HPA | 无状态服务、API 网关、Web 应用 |
| ScaledJob | CRD | 定义 Job 的触发规则,事件到来时创建 Job 实例 | 批处理任务、消息队列消费、CI/CD 构建 |
| Trigger | ScaledObject/ScaledJob 内嵌字段 | 指定事件源类型(如 Kafka、Prometheus、RabbitMQ)及连接参数 | 所有事件驱动场景 |
| TriggerAuthentication | CRD(命名空间级) | 存储 Trigger 所需的认证凭据(密钥、、证书) | 跨命名空间安全访问事件源 |
| ClusterTriggerAuthentication | CRD(集群级) | 全局共享的认证配置,可被所有命名空间引用 | 企业级统一认证管理 |
| HPA(Horizontal Pod Autoscaler) | K8s 内置资源 | 根据 CPU/内存/自定义指标调整 Pod 副本数 | KEDA 自动创建并管理,用户无需直接操作 |
关键理解: ScaledObject 是 KEDA 的“大脑”,它监听 Trigger 指标,然后自动创建或更新 HPA 对象,HPA 再驱动 Deployment 扩缩。ScaledJob 则直接创建 Kubernetes Job,不经过 HPA。
2.2 ScaledObject 与 HPA 的协作机制
ScaledObject 是 KEDA 最常用的资源。当用户创建 ScaledObject 时,KEDA Operator 会执行以下步骤:
- 解析 ScaledObject:读取
scaleTargetRef(目标 Deployment/StatefulSet)、triggers(事件源列表)、minReplicaCount/maxReplicaCount。 - 创建/更新 HPA:KEDA 自动生成一个 HPA 对象,其指标源指向 KEDA 的 Metrics Server(
keda-metrics-apiserver)。 - 指标采集:KEDA Metrics Server 根据 Trigger 配置,从外部事件源(如 Kafka 分区偏移量、Prometheus 查询结果)拉取实时指标。
- HPA 决策:HPA 定期(默认 15 秒)查询 Metrics Server 获取指标值,计算期望副本数,并更新 Deployment 的
replicas字段。 - 扩缩执行:Deployment Controller 根据
replicas调整 Pod 数量。
2.3 ScaledJob:事件驱动的批处理任务
与 ScaledObject 不同,ScaledJob 不依赖 HPA,而是直接管理 Kubernetes Job 的生命周期。当 Trigger 指标超过阈值时,KEDA 会创建新的 Job 实例来处理事件。
CI/CD 构建场景: 当 Git 仓库有新的 Push 事件时,KEDA 通过 ScaledJob 触发一个构建 Job。每个 Push 对应一个独立的 Job Pod,构建完成后自动退出,资源自动释放。
ScaledJob 的关键参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
jobTargetRef |
定义 Job 模板(与 Kubernetes JobSpec 一致) | template.spec.containers |
maxReplicaCount |
最大并发 Job 数量 | 10 |
scalingStrategy |
扩缩策略(default、custom、accurate) | accurate |
pollingInterval |
轮询事件源的间隔(秒) | 30 |
cooldownPeriod |
无事件后等待多久停止创建新 Job(秒) | 60 |
2.4 Trigger:连接事件源的桥梁
Trigger 是 ScaledObject 和 ScaledJob 的核心配置段,定义了从何处获取指标以及如何连接。KEDA 支持 50+ 种 Trigger 类型,常见的有:
| Trigger 类型 | 适用事件源 | 典型指标 | CI/CD 场景 |
|---|---|---|---|
kafka |
Apache Kafka / Redpanda | 消费者滞后(lag) | 构建任务队列 |
prometheus |
Prometheus / Thanos | 自定义查询结果 | 构建集群负载 |
rabbitmq |
RabbitMQ | 队列消息数 | 构建请求队列 |
azure-queue |
Azure Storage Queue | 队列长度 | 云原生 CI/CD |
github-runner |
GitHub Actions | 等待运行的 Job 数 | GitHub Actions 自托管 Runner |
注意: Trigger 中的
metadata 字段是类型相关的。例如 Kafka Trigger 需要 bootstrapServers、topic、consumerGroup;Prometheus Trigger 需要 serverAddress、query。错误的 metadata 会导致 ScaledObject 无法正常工作。
2.5 Authentication:安全访问事件源
大多数事件源需要认证(如 Kafka SASL/SSL、Prometheus Basic Auth、RabbitMQ 用户名密码)。KEDA 提供两种认证资源:
- TriggerAuthentication(命名空间级):只能被同一命名空间的 ScaledObject/ScaledJob 引用。
- ClusterTriggerAuthentication(集群级):可被所有命名空间引用,适合企业统一管理。
认证信息通常存储在 Kubernetes Secret 中,TriggerAuthentication 通过 spec.secretTargetRef 引用 Secret 的键值对。
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: kafka-auth
namespace: ci-cd
spec:
secretTargetRef:
- parameter: sasl
name: kafka-secret # 引用 Secret 名称
key: sasl-username # Secret 中的键
- parameter: saslPassword
name: kafka-secret
key: sasl-password
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: build-scaler
namespace: ci-cd
spec:
scaleTargetRef:
name: build-worker
triggers:
- type: kafka
metadata:
bootstrapServers: kafka-cluster:9092
topic: build-requests
consumerGroup: keda-build-group
authenticationRef:
name: kafka-auth # 引用 TriggerAuthentication
2.6 核心关系总结
五大概念的关系可以概括为:
- ScaledObject 和 ScaledJob 是 KEDA 的“入口资源”,用户通过它们声明扩缩规则。
- Trigger 是“感知层”,负责从外部事件源采集指标。
- Authentication 是“安全层”,为 Trigger 提供访问事件源的凭证。
- HPA 是“执行层”(仅 ScaledObject 场景),KEDA 自动创建并管理 HPA,用户无需直接操作。
最佳实践: 在 CI/CD 流水线场景中,推荐使用 ScaledJob 处理构建任务,因为每个构建是独立的批处理作业,完成后自动释放资源。对于构建结果的服务(如部署后的 Web 应用),使用 ScaledObject 根据请求量动态调整服务副本数。