Job 与 CronJob 任务
常驻服务用 Deployment 守护;而 Job 管理"跑完就结束"的一次性任务,CronJob 在 Job 之外再加一层定时触发。数据迁移、批量计算、定时备份,都靠它们完成。
Job 的一次性语义
Job 保证任务 Pod 成功执行指定次数:Pod 以码 0 退出算一次成功,Job 即完成;失败按 backoffLimit 重试,超过上限后 Job 标记为失败。注意 Job 的 Pod 只允许 restartPolicy 为 OnFailure 或 Never(不能 Always),重启节奏由 Job 统一控制。
| 字段 | 默认 | 作用 |
|---|---|---|
| completions | 1 | 需要成功几次才算完成 |
| parallelism | 1 | 最多同时运行几个 Pod |
| backoffLimit | 6 | Pod 失败后的重试上限 |
一次性任务示例:计算圆周率
用 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 数量,避免只增不减。