CronJob控制器

官方文档:https://v1-16.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/ CronJob控制器用于管理Job控制器资源的运行时间,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划(crontab)的方式控制其运行的时间点及其重复运行的方式

  • 在未来某时间点运行作业一次
  • 在指定的时间点重复运行作业
    CronJob对象支持使用的时间格式类似于Crontab,略有不同的是,CronJob控制器在指定的时间点时,”?”和”*”的意义相同,都表示任何可用的有效值

创建CronJob对象

CronJob控制器的spec字段可用嵌套使用以下字段

  • jobTemplate
  • schedule:Cron格式的作业调度时间点;必须字段
  • concurrencyPolicy:指定任务的并发执行策略,可用值有”Allow(运行)”,”Forbid(禁止)”,”Replace(替换)”,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
  • failedJobHistoryLimit:为失败的任务执行保留的历史记录数,默认值为1
  • successfulJobsHistoryLimit: 为成功的任务执行保留的历史记录数,默认为3
  • startingDeadlineSeconds:因各自原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误历史记录
  • suspend:是否观棋后续的执行,默认为false,对运行中的作业不会产生影响

下面是一个定义在资源清单文件(cronjob-example.yaml)中的CronJob资源对象示例,它每隔2分钟运行一次由JobTemplate定义的简单任务

  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: cronjob-example
  5. labels:
  6. app: mycronjob
  7. spec:
  8. schedule: "*/2 * * * *"
  9. jobTemplate:
  10. metadata:
  11. labels:
  12. app: mycronjob-jobs
  13. spec:
  14. parallelism: 2
  15. template:
  16. spec:
  17. containers:
  18. - name: myjob
  19. image: registry.cn-hangzhou.aliyuncs.com/jiangyida/busybox:0.1
  20. command: ["/bin/sh","-c","date; echo hello from the k8s cluster;sleep 10"]
  21. restartPolicy: OnFailure

运行资源创建命令创建上述CronJob资源对象,而后再通过资源对象的相关信息了解运行状态。下面的命令结果中的SCHEDULE是指其调度时间点,SUSPEND表示后续任务是否处于挂起状态,即暂停任务的调度运行,ACTIVE表示活动状态的Job对像的数量,而LAST SCHEDULE则表示上次调度运行至此刻的时长

  1. [root@k8s-master01 nginx]# kubectl apply -f cronjob-example.yaml
  2. cronjob.batch/cronjob-example created
  3. [root@k8s-master01 nginx]#
  4. [root@k8s-master01 nginx]# kubectl get cronjob cronjob-example
  5. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  6. cronjob-example */2 * * * * False 0 29s 3m7s
  7. [root@k8s-master01 nginx]#

CronJob的控制机制

CronJob控制器是一个更高级别的资源,它以Job控制器资源为其管控对象,并借助它管理Pod资源对象。因此,要使用类似如下命令来查看某CronJob控制器创建的Job资源,其中的标签”mycronjob-jobs”是在创建cronjob-example时为其指定,不过,只有相关的Job对象被调度执行时,此命令才能将其正常列出。可列出的Job对象的数量取决于CronJob资源的.spec.successfulJobsHistoryLimit的属性值,默认为3

  1. [root@k8s-master01 nginx]# kubectl get jobs -l app=mycronjob-jobs
  2. NAME COMPLETIONS DURATION AGE
  3. cronjob-example-1592380560 2/1 of 2 12s 5m19s
  4. cronjob-example-1592380680 2/1 of 2 11s 3m18s
  5. cronjob-example-1592380800 2/1 of 2 11s 78s
  6. [root@k8s-master01 nginx]#

如果作业重复执行时指定的时间点较近,而作业执行时长(普遍或偶尔)跨过了其两次执行的时间长度,则会出现两个Job对象同时存在的情形。有些Job对象可能会存在无法或不能同时运行的情况,这个时候就要通过.spec.concurrencyPolicy属性控制作业并存的机制,其默认值为”Allow”,即运行前后Job,甚至属于同一个Cronjob的更多Job同时运行,其他两个可用值中,“Forbid”用于机制前后两个Job同时运行,如果前一个尚未结束,后一个则不予启动,“Replace”用于让后一个Job取代前一个,即终止前一个并启动后一个

删除CronJob

如果我们不再需要CronJob了,可用使用kubectl delete cronjob CRON_JOB_NAME来删除它,这会影响到正在创建的Job。但是运行中的Job将不会删除

  1. [root@k8s-master01 nginx]# kubectl get cronjob
  2. NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
  3. cronjob-example */2 * * * * False 0 55s 25m
  4. [root@k8s-master01 nginx]# kubectl delete cronjob cronjob-example
  5. cronjob.batch "cronjob-example" deleted
  6. [root@k8s-master01 nginx]#

通过上面的命令看到cronJob被删除了,但是Job并没有被删除,如下面的命令显示的结果。如果要删除这些Job或者Pod,可用试下如何的命令

  1. [root@k8s-master01 nginx]# kubectl get jobs
  2. NAME COMPLETIONS DURATION AGE
  3. job-example 1/1 32s 23h
  4. job-multi 5/5 24s 23h
  5. [root@k8s-master01 nginx]# kubectl delete jobs job-example
  6. job.batch "job-example" deleted
  7. [root@k8s-master01 nginx]# kubectl get jobs
  8. NAME COMPLETIONS DURATION AGE
  9. job-multi 5/5 24s 23h
  10. [root@k8s-master01 nginx]#

一旦job被删除,由Job创建的Pod也会被删除