Kubernetes Job 和 CronJob 使用介绍
Job 和 CronJob 控制器与 Deployment、Daemonset 都是同级的控制器。
Job 和 CronJob 都是用来执行一次性任务的,区别在于 Job 是一次性的,而 CronJob 是周期性的。
Job 使用介绍
具体来说,Job 控制器可以执行 3 种类型的任务。
一次性任务:启动一个 Pod(除非启动失败)。一旦 Pod 成功终止,Job 就算完成了。
串行式任务:连续、多次地执行某个任务,上一个任务完成后,立即执行下个任务,直到全部执行完。
并行式任务:可以通过 spec.completions 属性指定执行次数。
apiVersion: batch/v1
kind: Job
metadata:
name: pods-job
spec:
# completions: 3 # 启用它表示串行执行3次
# parallelism: 3 # 启动它表示并发数,由completions指定总次数
# backoffLimit: 3 # 限制重试次数,默认6,超过次数则不再启动新pod
# activeDeadlineSeconds: 10 # 限制job执行时间,超时还不终止则强制终止,并且稍后执行自动删除(若设置),且不受restartPolicy字段影响
ttlSecondsAfterFinished: 10 # 多少秒后自动删除执行成功的job,避免太多不再需要的job累积
template:
spec:
restartPolicy: Never # or OnFailure, 不能是其他值;推荐Never,因为这个策略下控制会启动新的pod,不会删除失败的pod,有助于排查问题;OnFailure是不断重启旧的pod
containers:
- command: ['sh', '-c', 'echo "Start Job!"; sleep 30; echo "Job Done!"']
image: busybox
name: pods-job-containercompletions 字段来设置任务需要执行的总次数(串行式任务)
parallelism 字段来设置任务并发数量(并行式任务)
处理异常情况
任务执行失败,可以通过backoffLimit字段设置失败重试次数,默认是 6 次。
并且推荐设置 restartPolicy 为 Never(而不是 OnFailure), 这样可以保留启动失败的 Pod,以便排查日志。
使用 CronJob
它是基于 Job 的更高级的控制器,添加了时间管理功能。可以实现:
在未来某个指定时间运行一次 Job
周期性运行 Job
apiVersion: batch/v1
kind: CronJob
metadata:
name: pods-cronjob
spec:
schedule: "*/1 * * * *" # 最小到min级别,这表示每分钟1次
startingDeadlineSeconds: 3 # 最大启动时间,超时后变成失败
concurrencyPolicy: Forbid # Allow/Forbid/Replace,上个周期的Job未执行结束时,是否允许下个周期的Job开始执行,默认Allow
suspend: false # 是否暂停cronjob的执行,一般通过kubectl edit修改
successfulJobsHistoryLimit: 3 # 保留多少条执行成功的Job记录,默认3
failedJobsHistoryLimit: 1 # 保留多少条执行失败的Job记录,默认1
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- command: [ 'sh', '-c', 'echo "Start Job!"; sleep 30; echo "Job Done!"' ]
image: busybox
name: pods-cronjob-container