Kubernetes Job and CronJob
一、简介
我们在日常工作中经常会遇到一些需要进行批处理和分析的需求,当然也会有按时间进行调度的工作,在 Kubernetes
集群中,提供了 Job
和 CronJob
两种资源对象来应对我们这种需求。
Job
负责处理任务,即仅执行一次的任务,它保证批处理的一个或多个Pod
成功结束。而 CronJob
则就是在 Job
的基础上加了时间调度。
我们用Job
这个资源对象来创建一个任务,我们定一个Job
来执行一个倒计时的任务,定义YAML
文件:
apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: metadata: name: job-demo spec: restartPolicy: Never containers: - name: counter image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox command: - 'sh' - '-c' - 'for i in `seq 10 -1 1`;do echo $i;done'
# kubectl create -f job-demo.yaml # kubectl get job NAME COMPLETIONS DURATION AGE job-demo 1/1 2s 3m7s # kubectl logs job-demo-q4bb4 10 9 8 7 6 5 4 3 2 1 # kubectl get pods NAME READY STATUS RESTARTS AGE job-demo-q4bb4 0/1 Completed 0 13s
注意Job
的RestartPolicy
仅支持Never
和OnFailure
两种,不支持Always
,我们知道Job
就相当于来执行一个批处理任务,执行完就结束了
三、CronJob
CronJob
其实就是在Job
的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux
中的crontab
就非常类似了。
一个CronJob
对象其实就对应中crontab
文件中的一行,它根据配置的时间格式周期性地运行一个Job
,格式和crontab
也是一样的。
CronJob
格式如下:
分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
定义一个cronjob-demo.yaml文件
apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob-demo spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: hello image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox args: - 'sh' - '-c' - 'date; echo Hello from Kubernetes Cluster'
# kubectl apply -f cronjob-demo.yaml cronjob.batch/cronjob-demo created # kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob-demo */1 * * * * False 0 <none> 10s # kubectl logs cronjob-demo-1593575520-p9979 Wed Jul 1 03:52:15 UTC 2020 Hello from Kubernetes Cluster # kubectl get pods NAME READY STATUS RESTARTS AGE cronjob-demo-1593575520-p9979 0/1 Completed 0 103s cronjob-demo-1593575580-vkv8q 0/1 Completed 0 51s
我们这里的Kind
是CronJob
了,要注意的是.spec.schedule
字段是必须填写的,用来指定任务运行的周期,格式就和crontab
一样,另外一个字段是.spec.jobTemplate
, 用来指定需要运行的任务,格式当然和Job
是一致的。
# 删除 jobs # kubectl get job NAME COMPLETIONS DURATION AGE cronjob-demo-1593575520 1/1 8s 3m2s cronjob-demo-1593575580 1/1 2s 2m10s cronjob-demo-1593575640 1/1 3s 70s cronjob-demo-1593575700 1/1 3s 10s # kubectl delete jobs --all job.batch "cronjob-demo-1593575580" deleted job.batch "cronjob-demo-1593575640" deleted job.batch "cronjob-demo-1593575700" deleted