Kubernetes Job 和 CronJob 使用介绍

65

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-container

completions 字段来设置任务需要执行的总次数(串行式任务)

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