Job介绍
Job负责编排运行有结束时间的“一次性”任务,而前面的Deployment和DaemonSet主要负责编排始终运行的守护进程类应用;
- 控制器要确保Pod内的进程“正常(成功完成任务)”地退出
- 非正常退出的Pod可以根据需要重启,并在重试一定的次数后终止
- 有些Job是单次任务,也有些Job需要运行多次(次数通常固定)
- 有些任务支持同时创建及并行运行多个Pod以加快任务处理速度,Job控制器还允许用户自定义其并行度
需要周期性运行的Job,则由CronJob控制器负责编排
- CronJob建立在Job的功能之上,是更高层级的控制器
- 它以Job控制器完成单批次的任务编排,而后为这种Job作业提供需要运行的周期定义
Job资源规范
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> # 作业启动后可处于活动状态的时长;
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
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 60"]
restartPolicy: Never
completions: 2
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 300
Job的状态
kubectl get jobs
~$ kubectl get jobs job-demo
NAME COMPLETIONS DURATION AGE
job-demo 1/3 58s 58s
~$ kubectl get pods -l job-name=job-demo
NAME READY STATUS RESTARTS AGE
job-demo--1-4vds6 1/1 Running 0 5s
job-demo--1-5xd5s 0/1 Completed 0 44s
状态描述(示例集群中共有两个工作节点):
COMPLETIONS:已经正常完成任务并退出的Pod数量
DURATION:Job业务的实际运行时长
AGE:Job资源创建后的时长
kubectl describe jobs
kubectl describe jobs job-demo
并行式Job
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 60"]
restartPolicy: Never
completions: 12
parallelism: 2
ttlSecondsAfterFinished: 3600
backoffLimit: 3
activeDeadlineSeconds: 1200
Job对象能够支持多个Pod的可靠、并发执行
- 编排彼此间相互通信的并行进程并非Job的设计目标,它仅用于支撑一组相互独立而又有所关联的工作任务的并行处理 -常见的场景,有如发送电子邮件、渲染视频帧、编解码文件、NoSQL数据库中扫描主键范围等
并行式Job的关键配置参数
- parallelism:任务并行度,即最大可同行运行的Pod数量,可以将其理解为工作队列的数量
- completions:总共需要完成的任务数量,即总共需要多少个相关的Pod成功完成执行,通常要大于parallelism的值
CronJob
- CronJob控制器用于管理Job资源的运行时间,它允许用户在特定的时间或以指定的间隔运行Job
- CronJob控制器的功能类似于linux操作系统的周期性任务作业计划(crontab),用于控制作业运行的时间点及周期性运行的方式:
- 仅在未来某时间点将指定的作业运行一次
- 在指定的周期性时间点重复运行指定的作业
- CronJob资源也是标准的API资源类型
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;
注意: 在CronJob中,通配符“?”和“*”的意义相同,它们都表示任何可用的有效值
yaml示例
schedule: "*/2 * * * *" # 分钟 小时 日 月 周
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
namespace: default
spec:
schedule: "*/2 * * * *"
jobTemplate:
metadata:
labels:
controller: cronjob-demo
spec:
parallelism: 1
completions: 1
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