核心概念:ScaledObject、ScaledJob、TriggerAuthentication 的定义与作用
在 KEDA 的弹性伸缩架构中,ScaledObject、ScaledJob 和 TriggerAuthentication 是三个最核心的自定义资源(CRD)。它们分别负责定义“伸缩什么”、“如何伸缩”以及“如何安全地获取指标”。理解这三个概念是掌握 KEDA 控制面设计的基础。
1. ScaledObject:工作负载的弹性伸缩定义
ScaledObject 是 KEDA 中最常用的 CRD,用于定义如何基于外部指标自动伸缩 Deployment、StatefulSet 或 Custom Resource 类型的无状态工作负载。它告诉 KEDA 控制器:监听哪个指标、目标值是多少、最小/最大副本数是多少。
ScaledObject 关键字段
| 字段 | 说明 | 示例值 |
|---|---|---|
scaleTargetRef.name |
目标工作负载的名称 | my-app |
scaleTargetRef.kind |
目标工作负载的类型 | Deployment |
minReplicaCount |
最小副本数(默认 1) | 2 |
maxReplicaCount |
最大副本数(默认 100) | 20 |
triggers |
指标触发器列表,定义数据源和阈值 | 见下方代码示例 |
authenticationRef |
引用 TriggerAuthentication 或 ClusterTriggerAuthentication | my-auth |
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
namespace: default
spec:
scaleTargetRef:
name: my-app
kind: Deployment
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
queueName: orders
queueLength: "10"
host: amqp://guest:guest@rabbitmq.default.svc:5672
authenticationRef:
name: rabbitmq-auth
2. ScaledJob:批处理任务的弹性伸缩定义
ScaledJob 是专门为 Job 类型工作负载设计的 CRD。与 ScaledObject 不同,ScaledJob 不调整运行中的副本数,而是根据指标动态创建新的 Job 实例来处理积压的任务。每个 Job 运行完成后自动退出,非常适合消息队列消费、批量数据处理等场景。
ScaledJob 与 ScaledObject 的关键区别
| 维度 | ScaledObject | ScaledJob |
|---|---|---|
| 目标工作负载 | Deployment / StatefulSet / Custom Resource | Job |
| 伸缩行为 | 调整运行中副本数 | 创建新的 Job 实例 |
| 生命周期 | 持续运行 | 运行完成后自动终止 |
| 适用场景 | Web 服务、API 网关、微服务 | 消息消费、数据批处理、ETL 任务 |
| 失败处理 | 由 Deployment 控制器负责 | 支持 Job 重试策略和并行度控制 |
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: kafka-consumer-job
namespace: default
spec:
jobTargetRef:
template:
spec:
containers:
- name: consumer
image: my-consumer:latest
command: ["python", "consume.py"]
restartPolicy: Never
triggers:
- type: kafka
metadata:
topic: orders
bootstrapServers: kafka-cluster:9092
consumerGroup: keda-consumer
lagThreshold: "100"
maxReplicaCount: 20
pollingInterval: 10
maxReplicaCount 控制的是同时运行的 Job 数量上限,而非总创建数。如果指标持续高水位,KEDA 会持续创建新 Job,直到达到上限。务必设置合理的 maxReplicaCount 防止资源耗尽。
3. TriggerAuthentication:安全凭证的抽象管理
TriggerAuthentication 用于安全地存储和传递访问外部指标源所需的凭证信息。它支持从 Kubernetes Secret、环境变量、Pod 身份(如 AWS IAM、Azure AD)等多种来源获取敏感数据,避免在 ScaledObject/ScaledJob 中硬编码密码或 。
TriggerAuthentication 支持的凭证来源
- SecretTargetRef:引用 Kubernetes Secret 中的键值对
- EnvTargetRef:从 Pod 环境变量中读取
- PodIdentity:使用云厂商的 Pod 身份(如 AWS IRSA、Azure Workload Identity)
- VaultTargetRef:从 HashiCorp Vault 中动态获取
- AzureKeyVaultTargetRef:从 Azure Key Vault 中获取
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: rabbitmq-auth
namespace: default
spec:
secretTargetRef:
- parameter: host
name: rabbitmq-secret
key: connection-string
---
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-secret
namespace: default
type: Opaque
data:
connection-string: YW1xcDovL2d1ZXN0Omd1ZXN0QHJhYmJpdG1xLmRlZmF1bHQuc3ZjOjU2NzI=
ClusterTriggerAuthentication(集群级别资源)。对于不同环境(开发/生产)使用不同的 TriggerAuthentication,通过 authenticationRef 灵活切换。
4. 三者关系与架构设计
ScaledObject、ScaledJob 和 TriggerAuthentication 共同构成了 KEDA 弹性伸缩的“铁三角”。ScaledObject/ScaledJob 定义“伸缩什么”和“何时伸缩”,TriggerAuthentication 提供“如何安全访问指标源”。KEDA 控制器通过监听这些 CRD 的变化,驱动 HPA 或 Job 控制器执行实际的伸缩动作。
5. 设计决策对比总结
| 决策点 | 推荐方案 | 理由 |
|---|---|---|
| 无状态服务伸缩 | ScaledObject + Deployment | 持续运行,副本数动态调整,适合 Web/API 服务 |
| 批处理任务伸缩 | ScaledJob | 按需创建 Job,任务完成后自动释放资源 |
| 凭证管理 | TriggerAuthentication + Secret | 避免硬编码,支持多环境切换和审计 |
| 跨命名空间凭证共享 | ClusterTriggerAuthentication | 集群级别资源,一次配置全局可用 |
| 云厂商身份认证 | PodIdentity 模式 | 无需管理静态凭证,安全性更高 |
authenticationRef 松耦合。这样当凭证轮换或环境迁移时,只需更新 TriggerAuthentication 而无需修改伸缩策略。