3. ScaledJob 基础:与 ScaledObject 的差异及核心配置
在 KEDA 的触发体系中,ScaledJob 与 ScaledObject 是两种截然不同的工作负载扩展模式。ScaledObject 面向长期运行的 Service/Deployment,而 ScaledJob 专为批处理、一次性任务设计。理解两者的差异是正确配置事件驱动 Job 的前提。
3.1 ScaledJob 与 ScaledObject 的核心区别
| 对比维度 | ScaledObject | ScaledJob |
|---|---|---|
| 目标资源 | Deployment、StatefulSet、Custom Resource | Job(Kubernetes Job) |
| 运行模式 | 长期运行(Long-Running),Pod 持续提供服务 | 批处理(Batch),Pod 完成任务后自动退出 |
| 扩缩行为 | 动态调整副本数(replicas),支持缩容到 0 | 根据事件创建新的 Job 实例,每个 Job 独立运行 |
| 事件源关联 | 事件源消息驱动副本数变化 | 事件源消息驱动 Job 创建,一条消息通常对应一个 Job |
| 生命周期 | Pod 持续运行,由 Readiness/Liveness 探针管理 | Job 执行完成后自动清理,由 TTL 控制器管理 |
| 适用场景 | Web 服务、API 网关、消息消费者 | 数据批处理、视频转码、ETL 任务、镜像构建 |
选型建议:如果工作负载需要持续监听端口或保持长连接,使用 ScaledObject;如果工作负载是“执行一次即结束”的任务型负载,使用 ScaledJob。混用两者会导致资源浪费或任务丢失。
3.2 Job 触发模式:事件源如何驱动 Job 创建
ScaledJob 的触发模式遵循“事件源 → ScaledJob → Job 创建”的链路。KEDA 控制器监听事件源(如 Kafka、RabbitMQ、AWS SQS)的消息积压情况,当消息数量超过阈值时,自动创建 Kubernetes Job 来处理这些消息。
3.3 scalingStrategy 配置:控制 Job 的创建速率
scalingStrategy 是 ScaledJob 特有的参数,用于控制当事件源消息积压时,KEDA 以何种策略创建 Job。默认策略是 default,即每个消息创建一个 Job;但在高吞吐场景下,需要调整策略以避免 Job 创建风暴。
| 策略名称 | 描述 | 适用场景 |
|---|---|---|
| default | 每个待处理消息创建一个 Job,消息与 Job 一一对应 | 消息量小、每个 Job 处理时间短 |
| custom | 通过自定义公式控制 Job 创建数量,支持 multiple 和 cooldown 参数 |
需要精细控制并发度,避免资源过载 |
| accurate | 根据消息积压量精确计算 Job 数量,避免创建过多空闲 Job | 消息量波动大、需要精确匹配处理能力 |
| eager | 尽可能快地创建 Job,直到达到 maxReplicaCount 上限 |
紧急任务、需要快速消费积压消息 |
配置示例:使用
custom 策略限制每秒最多创建 5 个 Job,避免数据库连接池被打满。
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: batch-processor
spec:
jobTargetRef:
template:
spec:
containers:
- name: worker
image: myrepo/batch-worker:latest
restartPolicy: Never
triggers:
- type: kafka
metadata:
topic: events
bootstrapServers: kafka-cluster:9092
consumerGroup: batch-group
lagThreshold: "10"
scalingStrategy:
strategy: custom
customScalingQueueLengthDeduction: "1"
customScalingMetricSpec: "5" # 每秒最多创建 5 个 Job
customScalingCooldownPeriod: "30" # 冷却期 30 秒
maxReplicaCount: 20
3.4 rollingUpdate 与 executionTimeout:Job 的生命周期控制
ScaledJob 提供了两个关键参数来控制 Job 的更新策略和执行超时,确保批处理任务在异常情况下不会无限期占用资源。
3.4.1 rollingUpdate
rollingUpdate 控制当 ScaledJob 配置更新时,如何处理正在运行的 Job。与 Deployment 的滚动更新不同,ScaledJob 的滚动更新只影响新创建的 Job,不会中断正在执行的 Job。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
maxUnavailable |
int/百分比 | 25% | 更新期间允许的最大不可用 Job 数量(按 Job 总数计算) |
maxSurge |
int/百分比 | 25% | 更新期间允许超过期望数量的最大 Job 数量 |
注意:ScaledJob 的 rollingUpdate 仅影响 Job 模板的更新。如果事件源持续产生消息,旧模板的 Job 仍会继续创建,直到事件源消费完毕或手动终止。
3.4.2 executionTimeout
executionTimeout 是 ScaledJob 的全局超时控制,用于限制单个 Job 的最大执行时间。如果 Job 在超时时间内未完成,KEDA 会强制终止该 Job 并标记为失败。
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: timeout-controlled-job
spec:
jobTargetRef:
template:
spec:
containers:
- name: worker
image: myrepo/worker:latest
command: ["/bin/sh", "-c", "process_data.sh"]
restartPolicy: Never
backoffLimit: 3
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.region.amazonaws.com/123456789/myqueue
queueLength: "5"
executionTimeout: 300 # 单个 Job 最长执行 300 秒
maxReplicaCount: 10
3.5 最佳实践与常见陷阱
- 避免 Job 创建风暴:在消息积压量较大时,使用
custom策略配合customScalingMetricSpec限制每秒 Job 创建数,防止 API Server 过载。 - 合理设置 executionTimeout:根据业务处理时间的 P99 值设置超时,通常为平均处理时间的 3-5 倍。过短会导致正常任务被误杀,过长则浪费资源。
- 监控 Job 完成状态:ScaledJob 不会自动重试失败的 Job,需要依赖 Kubernetes Job 的
backoffLimit机制。建议将backoffLimit设置为 2-3 次。 - 资源配额规划:ScaledJob 的
maxReplicaCount应与集群资源配额匹配,避免创建过多 Job 导致节点资源耗尽。
生产建议:在部署 ScaledJob 前,先使用 ScaledObject 测试事件源连接和消息消费逻辑,确认无误后再切换到 ScaledJob 模式。这样可以减少 Job 创建失败带来的调试成本。