2.7.2 CronJob并发策略

CronJob 支持三种并发策略:

  • Allow:允许同时运行多个任务,默认值
  • Forbid:不允许并发运行,如果之前的任务尚未完成,新的任务不会被创建
  • Replace:如果之前的任务尚未完成,新的任务会替换的之前的任务

如需更改并发策略,只需要更改 CronJob 的 concurrencyPolicy 字段即可。比如不允许 CronJob并发执行:

1、重新定义一个CronJob

关键配置

  concurrencyPolicy: Forbid

完整配置文件

[root@k8s-master01 ~]# vim  cronjob.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  concurrencyPolicy: Forbid
  schedule: '*/1 * * * *'
  jobTemplate:
    metadata:
      name: hello
    spec:
      template:
        metadata:
        spec:
          containers:
          - command:
            - sh
            - -c
            - echo "Hello,Job" && sleep 300
            image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox:1.28
            name: hello
            resources: {}
          restartPolicy: OnFailure

说明:

  • sleep 300是为了验证1分钟后能不能再创建一个新的job

2、创建cronjob

[root@k8s-master01 ~]# kaf  cronjob.yaml 

3、查看创建情况

[root@k8s-master01 ~]# kg cj
NAME    SCHEDULE      TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   <none>     False     1        2s              5s

4、该任务在第一个创建 Job 后,因为第一次调度的pod并未结束,同时由于并发策略的控制,导致第二个任务不会在两分钟后创建

[root@k8s-master01 ~]# kg job | grep hello
hello-29042369   Running   0/1           2m35s      2m35s

# 查看pod
[root@k8s-master01 ~]# kgp
NAME                   READY   STATUS    RESTARTS   AGE
hello-29042396-4cf8x   1/1     Running   0          90s

5、调整并发策略为Replace后重新应用

[root@k8s-master01 ~]# vim  cronjob.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  concurrencyPolicy: Replace
  schedule: '*/1 * * * *'
  jobTemplate:
    metadata:
      name: hello
    spec:
      template:
        metadata:
        spec:
          containers:
          - command:
            - sh
            - -c
            - echo "Hello,Job" && sleep 300
            image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox:1.28
            name: hello
            resources: {}
          restartPolicy: OnFailure

# 重新应用
[root@k8s-master01 ~]# kaf cronjob.yaml 

6、因为并发策略是替换,下一次任务会覆盖上一次任务(避免长时间无法结束的任务),查看新建的 Job 和 Pod

[root@k8s-master01 ~]# kg job | grep hello
hello-29042369   Running   0/1           2m35s      2m35s

# 查看新建的pod
[root@k8s-master01 ~]# kgp
NAME                   READY   STATUS              RESTARTS   AGE
hello-29042402-5r6f8   1/1     Terminating         0          60s
hello-29042403-cpxxs   0/1     ContainerCreating   0          0s

# 查看新建的pod
[root@k8s-master01 ~]# kgp
NAME                   READY   STATUS        RESTARTS   AGE
hello-29042402-5r6f8   1/1     Terminating   0          64s
hello-29042403-cpxxs   1/1     Running       0          4s

# 查看新建的pod
[root@k8s-master01 ~]# kgp
NAME                   READY   STATUS    RESTARTS   AGE
hello-29042403-cpxxs   1/1     Running   0          58s

7、环境复原

[root@k8s-master01 ~]# k delete -f cronjob.yaml

2.7.3 Cronjob执行记录

CronJob 默认的执行记录保留方式如下:

  • 成功记录:默认为 3 次,可以通过 successfulJobsHistoryLimit 字段更改
  • 失败记录:默认为 1 次,可以通过 failedJobsHistoryLimit 字段更改

1、重新定义一个CronJob

关键配置

failedJobsHistoryLimit: 5
successfulJobsHistoryLimit: 5

完整配置文件

[root@k8s-master01 ~]# vim  cronjob.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  failedJobsHistoryLimit: 5
  successfulJobsHistoryLimit: 5
  schedule: '*/1 * * * *'
  jobTemplate:
    metadata:
      name: hello
    spec:
      template:
        metadata:
        spec:
          containers:
          - command:
            - sh
            - -c
            - echo "Hello,Job"
            image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox:1.28
            name: hello
            resources: {}
          restartPolicy: OnFailure

2、创建CronJob

[root@k8s-master01 ~]# kaf  cronjob.yaml 

3、查看创建情况

# 查看cronjob创建情况
[root@k8s-master01 ~]# kg cj
NAME    SCHEDULE      TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   <none>     False     0        20s             73s

# 查看pod创建情况
[root@k8s-master01 ~]# kgp
NAME                   READY   STATUS      RESTARTS   AGE
hello-29042412-m4h7j   0/1     Completed   0          4m23s
hello-29042413-2n88x   0/1     Completed   0          3m23s
hello-29042414-4hw6d   0/1     Completed   0          2m23s
hello-29042415-wtk4f   0/1     Completed   0          83s
hello-29042416-pzxhh   0/1     Completed   0          23s

# 查看pod日志信息
[root@k8s-master01 ~]# k logs -f hello-29042416-pzxhh
Hello,Job

4、环境复原

[root@k8s-master01 ~]# k delete -f cronjob.yaml