头图

  在K8s中,Job控制器管理的作业在控制器资源被创建之后便会立即执行,而CronJob控制器可用于管理和调度作业运行的时间,从而实现定时作业和周期作业的目的,这种控制器管理和调度作业的方式类似Linux的crontab命令。CronJob控制器管理和调度作业的方式主要有以下两种:

  • 在未来某一时间运行作业一次
  • 在指定的时间点重复运行作业

  视频讲解如下:
https://www.bilibili.com/video/BV1Tw4m1Y73C/?aid=1106169567&c...

一、运行第一个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

image.png

提示:这时候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

image.png

提示:这时候CronJob控制器将创建第二个Pod。

(6)再次等待一分钟后,再次查看CronJob和Pod的信息,如下图所示。

kubectl get cronjob,pod

image.png

提示:这时候CronJob控制器将创建第三个Pod,以后每隔一分钟将创建一个新的Pod。

二、CronJob的时间表示

  CronJob控制器中的时间表示方式与Linux中的crontab命令表示时间的方式类似。以"cronjob-demo.yaml"为例。通过".spec.schedule"字段设置CronJob控制器将1分钟调度一次。具体的参数含义如下图所示。
image.png

  按照CronJob的时间表示方式,下面的CronJob控制器将在每个月21号的午夜以及每个星期六的午夜开始任务。

schedule: "0 0 21 * 6"

  下表列举了一些常见的CronJob的时间表示方式。

image.png

三、CronJob控制器的限制

  CronJob控制器根据预写设定的时间定时创建一个Job并执行该Job。但CronJob并不严格保证Job一定会被创建,某些情况下可能不会创建Job,某些情况下可能会创建两个Job。应该尽量减少这种情况的发生,但不能完全杜绝。当字段"startingDeadlineSeconds"保持默认值或者很大,且字段"concurrencyPolicy"设置为"Allow"时,CronJob控制器将保证Job将始终至少运行一次。

提示:由于CronJob控制器每隔10秒钟执行一次检查。因此不能将字段"startingDeadlineSeconds"的值设置过小。如果该字段的值低于了10秒钟,CronJob可能无法被调度。

赵渝强老师
30 声望10 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...