Job&CronJob

时间:2021-07-26 01:19:17

Job主要是来处“离线任务”的也称“Barch Job(计算业务)”

创建Job

apiVersion: batch/v1
kind: Job
metadata:
  name: command-job
spec:
  template:
    spec:
      containers:
      - name: command-job
        image: busybox
        command: ["/bin/sh","-c","sleep 5;echo 'job one'"]
      restartPolicy: Never

Job&CronJob

任务完成后,pod状态被置为Completed:

Job&CronJob

通过logs查看我们的任务执行结果:

Job&CronJob

Job任务的重启策略

重启策略(restartPolicy):

  • Never:pod启动失败时不会重启,而是通过job-controller重新创建pod供节点调度。
  • OnFailure:pod将会在节点重启执行任务。

Job任务失败处理方式

失败恢复策略

当Job pod重启多次还是失败后,会认为这是一个失败的任务,默认pod可以被重建6个(6次),可以通过backoffLimit限制重启次数

apiVersion: batch/v1
kind: Job
metadata:
  name: command-job-two
spec:
  backoffLimit: 2 # 限制最多可以重建2次
  template:
    spec:
      containers:
      - name: command-job-two
        image: busybox
        command: ["/bin/sh","-c","sleep 5;echo 'job two';exit 1"]
      restartPolicy: Never

我们通过describe查看创建的Job

Job&CronJob

job-controller经过2次重建pod达到阈值,job-controller认定本次Job为失败工作流。

Job&CronJob

在重启策略为Never时,认定失败的Job会将pod遗留在节点上。

Job期限和清理

除了Job执行结束与重启失败认定的Job 终止外还可以通过配置活跃期限(activeDeadlineSeconds)来自动停止Job任务。

我们可以为 Job 的 .spec.activeDeadlineSeconds 设置一个秒数值。 该值适用于 Job 的整个生命期,无论 Job 创建了多少个 Pod。 一旦 Job 运行时间达到 activeDeadlineSeconds 秒,其所有运行中的 Pod 都会被终止,并且 Job 的状态更新为 type: Failed 及 reason: DeadlineExceeded

注意 Job 的 .spec.activeDeadlineSeconds 优先级高于其 .spec.backoffLimit 设置。 因此,如果一个 Job 正在重试一个或多个失效的 Pod,该 Job 一旦到达 activeDeadlineSeconds 所设的时限即不再部署额外的 Pod,即使其重试次数还未 达到 backoffLimit 所设的限制。

apiVersion: batch/v1
kind: Job
metadata:
  name: command-job-three
spec:
  template:
    spec:
      containers:
      - name: command-job-three
        image: busybox
        command: ["/bin/sh","-c","sleep 50;echo 'job three'"]
      restartPolicy: Never
  backoffLimit: 2
  activeDeadlineSeconds: 10

虽然是50s的任务,但是由于activeDeadlineSeconds的限制,Job运行10s后被终止

Job&CronJob

Job的任务类型

非并行Job

通常只启动一个 Pod,除非该 Pod 失败,Pod中应用成功运行完成即视为Job任务为完成状态,我们上面讨论的任务即属于此类,默认是非并行job。

并行Job

apiVersion: batch/v1
kind: Job
metadata:
  name: command-job-three
spec:
  parallelism: 2 # 每次同时启动几个job pod
  completions: 4 # 一共启动几个job pod
  template:
    spec:
      containers:
      - name: command-job-three
        image: busybox
        command: ["/bin/sh","-c","sleep 50;echo 'job three'"]
      restartPolicy: Never

CronJob周期性任务

CronJob 用于执行周期性的动作,例如备份、邮件、报告生成等。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox
            command: ["/bin/sh","-c","date"]
          restartPolicy: Never

查看cronjob信息:

Job&CronJob

通过logs查看任务结果:

[docker@localhost yml]$ kubectl logs cronjob-1635010680-n5gxj
Sat Oct 23 17:38:15 UTC 2021
  • cronjob可以自动清理任务,默认保留3次成功的任务,我们可以通过添加.spec.successfulJobsHistoryLimit改变保留的历史任务信息即Pod。
  • 由于定时任务的特殊性,很可能一个任务没有执行完毕,另一个任务就要开始执行了,可以通过spec.concurrencyPolicy指定具体的策略
  • concurrencyPolicy=Allow, 默认策略,意味着这些pod可以同时共存
  • concurrencyPolicy=Forbid, 意味着不会创建新的pod,这个周期会跳过
  • concurrencyPolicy=Replace, 意味着新产生的pod会替换旧的未执行完毕的pod

    如果某一个job创建失败就会被标记为“miss”,当指定的时间窗口内miss的数目达到100时,就会停止再常见这个job。可以通过spec.startingDeadlineSeconds指定。比如spec.startingDeadlineSeconds=200.意味着在过去的200s里,miss数量达到100,这个job就会被停止创建。

    相关文章