CronJob
可以用来执行基于时间计划的定时任务,类似于Linux/Unix系统中的 crontable 。
CronJob 执行周期性的重复任务时非常有用,例如备份数据、发送邮件等。CronJob 也可以用来指定将来某个时间点执行单个任务,例如将某项任务定时到系统负载比较低的时候执行。
CronJob 也存在某些限制,例如,在某些情况下,一个 CronJob 可能会创建多个 Job。因此,Job 必须是 幂等
的
下面例子中的 CronJob 每分钟,打印一次当前时间并输出 hello world 信息。
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
执行命令以创建 CronJob:
kubectl create -f .job/cronjob.yaml
输出结果如下所示:
cronjob.batch/hello created
或者,您也可以直接使用 kubectl run
命令创建 CronJob:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
执行命令以查看已创建 CronJob 的状态
kubectl get cronjob hello
输出结果如下所示:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 10s
从输出结果可以看到,该 CronJob 还未运行任何 Job。执行一下命令,并等候一分钟左右时间
kubectl get jobs --watch
输出结果如下所示:
NAME COMPLETIONS DURATION AGE
hello-4111706356 0/1 0s
hello-4111706356 0/1 0s 0s
hello-4111706356 1/1 5s 5s
此时,可以看到该 CronJob 创建了一个 “hello-4111706356” Job,并执行结束。这时ctrl + c
停止 watch,并重新查看 Cronjob 的状态:
kubectl get cronjob hello
输出信息如下所示:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 50s 75s
输出结果显示,该 CronJob 在 LAST SCHEDULE
这个时间点成功创建了一个 Job。当前 ACTIVE
Job 数为 0,意味着,该 Job 已经成功结束,或者已经失败。
查看 Pod 的输出信息
执行命令获取 Pod 的名称
# 将 "hello-4111706356" 替换成您系统中的 Job name
pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items[*].metadata.name})
查看 Pod 的日志:
kubectl logs $pods
输出结果如下所示:
Fri Feb 22 11:02:09 UTC 2019
Hello from the Kubernetes cluster
当您不再需要某个 CronJob 时,可以使用命令将其删除 kubectl delete cronjob <cronjob name>
,在本例中,可以执行命令:
kubectl delete cronjob hello
或者
kubectl delete -f https://kuboard.cn/statics/learning/job/cronjob.yaml
删除 CronJob 时,将移除该 CronJob 创建的所有 Job 和 Pod,并且 CronJob 控制器将不会为其在创建任何新的 Job