Kubernetes对象之CronJob

学习本节内容之前,希望你已经对Job有了基本的了解。具体请参考这篇文章:

  • Kubernetes对象之Job

CronJob顾名思义,是一种能够在固定时间运行的Job对象。它使用Linux系统上的定时任务Cron的语法来定义这个Job的固定运行时间。

1. 创建一个CronJob对象

在Kubernetes 1.8之前,创建一个CronJob需要使用batch/v2alpha1版本的API,而默认这个版本的API是禁用的,因此需要通过传递参数--runtime-config=batch/v2alpha1=true给API Server来启用。而在Kubernetes 1.8之后,可以直接使用API Server默认就开启的batch/v1beta1版本。下面是一个例子:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
$ kubectl create -f ./cronjob.yaml
cronjob "hello" created

或者也可以通过即时命令的方式运行一个CronJob:

$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created
$ kubectl get cronjob hello
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         

此时我们看到,这个CronJob还没有真正运行任何Job。等待大约一分钟后可以观察到一个Job开始运行:

$ kubectl get jobs --watch
NAME               DESIRED   SUCCESSFUL   AGE
hello-4111706356   1         1         2s
$ kubectl get cronjob hello
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         Mon, 29 Aug 2016 14:34:00 -0700

2. 删除一个CronJob

通过kubectl delete命令来删除一个CronJob:

$ kubectl delete cronjob hello
cronjob "hello" deleted

删除一个CronJob对象会连带删除其创建的所有Job和Pod。

3. CronJob对象参数详解

3.1 .spec.schedule

.spec.schedule是一个Cron类型的字符串,用于描述这个CronJob的执行周期。

3.2 .spec.startingDeadlineSeconds

.spec.startingDeadlineSeconds参数用于指定一个CronJob如果没有按时启动(可能规定时间时CronJob controller恰好出现故障),依旧能够存活的时间。如果超过了这个设定的时间,那么此CronJob就被标记为Failed。如果不设置这个参数,那么这个CronJob没有超时时间。

3.3 .spec.concurrencyPolicy

.spec.concurrencyPolicy用于指定如何处理一个CronJob创建的多个并行执行的Job(由于存在.spec.startingDeadlineSeconds参数,因此有可能到某个时间点,恰好恢复了的CronJob controller会创建一个原先就该运行的Job;而此时刚好又到了该CronJob执行周期,因此可能会出现并行运行Job的情况)。它有下列可选值:

  • Allow(默认值):运行并行执行多个Job
  • Forbid:禁止并行运行多个Job。如果一个新的Job创建时,正在运行一个旧Job,那么CronJob controller则不会创建这个新Job
  • Replace:如果一个新的Job创建时,正在运行一个旧Job,那么CronJob controller会使用这个新Job替代正在运行的旧Job

如果.spec.startingDeadlineSeconds参数设置为一个很大的值(或者直接不设置),并且.spec.concurrencyPolicy设置为Allow,那么这个CronJob至少会运行一次。

3.4 .spec.suspend

.spec.suspend参数如果设置为true,那么所有将来的定时执行都会被暂停。已经处在运行状态的Job不受影响。默认值为false。

参考文章

  • https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
  • https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

你可能感兴趣的:(Kubernetes对象之CronJob)