CronJob是基于时间的任务,和linux系统中的计划任务crontab同理。一个CronJob对象就像一行crontab(cron表)文件。 它以给定的时间表定期运行指定的任务,语法与crontab格式相同。(在Kubernetes1.4版本名为ScheduledJob,从1.5版本开始改成CronJob)

它的常用场景和crontab一样:

  • 在指定时间点执行Job
  • 周期性执行Job

创建CronJob

cronjob.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: batch/v1beta1
kind: CronJob # 创建CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow # 默认允许并发,可配置Forbid(禁止并发)、Replace(替换当前Job)并发策略
jobTemplate: # Job模板
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

创建

1
2
[root@node1 ~]# kubectl create -f cronjob.yaml
cronjob "hello" created

也可以使用Kubectl run来创建一个CronJob,而不需要写yaml配置文件

1
2
[root@node1 ~]# kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created

创建后获取CronJob状态信息

1
2
3
[root@node1 ~]# kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>

上述状态表示即没有active的Job,也没有被调度的Job。此时稍等约一分钟再看:

1
2
3
[root@node1 ~]# kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-4111706356 1 1 2s
1
2
3
[root@node1 ~]# kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 Mon, 29 Aug 2018 14:34:00 -0700

LAST-SCHEDULE表示此Job在指定的时间点已被调度。此时可查看最近一次调度的Pod执行的结果输出:

1
2
3
4
5
6
[root@node1 ~]# pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})
[root@node1 ~]# echo $pods
hello-4111706356-o9qcm
[root@node1 ~]# kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2018
Hello from the Kubernetes cluster

删除CronJob

1
2
[root@node1 ~]# kubectl delete cronjob hello
cronjob "hello" deleted

这将会终止正在创建的Job。但运行中的Job不会被终止,包括它的Pod。为了清理这些Job和Pod,需要列出该CronJob创建的全部Job并删除它们:

1
2
3
4
5
6
7
8
9
10
[root@node1 ~]# kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1201907962 1 1 11m
hello-1202039034 1 1 8m
...

[root@node1 ~]# kubectl delete jobs hello-1201907962 hello-1202039034 ...
job "hello-1201907962" deleted
job "hello-1202039034" deleted
...

删除当前namespace下的所有job,可以使用kubectl delete jobs --all来操作。