首页 / Kubernetes (k8s) 入门教程 / Job 与 CronJob

Kubernetes (k8s) 入门教程

Job 与 CronJob

本教程共 65 篇 · 第 22 篇 · 更新于 2026-08-14 · 约 12 分钟阅读

KubernetesJobCronJob批处理定时任务工作负载

本节目标:学完你能用 Job 跑一次性批处理、用 CronJob 跑定时任务,调好 completions/parallelism 和并发策略,并知道任务失败怎么重试。

Deployment、StatefulSet、DaemonSet 的 Pod 都是”常驻”的。但有些活是”跑完就撤”:数据备份、批量算报表、跑个测试。这类用 Job 和 CronJob。

22-1 Job:跑完就结束

Job(任务)保证一个或多个 Pod 把任务成功完成指定次数。Pod 跑完正常退出,Job 标记完成,不再重启它。

这跟 Deployment 正相反:Deployment 希望 Pod 永远在,Job 希望 Pod 早点退。

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-compute
spec:
  template:
    spec:
      containers:
      - name: calc
        image: mybatch:1.0
        command: ["python", "compute.py"]
      restartPolicy: OnFailure

注意 restartPolicy 这里只能是 OnFailureNever,不能是 Always(常驻才用 Always)。

Note

Job 属于 batch/v1 API 组,不是 apps/v1。写 YAML 时 apiVersion 别写错。

22-2 Job 的关键字段

completions:总共要成功完成几次。默认 1,即一个 Pod 跑完就算完。设为 5 就跑 5 个(或一批)直到成功 5 次。

parallelism:最多同时跑几个 Pod。默认 1。想并行加速就调大。

backoffLimit:失败最多重试几次,默认 6。超过就 Job 标记为 Failed

activeDeadlineSeconds:整个 Job 的最长存活时间,到点强杀,防止挂死。

spec:
  completions: 5
  parallelism: 2
  backoffLimit: 3
  template:
    spec:
      containers:
      - name: calc
        image: mybatch:1.0
      restartPolicy: OnFailure

上面这段:5 个任务、最多 2 个并行、失败重试 3 次。

22-3 CronJob:定时任务

CronJob 就是”带闹钟的 Job”。它按时间表周期性地创建 Job,像 Linux 的 crontab。

核心是 schedule 字段,用标准的 cron 表达式(分 时 日 月 周):

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-backup
spec:
  schedule: "0 2 * * *"     # 每天凌晨 2 点
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: mybackup:1.0
          restartPolicy: OnFailure

0 2 * * * 解读:分=0、时=2、日=每天、月=每月、周=每星期。也就是每天 2:00。

22-4 并发与宽限策略

定时任务有组专属字段,防止”上一个没跑完,下一个又来了”。

concurrencyPolicy:并发策略。Allow(默认,可重叠)、Forbid(上一个没完就不起新的)、Replace(新的一次顶掉旧的)。

startingDeadlineSeconds:如果错过计划时间(比如控制平面忙),超过这么久就不再补跑。

suspend:设为 true 暂停调度,像临时关掉闹钟,已有的 Job 不受影响。

successfulJobsHistoryLimit / failedJobsHistoryLimit:保留多少历史 Job 记录,默认成功 3、失败 1。

spec:
  schedule: "*/5 * * * *"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 60
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
Tip

调试 CronJob 时,先看它有没有生成 Job:kubectl get cronjobkubectl get jobs。没生成 Job 多半是 schedule 写错或处于 suspend。

22-5 查看与手动触发

看状态和历史:

kubectl get cronjob nightly-backup
kubectl get jobs
kubectl logs job/batch-compute

想立刻跑一次(不等新周期),用:

kubectl create job adhoc --from=cronjob/nightly-backup

--from 照着现有 CronJob 的模板生成一个一次性 Job,很适合补跑。

22-6 常见坑

一是 schedule 写错时区。Kubernetes 的 cron 默认按集群时区(一般是 UTC),不是你本地时间。跨时区排期务必算清。

二是 concurrencyPolicy 默认 Allow,慢任务叠慢任务会把节点压满。重叠风险大的设 Forbid

三是 Job 一直 PendingFailed 却没清理,历史记录越堆越多。调小 historyLimit 定期清理。

Warning

别用 CronJob 跑”必须精确只跑一次”的关键任务。错过窗口或控制平面抖动时,它可能不跑或重跑。强一致需求请上专门的调度系统。

批处理讲完,还有个特殊的 Pod——不归控制平面管、直接由节点上的 kubelet 看着。第 23 章讲静态 Pod。