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 来处理这些消息。

ScaledJob 事件驱动触发流程 事件源 Kafka / RabbitMQ / SQS ScaledJob KEDA 控制器 Kubernetes Job Pod 执行任务 消息积压 阈值触发 创建 Job 每个消息/批次 任务完成 自动退出 触发模式:ScaledJob 不修改副本数,而是根据事件源消息量动态创建/销毁 Job 实例。 每个 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
ScaledJob 生命周期控制:rollingUpdate 与 executionTimeout ScaledJob 配置更新 修改 Job 模板 rollingUpdate maxUnavailable: 25% maxSurge: 25% executionTimeout 超时时间: 300s 强制终止 Job 生命周期控制要点: • rollingUpdate 只影响新创建的 Job,不中断正在运行的 Job。 • executionTimeout 是硬限制,超时后 KEDA 强制终止 Job,避免僵尸 Job 占用资源。 • 建议同时配置 backoffLimit(重试次数)与 executionTimeout,形成双重保护。

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 创建失败带来的调试成本。