20Job和CronJob

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20Job和CronJob相关的知识,希望对你有一定的参考价值。

Job和CronJob编排作业级应用

Job

Job控制器的应用编排机制
如果说daemoset和deployment主要负责编排始终运行的守护进程类应用;而Job则是负责编排运行有结束时间的“一次性”任务。
◼ 控制器要确保Pod内的进程“正常(成功完成任务)”地退出
◼ 非正常退出的Pod可以根据需要重启,并在重试一次的次数后终止
◼ 有些Job是单次任务,也有些Job需要运行多次(次数通常固定)
◼ 有些任务支持同时创建及并行运行多个Pod以加快任务处理速度,Job控制器还允许用户自定义其并行度

需要周期性运行的Job,则由CronJob控制器负责编排
◼ CronJob建立在Job的功能之上,是更高层级的控制器
◼ 它以Job控制器完成单批次的任务编排,而后为这种Job作业提供需要运行的周期定义
Job资源规范
Job资源同样需要标签选择器和Pod模板,但它不需要指定replicas,而是应该给定completions,即需要完成的作业次数,默认为1次;
◼ Job资源会为其Pod对象自动添加“job-name=JOB_NAME”和“controller-uid=UID”标签,并使用标签选择器完成对controller-uid标签的关联,因此,selector并非必选字段
◼ Pod的命名格式:`$(job-name)-$(index)-$(random-string),其中的$(index)字段取值与completions和completionMode有关

◼ 注意
◆ Job资源所在群组为“batch/v1”
◆ Job资源中,Pod的RestartPolicy的取值只能为Never或OnFailure

资源范例各自段解释
apiVersion: batch/v1 #API群组及版本;
kind: Job #资源类型特有标识;
metadata:
name <string> #资源名称,在作用域中要惟一;
namespace <string> #名称空间;Job资源隶属名称空间级别;
spec:
selector <object> #标签选择器,必须匹配template字段中Pod模板中的标签;
suspend <boolean> #是否挂起当前Job的执行,挂起作业会重置StartTime字段的值;
template <object> #Pod模板对象;
completions <integer> #期望的成功完成的作业次数,成功运行结束的Pod数量;
completionMode <string> #追踪Pod完成的模式,支持Indexed排序和NonIndexed默认乱序两种
ttlSecondsAfterFinished <integer> #终止状态作业的生存时长,超期将被删除;
parallelism <integer> #作业的最大并行度,默认为1;
backoffLimit <integer> #将作业标记为“Failed”之前的重试次数,默认为6;
activeDeadlineSeconds <integer> #作业启动后可处于活动状态的时长;


示例:
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
spec:
containers:
- name: myjob
image: ikubernetes/admin-box:v1.0 #基于这个镜像
imagePullPolicy: IfNotPresent #运行命令只是sleep30s,就意味着sleep
command: ["/bin/sh", "-c", "sleep 30"] 30s,容器就终止了,pod也将终止,模拟只
restartPolicy: Never 运行一段时间,就正常退出的一个作业
completions: 3 #定义为运行3次
ttlSecondsAfterFinished: 3600 #保留时长1小时
backoffLimit: 3 #最大重试次数,三次
activeDeadlineSeconds: 300 #如果300s没退出,就异常了,强行终止pod
实际案例(串行Job)
[root@K8s-master01 chapter8]#cat job-demo.yaml 
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
spec:
containers:
- name: myjob
image: ikubernetes/admin-box:v1.2
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 20"]
restartPolicy: Never
completions: 3
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 300

查看带有标签的pod
[root@K8s-master01 chapter8]#kubectl get pods --show-labels
job-demo-8nrxj 1/1 Running 0 7s controller-uid=7e4aafa6-5b1b-4907-ad07-b233429f12d0,job-name=job-demo

并根据标签选择只看job的信息,让其处于监视状态
[root@K8s-master01 chapter8]#kubectl get pods -l job-name=job-demo -w

查看job,发现job已完成3次
[root@K8s-master01 chapter8]#kubectl get job
NAME COMPLETIONS DURATION AGE
job-demo 3/3 75s 4m19s


[root@K8s-master01 chapter8]#kubectl discribe pod
查看job的详细信息,如果出错,可查看出错的信息
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 7m36s job-controller Created pod: job-demo-gx22b
Normal SuccessfulCreate 7m10s job-controller Created pod: job-demo-sqmx5
Normal SuccessfulCreate 6m45s job-controller Created pod: job-demo-j5bjg
Normal Completed 6m21s job-controller Job completed
并行Job,只需再job上加parallelism字段
Job对象能够支持多个Pod的可靠、并发执行
◼ 编排彼此间相互通信的并行进程并非Job的设计目标,它仅用于支撑一组相互独立而又有所关联的工作任务的并行处理
◼ 常见的场景,有如发送电子邮件、渲染视频帧、编解码文件、NoSQL数据库中扫描主键范围等

并行式Job的关键配置参数
◼ parallelism:任务并行度,即最大可同行运行的Pod数量,可以将其理解为工作队列的数量
◼ completions:总共需要完成的任务数量,即总共需要多少个相关的Pod成功完成执行,通常要大于parallelism的值


apiVersion: batch/v1
kind: Job
metadata:
name: para-job-demo
spec:
template:
spec:
containers:
- name: myjob
image: ikubernetes/admin-box:v1.0 #基于这个镜像
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 30"] #运行命令只是sleep30s,就意味着sleep
restartPolicy: OnFailure 30s,容器就终止了,pod也将终止,模拟只
completions: 7 #完成的次数 运行一段时间,就正常退出的一个作业
parallelism: 2 #并行数,要小于等于完成数
completionMode: Indexed #是否对完成的作业做索引标示
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 1200
实际案例(并行Job)
[root@K8s-master01 chapter8]#cat job-para-demo.yaml 
apiVersion: batch/v1
kind: Job
metadata:
name: job-para-demo
spec:
template:
spec:
containers:
- name: myjob
image: ikubernetes/admin-box:v1.2
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never
completions: 7
completionMode: Indexed
parallelism: 2
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 1200

创建并查看pod
[root@K8s-master01 chapter8]#kubectl apply -f job-para-demo.yaml
job.batch/job-para-demo created

查看pod的标签
[root@K8s-master01 chapter8]#kubectl get pods --show-labels

监视符合条件的pod
[root@K8s-master01 chapter8]#kubectl get pods -l job-name=job-para-demo -w

查看job的完成状态
^C[root@K8s-master01 chapter8]#kubectl get job
NAME COMPLETIONS DURATION AGE
job-demo 3/3 75s 23m
job-para-demo 7/7 61s 4m32s

CronJob

CronJob控制器用于管理Job资源的运行时间,它允许用户在特定的时间或以指定的间隔运行Job

CronJob控制器的功能类似于linux操作系统的周期性任务作业计划(crontab),用于控制作业运行的时
间点及周期性运行的方式:

◼ 仅在未来某时间点将指定的作业运行一次
◼ 在指定的周期性时间点重复运行指定的作业

CronJob资源也是标准的API资源类型
注意:
◼ 在CronJob中,通配符“?”和“*”的意义相同,它们都表示任何可用的有效值


apiVersion: batch/v1 #API群组及版本;
kind: CronJob #资源类型特有标识;
metadata:
name <string> #资源名称,在作用域中要惟一;
namespace <string> #名称空间;CronJob资源隶属名称空间级别;
spec:
jobTemplate <Object> #job作业模板,必选字段;
metadata <object> #模板元数据;
spec <object> #作业的期望状态;
schedule <string> #调度时间设定,必选字段;
concurrencyPolicy <string> #并发策略,可用值有Allow、Forbid和Replace;
failedJobsHistoryLimit <integer> #失败作业的历史记录数,默认为1;
successfulJobsHistoryLimit <integer> #成功作业的历史记录数,默认为3;
startingDeadlineSeconds <integer> #因错过时间点而未执行的作业的可超期时长;
suspend <boolean> #是否挂起后续的作业,不影响当前作业,默认为false
实际案例
[root@K8s-master01 chapter8]#cat cronjob-demo.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
namespace: default
spec:
schedule: "*/2 * * * *"
jobTemplate:
metadata:
labels:
controller: cronjob-demo
spec:
parallelism: 2
completions: 2
ttlSecondsAfterFinished: 600
backoffLimit: 3
activeDeadlineSeconds: 60
template:
spec:
containers:
- name: myjob
image: ikubernetes/admin-box:v1.2
command:
- /bin/sh
- -c
- date; echo Hello from CronJob, sleep a while...; sleep 10
restartPolicy: OnFailure
startingDeadlineSeconds: 300

运行pod
[root@K8s-master01 chapter8]#kubectl apply -f cronjob-demo.yaml
cronjob.batch/cronjob-demo created
查看cronjob
[root@K8s-master01 chapter8]#kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */2 * * * * False 0 64s 76s

删除时间计划任务
[root@K8s-master01 chapter8]#kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */2 * * * * False 0 28s 4m40s
[root@K8s-master01 chapter8]#kubectl delete cronjob cronjob-demo
cronjob.batch "cronjob-demo" deleted

以上是关于20Job和CronJob的主要内容,如果未能解决你的问题,请参考以下文章

k8s的 Job/CronJob资源对象及添加api版本

定时执行 Job - 每天5分钟玩转 Docker 容器技术(135)

k8s 实践经验job && CronJob

Kubernetes中的Job(工作计划)&amp;amp;CronJob(定时工作计划)Demo+实战

19-Kubernetes-Pod控制器详解-CronJob(CJ)

k8s使用job和cronjob控制器管理pod