34.CronJob

CronJob

Cron Job管理基于时间的 Job,即:

  • 在给定时间点只运行一次
  • 周期性地在给定时间点运行

一个CronJob对象类似于crontab (cron table)文件中的一行。它根据指定的预定计划周期性地运行一个Job,格式可以参考 Cron

前提条件

当前使用的Kubernetes集群,版本>= 1.8(对CronJob。对于先前版本的集群,版本< 1.8,启动API Server(参考 为集群开启或关闭API版本 获取更多信息)时,通过传递选项 --runtime-config=batch/v2alpha1=true 可以开启batch/v2alpha1 API

典型的用法如下所示:

  • 在给定的时间点调度Job运行
  • 创建周期性运行的Job,例如:数据库备份、发送邮件。

CronJob Spec

  • .spec.schedule调度,必需字段,指定任务运行周期,格式同 Cron

  • .spec.jobTemplateJob模板,必需字段,指定需要运行的任务,格式同 Job

  • .spec.startingDeadlineSeconds启动Job的期限(秒级别,该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的Job将被认为是失败的。如果没有指定,则没有期限

  • .spec.concurrencyPolicy并发策略,该字段也是可选的。它指定了如何处理被Cron Job创建的Job的并发执行。只允许指定下面策略中的一种:

    • Allow(默认:允许并发运行Job
    • Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个
    • Replace:取消当前正在运行的Job,用一个新的来替换

    注意,当前策略只能应用于同一个Cron Job创建的Job。如果存在多个Cron Job,它们创建的Job之间总是允许并发运行。

  • .spec.suspend挂起,该字段也是可选的。如果设置为 true,后续所有执行都会被挂起。它对已经开始执行的Job不起作用。默认值为 false

  • .spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job

    默认情况下,它们分别设置为 31。设置限制的值为 0,相关类型的Job完成后将不会被保留。

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

当然,也可以用kubectl run来创建一个CronJob

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         <none>
$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1202039034   1         1            49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster

# 注意,删除 cronjob 的时候不会自动删除 job,这些 job 可以用 kubectl delete job 来删除
$ kubectl delete cronjob hello
cronjob "hello" deleted

Cron Job限制

Cron Job在每次调度运行时间内 大概 会创建一个Job对象。我们之所以说 大概 ,是因为在特定的环境下可能会创建两个Job,或者一个Job都没创建。我们尝试少发生这种情况,但却不能完全避免。因此,创建Job操作应该是 幂等的

Job根据它所创建的Pod的并行度,负责重试创建Pod,并就决定这一组Pod的成功或失败。Cron Job根本就不会去检查Pod

删除Cron Job

一旦不再需要Cron Job,简单地可以使用 kubectl 命令删除它:

$ kubectl delete cronjob hello
cronjob "hello" deleted

这将会终止正在创建的Job。然而,运行中的Job将不会被终止,不会删除Job或 它们的Pod。为了清理那些JobPod,需要列出该Cron Job创建的全部Job,然后删除它们:

$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1201907962   1         1            11m
hello-1202039034   1         1            8m
...

$ kubectl delete jobs hello-1201907962 hello-1202039034 ...
job "hello-1201907962" deleted
job "hello-1202039034" deleted
...

一旦Job被删除,由Job创建的Pod也会被删除。注意,所有由名称为 “hello” 的Cron Job创建的Job会以前缀字符串 “hello-” 进行命名。如果想要删除当前Namespace中的所有Job,可以通过命令 kubectl delete jobs --all 立刻删除它们。

上一页
下一页