核心概念:ScaledObject、ScaledJob、TriggerAuthentication 的定义与作用

在 KEDA 的弹性伸缩架构中,ScaledObject、ScaledJob 和 TriggerAuthentication 是三个最核心的自定义资源(CRD)。它们分别负责定义“伸缩什么”、“如何伸缩”以及“如何安全地获取指标”。理解这三个概念是掌握 KEDA 控制面设计的基础。

1. ScaledObject:工作负载的弹性伸缩定义

ScaledObject 是 KEDA 中最常用的 CRD,用于定义如何基于外部指标自动伸缩 Deployment、StatefulSet 或 Custom Resource 类型的无状态工作负载。它告诉 KEDA 控制器:监听哪个指标、目标值是多少、最小/最大副本数是多少。

核心作用:将外部指标(如 RabbitMQ 队列深度、Prometheus 查询结果、HTTP 请求速率)映射到 Kubernetes 工作负载的副本数调整。

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
设计要点:ScaledObject 不直接修改 HPA,而是由 KEDA 控制器根据 ScaledObject 的定义动态创建和管理 HPA 对象。这使得 KEDA 可以支持 HPA 原生不支持的指标源。

2. ScaledJob:批处理任务的弹性伸缩定义

ScaledJob 是专门为 Job 类型工作负载设计的 CRD。与 ScaledObject 不同,ScaledJob 不调整运行中的副本数,而是根据指标动态创建新的 Job 实例来处理积压的任务。每个 Job 运行完成后自动退出,非常适合消息队列消费、批量数据处理等场景。

核心作用:根据外部指标(如 Kafka 分区偏移量、AWS SQS 消息数)动态创建 Kubernetes 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
避坑提示:ScaledJob 的 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 控制器执行实际的伸缩动作。

KEDA 核心 CRD 关系架构图 ScaledObject 无状态工作负载伸缩 ScaledJob 批处理任务弹性伸缩 TriggerAuthentication 安全凭证管理 KEDA 控制器(Operator) 监听 CRD → 创建/管理 HPA 或 Job HPA(水平 Pod 自动伸缩) 调整 Deployment 副本数 Job 控制器 创建/管理 Job 实例 说明:TriggerAuthentication 为 ScaledObject/ScaledJob 提供安全凭证,三者通过 KEDA 控制器协同工作 ScaledObject → HPA → Deployment 副本调整 | ScaledJob → Job 控制器 → 按需创建 Job

5. 设计决策对比总结

决策点 推荐方案 理由
无状态服务伸缩 ScaledObject + Deployment 持续运行,副本数动态调整,适合 Web/API 服务
批处理任务伸缩 ScaledJob 按需创建 Job,任务完成后自动释放资源
凭证管理 TriggerAuthentication + Secret 避免硬编码,支持多环境切换和审计
跨命名空间凭证共享 ClusterTriggerAuthentication 集群级别资源,一次配置全局可用
云厂商身份认证 PodIdentity 模式 无需管理静态凭证,安全性更高
架构设计建议:在控制面弹性伸缩架构中,建议将 ScaledObject/ScaledJob 与 TriggerAuthentication 分离管理。ScaledObject 关注业务伸缩策略,TriggerAuthentication 关注安全合规,两者通过 authenticationRef 松耦合。这样当凭证轮换或环境迁移时,只需更新 TriggerAuthentication 而无需修改伸缩策略。