上次一起学习了Pod自动伸缩的方法,使用到了HPA这个资源对象。任务Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在Kubernetes集群中为我们提供了Job和CronJob两种资源对象来。任务的作用也是为了自动化处理,解放双手的。
(一)JOB 和 Cron Job
- ① 背景
我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作。
- ② 介绍
当使用的 Kubernetes 集群,版本 >= 1.4(对 ScheduledJob),>= 1.5(对 CronJob),当启动 API Server时,通过传递选项
--runtime-config=batch/v2alpha1=true
可以开启 batch/v2alpha1 API。 无论是job还是CronJob,执行时都产生一个pod,然后在里面运行给定的命令。要执行自己的任务,需要一个自己的Docker镜像和yaml格式的job描述文件。执行环境是容器隔离的,外部存储可以通过pvc/pv等挂载进去,与pod配置参数完全一致。
- ③ 区别
Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。而CronJob则就是在Job上加上了时间调度。
(二)Job
- ① API地址
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#job-v1-batch
- ① 代码演示
---apiVersion: batch/v1kind: Jobmetadata: name: demo-jobspec: template: metadata: name: demo-job spec: restartPolicy: Never containers: - name: counter image: busybox command: - "bin/sh" - "-c" - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
代码语言:javascript复制Job的RestartPolicy仅支持Never和OnFailure两种,执行完就结束,如果使用always任务执行完就重启,这样就不停的执行,不符合任务的特性。
cd ~mkdir jobcd job/vi job-demo.yaml
- ③ 代码运行,查看详情
kubectl apply -f job-demo.yamlkubectl get jobskubectl describe jobs demo-job
代码语言:javascript复制kubectl get podskubectl logs demo-job-xs8z4
job任务的pod,运行完毕后只有completed这种状态。打印了之前执行的脚本从9到1
- ④ dashboard查看
(三)CronJob
- ① 介绍
在给定时间点只运行一次。周期性地在给定时间点运行。这个实际上和Linux中的crontab就非常类似了。
- ②crontab的格式
第1列分钟0~59 第2列小时0~23 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
- ③ api
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#cronjob-v1beta1-batch
- ④ 源码编写
代码语言:javascript复制.spec.schedule:调度,必需字段,指定任务运行周期 .spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务
---apiVersion: batch/v1beta1kind: CronJobmetadata: name: demo-cronjobspec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: hello image: busybox args: - "bin/sh" - "-c" - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
代码语言:javascript复制编写
vi demo-cronjob.yaml
- ⑤ 代码运行,查看详情
kubectl apply -f demo-cronjob.yamlkubectl get cronjobkubectl get jobkubectl get podskubectl get jobs
当定时器还没执行完的时候jobs里面没有,等定时任务执行完后,在get jobs 里面才有。目前设置的每一分钟执行一个job,这个job会不断的增加。
像这种情况一分钟增加一个,这样很快硬盘就爆掉了,所以在yaml里面需要增加一个历史记录的限制。关注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。成功历史条数,失败历史条数。
- ⑤ 删除定时job
代码语言:javascript复制当删除定时job后,里面的jobs也被删除了。
kubectl get cronjobskubectl delete cronjobs demo-cronjobkubectl get cronjobskubectl get jobs
- ⑥ dashboard
PS:当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。CronJob的时间一定要控制好,设置好成功和失败,我的实例代码没写,但是在升成中务必添加。