Job 与 CronJob
本教程共 65 篇 · 第 22 篇 · 更新于 2026-08-14 · 约 12 分钟阅读
本节目标:学完你能用 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 这里只能是 OnFailure 或 Never,不能是 Always(常驻才用 Always)。
NoteJob 属于
batch/v1API 组,不是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 cronjob和kubectl 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 一直 Pending 或 Failed 却没清理,历史记录越堆越多。调小 historyLimit 定期清理。
Warning别用 CronJob 跑”必须精确只跑一次”的关键任务。错过窗口或控制平面抖动时,它可能不跑或重跑。强一致需求请上专门的调度系统。
批处理讲完,还有个特殊的 Pod——不归控制平面管、直接由节点上的 kubelet 看着。第 23 章讲静态 Pod。