4. ScaledJob 基础:YAML 结构、触发器配置与并行控制
ScaledJob 是 KEDA 中专门用于管理 批处理任务 的核心 CRD。与 ScaledObject 持续运行 Pod 不同,ScaledJob 根据事件源驱动创建 Kubernetes Job 对象,每个 Job 执行一次后即完成。本章将深入解析 ScaledJob 的 YAML 结构、触发器配置、失败重试策略以及并行度控制机制。
4.1 ScaledJob YAML 结构解析
一个完整的 ScaledJob 定义包含四个核心部分:jobTargetRef(Job 模板)、triggers(事件源)、scalingStrategy(扩缩策略)和 failedJobsHistoryLimit(历史记录)。以下是一个基于 RabbitMQ 队列深度的典型示例:
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: rabbitmq-consumer-sj
namespace: default
spec:
# 1. Job 模板 —— 定义要运行的批处理任务
jobTargetRef:
template:
spec:
containers:
- name: consumer
image: myregistry/consumer:1.2
command: ["python", "consume.py"]
env:
- name: QUEUE_NAME
value: "orders"
restartPolicy: Never
backoffLimit: 3 # 失败重试次数
ttlSecondsAfterFinished: 600 # Job 完成后保留 10 分钟
# 2. 事件源触发器
triggers:
- type: rabbitmq
metadata:
queueName: orders
queueLength: "10" # 触发阈值:队列长度 >= 10
host: amqp://guest:password@rabbitmq-svc:5672
# 3. 扩缩策略
scalingStrategy:
strategy: "default" # 可选:default / custom / accurate
multipleScalersCalculation: "max" # 多触发器时取最大值
# 4. 历史记录与清理
failedJobsHistoryLimit: 5
successfulJobsHistoryLimit: 5
关键区别: ScaledJob 的
jobTargetRef 直接嵌入 Job 的 spec 字段,而非引用外部 Job 对象。这意味着 KEDA 会动态生成 Job 实例,每个 Job 独立运行,互不干扰。
4.2 Job 触发器配置
ScaledJob 支持所有 KEDA 事件源,但触发行为与 ScaledObject 不同:ScaledJob 不维持 Pod 数量,而是根据事件源指标创建 Job 实例。常用触发器配置如下:
| 触发器类型 | 典型指标 | 触发行为 | 适用场景 |
|---|---|---|---|
| RabbitMQ | 队列深度 | 队列长度 ≥ 阈值时创建 Job | 消息批处理 |
| Kafka | 消费者滞后 | 滞后分区数 ≥ 阈值时创建 Job | 流式数据批处理 |
| Prometheus | 自定义指标 | 指标值 ≥ 阈值时创建 Job | 业务指标驱动 |
| Cron | 时间表达式 | 按计划时间创建 Job | 定时批处理 |
| AWS SQS | 队列消息数 | 消息数 ≥ 阈值时创建 Job | 云原生批处理 |
配置要点: 触发器中的
queueLength、lagThreshold 等参数控制 创建 Job 的敏感度。值越小,Job 创建越频繁;值越大,批处理粒度越粗。建议根据任务处理耗时和资源成本进行调优。
4.3 Job 失败重试策略
ScaledJob 的失败重试策略由 jobTargetRef 中的 backoffLimit 和 activeDeadlineSeconds 控制,同时 KEDA 提供 failedJobsHistoryLimit 管理历史记录。
4.3.1 重试机制层级
- Pod 级别重试: 由 Job 的
backoffLimit控制,默认 6 次。Pod 失败后,Job 控制器重新创建 Pod,直到达到限制或成功。 - Job 级别重试: ScaledJob 不直接重试失败的 Job,而是通过
failedJobsHistoryLimit保留失败记录,供运维排查。 - 全局超时:
activeDeadlineSeconds设置 Job 最大运行时间,超时后强制终止。
# 重试策略配置示例
jobTargetRef:
template:
spec:
containers:
- name: batch-worker
image: batch-worker:latest
command: ["/bin/sh", "-c", "process_data.sh"]
restartPolicy: Never
backoffLimit: 3 # 最多重试 3 次
activeDeadlineSeconds: 300 # 5 分钟超时
ttlSecondsAfterFinished: 120 # 完成后保留 2 分钟
注意:
restartPolicy 必须设置为 Never 或 OnFailure。如果设置为 Always,Job 控制器会无限重启 Pod,导致 ScaledJob 无法正确判断 Job 完成状态。
4.4 Job 并行度控制
ScaledJob 的并行度控制通过 scalingStrategy 和 maxParallelism 实现,决定 同时运行多少个 Job 实例。
4.4.1 并行度参数
| 参数 | 位置 | 说明 | 默认值 |
|---|---|---|---|
maxParallelism |
spec |
最大并行 Job 数,防止资源耗尽 | 100 |
scalingStrategy.strategy |
spec |
扩缩策略:default / custom / accurate | default |
scalingStrategy.multipleScalersCalculation |
spec |
多触发器时计算方式:max / min / avg | max |
pollingInterval |
spec |
轮询事件源间隔(秒) | 30 |
4.4.2 三种扩缩策略对比
- default: 根据触发器指标值直接计算 Job 数量。例如队列深度 50,阈值 10,则创建 5 个 Job。
- custom: 使用自定义公式计算 Job 数量,需配合
customScalingQueueLengthDeduction等参数。 - accurate: 精确匹配指标值,每个指标单位对应一个 Job,适合严格资源隔离场景。
# 并行度控制完整示例
spec:
maxParallelism: 10 # 最多同时运行 10 个 Job
pollingInterval: 15 # 每 15 秒检查一次队列
scalingStrategy:
strategy: "default"
multipleScalersCalculation: "max"
triggers:
- type: rabbitmq
metadata:
queueName: orders
queueLength: "5" # 每 5 条消息创建一个 Job
host: amqp://...:5672
最佳实践: 设置
maxParallelism 时,建议结合集群资源配额和 Job 平均处理时间。例如,每个 Job 处理 100 条消息耗时 30 秒,队列峰值 1000 条,则 maxParallelism 设为 10 可在 30 秒内完成全部处理,同时避免资源争抢。
4.5 ScaledJob 生命周期与状态流转
以下 SVG 图展示了 ScaledJob 从事件触发到 Job 完成的完整生命周期:
4.6 实战配置清单
配置 ScaledJob 时,请按以下清单逐项确认:
- Job 模板完整性: 确认
containers镜像、命令、环境变量正确;restartPolicy为Never或OnFailure。 - 触发器阈值: 根据任务处理能力设置合理的触发阈值,避免频繁创建或资源浪费。
- 重试策略:
backoffLimit建议 3-5 次;activeDeadlineSeconds根据任务最长耗时设置。 - 并行度上限:
maxParallelism结合集群资源设置,防止突发流量打满集群。 - 历史记录清理:
failedJobsHistoryLimit和successfulJobsHistoryLimit建议 5-10,避免 etcd 存储膨胀。 - 轮询间隔:
pollingInterval默认 30 秒,对延迟敏感场景可调至 5-10 秒。
总结: ScaledJob 通过
jobTargetRef 定义任务模板,triggers 驱动创建,scalingStrategy 控制并行度,backoffLimit 管理重试。合理配置这四个维度,即可构建弹性、可靠的批处理系统。