CronJob控制器介绍
CronJob控制器用于管理Job控制器资源的运行时间,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以控制Job控制器的运行时间以及运行周期,类似与Linux中的Crontab。
- 在未来某时间点内运行作业一次
- 在指定的时间点重复运行作业
Crontab对象支持使用的时间格式类似与Crontab,略有不同的是,CronJob控制器在指定的时间点时, ? 和 * 的意义相同,都表示任何可用的有效值。
应用场景:数据备份、定时任务处理等。
创建CronJob对象
CronJob控制器的spec字段可以嵌套以下字段。
jobTemplate <Object>:
Job控制器模版,用于为Crontab控制器生成Job对象,必选字段。- schedule
:Cron格式的作业调度运行时间点,必选字段。 concurrencyPolicy<string>:
并发执行策略,可用值Allow
(允许)、Forbid
(禁止)、Replace
(替换),用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业。failedJobHistoryLimit<integer>:
为失败的任务执行保留的历史记录数,默认为1。successfulJobsHistoryLimit<integer>:
为成功的任务执行保留的历史记录数,默认为3.startingDeadlineSeconds<integer>:
因各种原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误历史记录。suspend<boolean>:
是否挂起后续的任务执行,默认为false,对运行中的作业不会产生影响。
下面是一个定义资源清单文件中的CronJob资源对象示例:
每隔两分钟运行一次由jobTemplate定义的任务,每次并发处理任务的Pod是两个,如果容器异常退出,则重启容器,Job任务输出当前时间后再输出Hello from the Kubernetes cluster;,
然后再沉睡60s后任务执行成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
apiVersion: batch/v1beta1 kind: CronJob metadata: name: busybox-cronjob labels: app: cronjob spec: schedule: "*/2 * * * *" concurrencyPolicy: Allow failedJobsHistoryLimit: 10 successfulJobsHistoryLimit: 5 jobTemplate: metadata: name: busybox-job labels: app: job spec: parallelism: 2 template: spec: restartPolicy: OnFailure containers: - name: busybox image: busybox:latest command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster; sleep 60 |
创建cronjob控制器
kubectl apply -f busybox-cronjob.yaml
查看Cronjob
1 2 3 4 |
kubectl get cronjobs busybox-cronjob -o wide NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR busybox-cronjob */2 * * * * False 0 <none> 2s busybox busybox:latest <none> |
两分钟后,cronjob控制器开始创建job控制器
1 2 3 4 5 |
kubectl get cronjobs busybox-cronjob -o wide --watch NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR busybox-cronjob */2 * * * * False 0 <none> 19s busybox busybox:latest <none> busybox-cronjob */2 * * * * False 1 3s 74s busybox busybox:latest <none> |
查看jobs状态
1 2 3 4 |
kubectl get jobs -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR busybox-cronjob-1590723240 2/1 of 2 90s 116s busybox busybox:latest controller-uid=8b3837a8-901f-41ff-8c17-0295da8998ec |
Jobs控制器也开始创建Pod进行任务处理
查看Pod状态
1 2 3 4 |
kubectl get pods -o wide | grep busybox-cronjob busybox-cronjob-1590723240-kmrxr 0/1 Completed 0 3m45s 10.244.3.244 k8s-node01 <none> <none> busybox-cronjob-1590723240-v8p5s 0/1 Completed 0 3m45s 10.244.3.243 k8s-node01 <none> <none> |
查看Pod日志
1 2 3 4 |
kubectl logs pods/busybox-cronjob-1590723240-kmrxr Fri May 29 03:34:32 UTC 2020 Hello from the Kubernetes cluster |
每个两分钟运行一次任务,CronJob则根据JobTemplate创建一个Job控制器,然后Job控制器创建两个Pod去执行任务,几个周期后,就会创建多个Job控制器也N个执行任务的Pod。
如下,已经创建了4个Job控制器
1 2 3 4 5 6 7 |
kubectl get jobs -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR busybox-cronjob-1590723240 2/1 of 2 90s 6m34s busybox busybox:latest controller-uid=8b3837a8-901f-41ff-8c17-0295da8998ec busybox-cronjob-1590723360 2/1 of 2 88s 4m33s busybox busybox:latest controller-uid=ea9b4a57-e799-4b29-87a1-bd00ce3a7316 busybox-cronjob-1590723480 2/1 of 2 85s 2m33s busybox busybox:latest controller-uid=3a1158de-cffb-44d7-9117-72e5544c6a40 busybox-cronjob-1590723600 0/1 of 2 33s 33s busybox busybox:latest controller-uid=501a7203-9aeb-4095-9539-38102fb7afea |
创建了8个Pod,任务执行完成后的Pod则标记为Completed
状态
1 2 3 4 5 6 7 8 9 10 |
kubectl get pods -o wide | grep busybox-cronjob busybox-cronjob-1590723240-kmrxr 0/1 Completed 0 7m27s 10.244.3.244 k8s-node01 <none> <none> busybox-cronjob-1590723240-v8p5s 0/1 Completed 0 7m27s 10.244.3.243 k8s-node01 <none> <none> busybox-cronjob-1590723360-54ls8 0/1 Completed 0 5m26s 10.244.3.245 k8s-node01 <none> <none> busybox-cronjob-1590723360-bggd9 0/1 Completed 0 5m26s 10.244.3.246 k8s-node01 <none> <none> busybox-cronjob-1590723480-dwtj2 0/1 Completed 0 3m26s 10.244.3.247 k8s-node01 <none> <none> busybox-cronjob-1590723480-xr65b 0/1 Completed 0 3m26s 10.244.3.248 k8s-node01 <none> <none> busybox-cronjob-1590723600-ldgkk 1/1 Running 0 86s 10.244.3.249 k8s-node01 <none> <none> busybox-cronjob-1590723600-wvs7r 1/1 Running 0 86s 10.244.3.250 k8s-node01 <none> <none> |
CronJob的控制机制
CronJob控制器是一个更高级别的资源,它以Job控制器资源为管控对象,并借助它管理Pod资源对象。因此,要使用类似如下命令来查看某CronJob控制器创建的Job资源对象,其中的标签app=job
是在创建资源配置清单中指定。
如下查看Job控制器的命令,最多只能列出5个成功的Job,这由我们清单中successfulJobsHistoryLimit
属性控制,上面清单中我定义的属性值为5,所以下面显示了5个成功的Job和一个正在运行的Job。
1 2 3 4 5 6 7 8 9 |
kubectl get jobs -l app=job -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR busybox-cronjob-1590723480 2/1 of 2 85s 11m busybox busybox:latest controller-uid=3a1158de-cffb-44d7-9117-72e5544c6a40 busybox-cronjob-1590723600 2/1 of 2 111s 9m12s busybox busybox:latest controller-uid=501a7203-9aeb-4095-9539-38102fb7afea busybox-cronjob-1590723720 2/1 of 2 94s 7m11s busybox busybox:latest controller-uid=ebee6db9-2218-4b91-9567-f766ec426371 busybox-cronjob-1590723840 2/1 of 2 95s 5m11s busybox busybox:latest controller-uid=58d5ff6d-f323-4091-a541-6f238674a3cd busybox-cronjob-1590723960 2/1 of 2 96s 3m11s busybox busybox:latest controller-uid=e59a8c75-e53c-48dc-9c90-e1490f86c9fd busybox-cronjob-1590724080 0/1 of 2 70s 70s busybox busybox:latest controller-uid=cd495a92-155c-42f1-b917-4d23ed684ce3 |
假如我们还是每隔两分钟执行一次任务,但是我们每次执行任务的时间却需要三分钟,也就是任务执行时间超出了任务间隔时间,这个时候则需要两个Job对象同时存在的场景,那么就需要我们在清单中定义concurrencyPolicy
属性为Allow
来支持多个Job并存,来允许无论是先运行的Job或者是后运行的Job都能够在同时运行,值为Forbid
则用于禁止前后两个Job同时运行,如果前一个Job尚未运行结束,后一个则跳过;Replace
用于让后一个Job取代前一个Job,即终止前一个并启动后一个Job。