Job 与 CronJob 任务

常驻服务用 Deployment 守护;而 Job 管理"跑完就结束"的一次性任务,CronJob 在 Job 之外再加一层定时触发。数据迁移、批量计算、定时备份,都靠它们完成。

Job 的一次性语义

Job 保证任务 Pod 成功执行指定次数:Pod 以码 0 退出算一次成功,Job 即完成;失败按 backoffLimit 重试,超过上限后 Job 标记为失败。注意 Job 的 Pod 只允许 restartPolicy 为 OnFailure 或 Never(不能 Always),重启节奏由 Job 统一控制。

字段默认作用
completions1需要成功几次才算完成
parallelism1最多同时运行几个 Pod
backoffLimit6Pod 失败后的重试上限

一次性任务示例:计算圆周率

用 perl 镜像计算 pi 的前 2000 位,任务成功则 Pod 正常退出、Job 完成:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 4
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: pi
          image: perl:5.34
          command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
kubectl create job pi --image=perl:5.34 \
  -- perl -Mbignum=bpi -wle 'print bpi(2000)'    # 与上方 yaml 等价
kubectl get jobs
# NAME   COMPLETIONS   DURATION   AGE
# pi     1/1           8s         10s

查看输出用 kubectl logs pi-xxxxx;清理用 kubectl delete job pi(会连带删除其 Pod)。分片型任务只需调整 spec,例如 completions: 10、parallelism: 3 表示"10 份任务、最多 3 个并发";Pod 反复失败达到 backoffLimit 上限后 Job 转为 Failed,用 kubectl describe job 查看失败原因。

CronJob:定时执行 Job

CronJob 按 cron 表达式定时创建 Job,语法共五段:分 时 日 月 星期:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup
spec:
  schedule: "0 2 * * *"          # 每天凌晨 2 点执行
  concurrencyPolicy: Forbid      # 上次未跑完就跳过本次
  successfulJobsHistoryLimit: 3  # 保留最近 3 个成功历史
  failedJobsHistoryLimit: 1      # 保留 1 个失败历史
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: backup
              image: busybox:1.36
              command: ["sh", "-c", "echo backup ok; date"]

常用 schedule 写法对照:

表达式含义
*/5 * * * *每 5 分钟一次
0 2 * * *每天 02:00
0 3 * * 1每周一 03:00

concurrencyPolicy 三取值:Allow 允许并发(默认)、Forbid 禁止(上次未结束就跳过本次)、Replace 杀掉旧的再起新的。CronJob 每次触发都会生成一个 Job,历史 Job 会持续堆积,用 successfulJobsHistoryLimit 与 failedJobsHistoryLimit 限制保留数量。

kubectl create cronjob hello --image=busybox:1.36 \
  --schedule="*/1 * * * *" -- sh -c 'echo hello; date'    # 每分钟一次
kubectl get cronjob
# NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
# hello   */1 * * * *   False     0        32s             1m

小结:Job 保证一次性任务成功跑完指定次数,CronJob 在其外层定时触发。落地记住三点:Job 的 Pod 只能用 OnFailure/Never、失败靠 backoffLimit 兜底、CronJob 记得限制历史 Job 数量,避免只增不减。

笔记加载中…