Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个pod成功结束。

CronJob负责定时任务,在指定的时间周期运行指定的任务

Job

Job用于批量处理短暂的一次性任务,并保证指定数量的pod成功结束。

Kubernetes支持以下几种方式:

  • 非并行Job:
    • 通常只运行一个pod,pod成功结束Job就退出。
  • 固定完成次数的并行Job:
    • 并发运行指定数量的pod,直到指定数量的pod成功,job结束。
  • 带有工作队列的并行Job:
    • 用户可以指定并行的pod数量,当任何Pod成功结束后,不会再创建新的pod
    • 一旦有一个pod成功结束,并且所有的pods都结束了,改job就成功结束。
    • 一旦有一个pod成功结束,其他pods都会准备推出。

Job Spec

  • Spec.template格式通Pod
  • RestartPolicy仅支持Never或OnFailure
  • 单个Pod时,默认Pod成功运行后Job即结束
  • .spec.completions 标志Job结束需要成功运行的pod个数,默认为1
  • .spec.parallelism 标志并行运行的pod的个数,默认为1
  • .spec.activeDeadLineSeconds 标志失败pod的重试最大时间,超过这个时间不会继续重试
  • .spec.backoffLimit 标志指定job失败后进行重试的次数。默认是6次,每次失败后重试会有延迟时间,改时间是指数级增长,最长时间是6min

示例

yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

创建:

1
$ kubectl apply -f job.yaml

查看:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-demo   1/1           5s         10m
$ kubectl get pods
NAME                              READY   STATUS      RESTARTS   AGE
......
job-demo-28v66                    0/1     Completed   0          10m
......
[root@k8s-77-40 job]# kubectl logs job-demo-28v66
9
8
7
6
5
4
3
2
1

CronJob

cronJob是基于时间进行任务的定时管理:

  • 在特定的时间点运行任务
  • 反复在指定的时间点运行任务:比如定时进行数据库备份,定时发送邮件等等

CronJob Spec

  • .spec.schedule: 调度,必需字段,指定任务运行周期

  • .spec.jobTemplate: Job模板,必需字段,指定需要运行的任务

  • .spec.startingDeadlineSeconds: 启动Job的期限(秒级别),该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的Job将被认为是失败的。如果没有指定,则没有期限。

  • .spec.concurrencyPolicy: 并发策略,该字段也是可选的。它指定了如何处理被Cron Job创建的Job的并发执行。只允许指定下面策略的一种:

    • Allow(默认):允许并发运行Job
    • Forid: 禁止并发运行,如果前一个还没有完成,则直接跳过下一个
    • Replace: 取消当前正在运行的Job,用一个新的来替换

注意,当前策略只能应用于同一个CronJob创建的Job。如果存在多个CronJob,它们创建的Job之间总是允许并发运行

  • .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit: 历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job

示例

分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令

Yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: hello
            image: busybox
            args:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

创建:

1
2
3
4
$ kubectl apply -f job-2.yaml
$ kubectl get cronjobs
NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-demo   */1 * * * *   False     0        35s             2m51s