在K8s中,Job控制器管理的作业在控制器资源被创建之后便会立即执行,而CronJob控制器可用于管理和调度作业运行的时间,从而实现定时作业和周期作业的目的,这种控制器管理和调度作业的方式类似Linux的crontab命令。CronJob控制器管理和调度作业的方式主要有以下两种:
- 在未来某一时间运行作业一次
- 在指定的时间点重复运行作业
视频讲解如下:
一、运行第一个CronJob控制器
下面通过一个具体的示例来演示如何使用CronJob控制器。该示例会在每分钟打印出当前时间和问候消息。
(1)创建"cronjob-demo.yaml"文件,并输入下面的内容。
apiVersion batch/v1beta1 kind CronJob metadata name cronjob-demo spec #CronJob控制器将1分钟调度一次 schedule"*/1 * * * *" jobTemplate spec template spec containers name cronjob-demo image busybox imagePullPolicy IfNotPresent command /bin/sh -c date; echo Hello from the CronJob restartPolicy OnFailure
(2)执行命令创建CronJob。
kubectl apply -f cronjob-demo.yaml
(3)查看CronJob和Pod的信息,如下图所示。
kubectl get cronjob,pod
提示:这时候CronJob控制器将创建第一个Pod。
(4)查看Pod的标准输出信息。
kubectl logs pod/cronjob-demo-1643438580-9v556 # 输出的信息如下: Sat Jan 29 06:43:05 UTC 2022 Hello from the CronJob
(5)等待一分钟后,再次查看CronJob和Pod的信息,如下图所示。
kubectl get cronjob,pod
提示:这时候CronJob控制器将创建第二个Pod。
(6)再次等待一分钟后,再次查看CronJob和Pod的信息,如下图所示。
kubectl get cronjob,pod
提示:这时候CronJob控制器将创建第三个Pod,以后每隔一分钟将创建一个新的Pod。
二、CronJob的时间表示
CronJob控制器中的时间表示方式与Linux中的crontab命令表示时间的方式类似。以"cronjob-demo.yaml"为例。通过".spec.schedule"字段设置CronJob控制器将1分钟调度一次。具体的参数含义如下图所示。
按照CronJob的时间表示方式,下面的CronJob控制器将在每个月21号的午夜以及每个星期六的午夜开始任务。
schedule: "0 0 21 * 6"
下表列举了一些常见的CronJob的时间表示方式。
三、CronJob控制器的限制
CronJob控制器根据预写设定的时间定时创建一个Job并执行该Job。但CronJob并不严格保证Job一定会被创建,某些情况下可能不会创建Job,某些情况下可能会创建两个Job。应该尽量减少这种情况的发生,但不能完全杜绝。当字段"startingDeadlineSeconds"保持默认值或者很大,且字段"concurrencyPolicy"设置为"Allow"时,CronJob控制器将保证Job将始终至少运行一次。
提示:由于CronJob控制器每隔10秒钟执行一次检查。因此不能将字段"startingDeadlineSeconds"的值设置过小。如果该字段的值低于了10秒钟,CronJob可能无法被调度。