Kubernetes的Cron Job
2017-08-21
Kubernetes集群使用Cron Job管理基于时间的作业,可以在指定的时间点执行一次或在指定时间点执行多次任务。 一个Cron Job就好像Linux crontab中的一行,可以按照Cron定时运行任务。
定时任务对我们并不陌生,例如Linux的crontab,各种编程语言都内置了定时任务支持,这在我们应用开发中比较常见,但这种定时任务在分布式系统中使用会有限制,因此需要分布式计划任务。 Kubernetes的CronJob可以理解为Kubernetes对分布式计划任务的支持。
在使用Cron Job之前需要确认Kubernetes集群的版本>=1.5,因为它还处于alpha,所以还需要对kube-apiserver加入启动参数--runtime-config=batch/v2alpha1=true
,开启batch/v2alpha1。
下面我们来试验一下,试验的Kubernetes集群的版本为1.6.8。
在加入启动参数
--runtime-config=batch/v2alpha1=true
后,要重启kube-apiserver, kube-controller-manager, kube-scheduler,创建crontab才会被调度
创建Cron Job #
创建一个简单的CronJob,每隔1分钟打印当前的时间并"say Hello",cronjob.yaml:
1apiVersion: batch/v2alpha1
2kind: CronJob
3metadata:
4 name: hello
5spec:
6 schedule: "*/1 * * * *"
7 jobTemplate:
8 spec:
9 template:
10 spec:
11 containers:
12 - name: hello
13 image: alpine
14 args:
15 - /bin/sh
16 - -c
17 - date; echo Hello from the Kubernetes cluster
18 restartPolicy: OnFailure
下面创建这个CronJob:
1kubectl create -f cronjob.yaml
2cronjob "hello" created
查看这个CronJob的状态:
1kubectl get cronjob hello
2NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
3hello */1 * * * * False 0 <none>
从上面的输出看这个cronjob还没有被调度,等大约1分钟再次查看:
1kubectl get jobs --watch
2NAME DESIRED SUCCESSFUL AGE
3hello-1503321060 1 1 2m
4hello-1503321120 1 1 1m
5hello-1503321180 1 1 36s
6
7
8kubectl get cronjob
9NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
10hello */1 * * * * False 0 Mon, 21 Aug 2017 21:14:00 +0800
删除Cron Job #
1kubectl delete cronjob hello
2cronjob "hello" deleted
或
1kubectl delete -f cronjob.yaml
删除命令会停止已经创建出来的作业,当时正在运行的作业不会被被停止,同时Job和Pod不会被删除:
1kubectl get jobs
2NAME DESIRED SUCCESSFUL AGE
3hello-1503321060 1 1 7m
4hello-1503321120 1 1 6m
5hello-1503321180 1 1 5m
6hello-1503321240 1 1 4m
7hello-1503321300 1 1 3m
8hello-1503321360 1 1 2m
9hello-1503321420 1 1 1m
需要手动删除上面的job,job被删除,它创建出来的Pod也会被删除掉。
使用
kubectl delete jobs --all
可以删除当前namespaces下所有的job
当前Cron Job的限制 #
当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。 因此如果我们现在使用它,那么Job应该被我们设计成幂等的。