Job 和 Cronjob 的使用
我们来介绍另外一类资源对象:Job,在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的Kubernetes 集群中为我们提供了Job 和CronJob两种资源对象来应对我们的这种需求。
Job 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod 成功结束。而CronJob则就是在Job 上加上了时间调度。
一次性任务Job
我们用Job 这个资源对象来创建一个任务,定一个Job 来执行一个倒计时的任务
[root@k8s-master ~]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec: #此字段下可以添加下方详细控制内容
completions: 6
parallelism: 2
#上面配置的含义是:每次运行两个Pod,直到总共有6个Pod成功完成
template:
metadata:
name: job-demo
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"
注意Job 的RestartPolicy(重启策略) 仅支持Never(永不重启)和OnFailure (失败退出后重启)两种,不支持Always(一直重启) ,我们知道Job 就相当于来执行一个批处理任务,执行完就结束了,如果支持Always 的话是不是就陷入了死循环了?
详细配置内容
spec:
completions: 50 # 运行的次数,即Job结束需要成功运行的Pod个数
parallelism: 5 # 并行运行Pod的数量,默认为1
backoffLimit: 5 # 表示失败Pod的重试最大次数,超过这个次数不会继续重试。
activeDeadlineSeconds: 10 # 表示Pod超期时间,一旦达到这个时间,Job及其所有的Pod都会停止。
template: # Pod定义
根据completions和parallelism的设置,可以将Job划分为以下几种类型。
任务类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5nygprN-1628235203436)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210302173213763.png)]
然后我们可以查看当前的Job 资源对象:
[root@k8s-master ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job-demo 1/1 3s 23s
#COMPLETIONS:已完成
#DURATION:持续时间
注意查看我们的Pod 的状态,同样我们可以通过kubectl logs 来查看当前任务的执行结果
[root@k8s-master ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
job-demo-s65mr 0/1 Completed 0 41s
# READY:就绪的
#STATUS:当前状态 Completed:已经完成
[root@k8s-master ~]# kubectl logs job-demo-s65mr
[root@k8s-master ~]# kubectl describe jobs.batch job-demo
周期性计划任务CronJob
CronJob其实就是在Job 的基础上加上了时间调度,我们可以:在给定的
时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和
我们Linux中的crontab就非常类似了。
一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job ,格式和crontab也是一样的。
crontab的格式如下:
格式为分 时 日 月 星期 要运行的命令 | |
---|---|
分钟 | 第1列分钟0~59 |
小时 | 第2列小时0~23) |
日 | 第3列日1~31 |
月 | 第4列月1~12 |
周 | 第5列星期0~7(0和7表示星期天) |
运行的命令 | 第6列要运行的命令 |
现在,我们用CronJob来管理我们上面的Job 任务。
编写yaml文件
[root@k8s-master ~]# vim cronjob-demo.yaml
[root@k8s-master ~]# cat cronjob-demo.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
#指定什么时候运行Job,其格式与Linux cron一致。这里*/1 * * * *的含义是每一分钟启动一次
failedJobsHistoryLimit: 1 #保留失败的任务个数
successfulJobsHistoryLimit: 2 #保留成功的任务个数
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
securityContext: #上下文
privileged: true #特权容器
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
这里的Kind是CronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate , 用来指定需要运行的任务,格式当然和Job 是一致的。还有一些值得关注的字段.spec.successfulJobsHistoryLimit 和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job ,默认没有限制,所有成功和失败的Job 都会被保留。然而,当运行一个Cron Job时,Job 可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job 完成后将不会被保留。
创建这个cronjob
[root@k8s-master ~]# kubectl create -f cronjob-demo.yaml
cronjob.batch/cronjob-demo created
查看这个CronJob:
[root@k8s-master ~]# kubectl get cronjobs.batch -o wide
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE CONTAINERS IMAGES SELECTOR
cronjob-demo */1 * * * * False 0 <none> 39s hello busybox <none>
命令结果的显示:
#SCHEDULE:是指其调度的时间点
#SUSPEND:表示后续任务是否处于挂起状态,即暂停任务的调度和运行
#ACTIVE:表示活动状态的Job对象的数量
#LAST SCHEDULE:表示上次调度运行至此刻的时长
可以通过命令进行查看
[root@k8s-master ~]# kubectl get jobs
#一旦不再需要 Cron Job,可以使用 kubectl 命令删除它
[root@k8s-master ~]# kubectl delete -f cronjob-demo.yaml
cronjob.batch "cronjob-demo" deleted
#相应的,生成的 job 也会被删除
[root@k8s-master ~]# kubectl get jobs