4. KEDA 核心概念:ScaledObject 与 ScaledJob、事件驱动伸缩模型、Scaling 触发器种类概述
KEDA(Kubernetes Event-Driven Autoscaling)的核心价值在于将 Kubernetes 原生的 水平 Pod 自动伸缩(HPA) 从基于 CPU/内存的指标扩展为基于任意事件源的弹性伸缩。本章将深入剖析 KEDA 的两大核心抽象——ScaledObject 与 ScaledJob,并梳理其事件驱动伸缩模型与丰富的触发器生态。
4.1 事件驱动伸缩模型
KEDA 的伸缩模型遵循“事件源 → Scaler → KEDA Operator → HPA / Job”的闭环路径。与传统的周期性指标采集不同,KEDA 通过专用的 Scaler 组件直接监听外部事件源(如 Kafka 分区偏移量、RabbitMQ 队列深度、Prometheus 查询结果),将事件负载量化为期望的副本数。
4.2 ScaledObject:面向持续运行工作负载的伸缩
ScaledObject 是 KEDA 中最常用的自定义资源,用于管理 Deployment、StatefulSet 或 Custom Resource 的自动伸缩。它定义了事件源、伸缩边界和行为策略。
4.2.1 ScaledObject 核心字段
| 字段 | 类型 | 说明 |
|---|---|---|
scaleTargetRef |
Object | 指定要伸缩的工作负载(name、apiVersion、kind) |
triggers |
Array | 定义事件源类型及连接参数(如 Kafka 主题、PromQL 查询) |
minReplicaCount |
Integer | 最小副本数(默认 1,设为 0 可缩容到零) |
maxReplicaCount |
Integer | 最大副本数(默认 100) |
advanced |
Object | 包含恢复策略、冷却周期、分片等高级配置 |
4.2.2 ScaledObject 示例:基于 Kafka 偏移量的自动伸缩
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kafka-consumer-scaler
namespace: default
spec:
scaleTargetRef:
name: my-kafka-consumer
minReplicaCount: 1
maxReplicaCount: 20
triggers:
- type: kafka
metadata:
bootstrapServers: kafka-cluster:9092
consumerGroup: my-group
topic: orders
lagThreshold: "100"
offsetResetPolicy: latest
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleDown:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 50
periodSeconds: 30
4.3 ScaledJob:面向批处理任务的弹性伸缩
ScaledJob 专为 批处理 和 队列驱动型任务 设计。与 ScaledObject 管理长期运行的 Pod 不同,ScaledJob 根据事件源负载动态创建 Kubernetes Job 实例,每个 Job 处理一个工作单元后自动退出。
4.3.1 ScaledJob 与 ScaledObject 对比
| 维度 | ScaledObject | ScaledJob |
|---|---|---|
| 目标资源 | Deployment / StatefulSet | Job |
| Pod 生命周期 | 持续运行 | 任务完成后自动终止 |
| 适用场景 | Web 服务、流处理、API 网关 | 数据清洗、图片转码、消息批处理 |
| 缩容到零 | 支持(minReplicaCount: 0) | 天然支持(无事件时创建 0 个 Job) |
| 伸缩单位 | 副本数(Pod 数量) | 并行 Job 数量 |
4.3.2 ScaledJob 示例:基于 RabbitMQ 队列的任务分发
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: rabbitmq-job-scaler
namespace: default
spec:
jobTargetRef:
template:
spec:
containers:
- name: worker
image: my-worker:latest
command: ["process-message"]
restartPolicy: Never
triggers:
- type: rabbitmq
metadata:
host: amqp://guest:guest@rabbitmq:5672
queueName: task-queue
queueLength: "10"
scalingStrategy:
strategy: "default"
maxScale: 50
jobTargetRef 使用 Job 规范模板,而非直接引用已有资源。每个触发周期内,KEDA 会根据队列长度计算需要创建的 Job 数量,确保每个 Job 处理一个消息单元。
4.4 Scaling 触发器种类概述
KEDA 提供了超过 50 种内置 Scaler(触发器),覆盖主流消息队列、数据库、监控系统和云服务。根据数据源类型可分为以下六大类:
| 类别 | 代表触发器 | 典型指标 |
|---|---|---|
| 消息队列 | Kafka、RabbitMQ、AWS SQS、Azure Queue、Redis Streams | 队列深度、消费者滞后、消息延迟 |
| 数据库 | PostgreSQL、MySQL、MongoDB、Cassandra | 查询结果行数、连接数、写操作速率 |
| 监控与可观测性 | Prometheus、Datadog、New Relic、Azure Monitor | 自定义 PromQL 查询结果、请求延迟 P99 |
| HTTP / API | HTTP、Cron、Metrics API | 请求速率、定时表达式、外部 API 返回值 |
| 云服务 | AWS CloudWatch、Azure Event Hubs、GCP Pub/Sub | 云资源使用率、事件流速率 |
| 自定义 / 扩展 | External Scaler、gRPC、Shell | 通过 gRPC 协议对接任意自定义指标源 |
4.5 触发器元数据与认证机制
每个触发器通过 metadata 字段传递连接参数和伸缩阈值。对于需要敏感信息的触发器(如数据库密码、云服务密钥),KEDA 支持通过 TriggerAuthentication 或 ClusterTriggerAuthentication 资源进行安全引用。
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: kafka-auth
namespace: default
spec:
secretTargetRef:
- parameter: saslPassword
name: kafka-secret
key: password
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: secure-scaler
spec:
scaleTargetRef:
name: my-app
triggers:
- type: kafka
metadata:
bootstrapServers: kafka-cluster:9092
topic: secure-topic
lagThreshold: "50"
authenticationRef:
name: kafka-auth
TriggerAuthentication 引用。避免在 ScaledObject 的 metadata 中直接暴露明文凭证。
4.6 多触发器组合与伸缩策略
一个 ScaledObject 可以同时配置 多个触发器,KEDA 会取所有触发器中计算出的最大期望副本数作为最终值。这种模式适用于需要同时监听多个事件源的复杂场景。
spec:
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
query: sum(rate(http_requests_total[1m]))
threshold: "100"
- type: kafka
metadata:
bootstrapServers: kafka-cluster:9092
topic: orders
lagThreshold: "200"
当 Prometheus 查询结果和 Kafka 滞后指标同时生效时,KEDA 会选择两者中要求更高副本数的那个,确保系统能够应对最极端的负载情况。
advanced.horizontalPodAutoscalerConfig.behavior 可以精细控制扩缩容的速率、稳定窗口和策略类型(Percent 或 Pod 数量),避免因指标抖动导致频繁伸缩。