四、Job 控制器
4.1 Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。
Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
Kubernetes支持以下几种Job:
- 非并行Job:通常创建一个Pod直至其成功结束
- 固定结束次数的Job:设置.spec.completions,创建多个Pod,直到.spec.completions个Pod成功结束
- 带有工作队列的并行Job:设置.spec.Parallelism但不设置.spec.completions,当所有Pod结束并且至少一个成功时,Job就认为是成功
根据.spec.completions和.spec.Parallelism的设置,可以将Job划分为以下几种pattern:
4.2 一次性Job的创建
Job控制器的spec字段内嵌的必要字段仅为template,它的使用方式与Deployment等控制器并无不同。Job会为其Pod对象自动添加“job-name=JOB_NAME”和“controller-uid=UID”标签,并使用标签选择器完成对controller-uid标签的关联。需要注意的是,Job位于API群组“batch/v1”之内.
定义了一个Job控制器:
Pod模板中的spec.restartPolicy默认为“Always”,这对Job控制器来说并不适用,因此必须在Pod模板中显式设定restartPolicy属性的值为“Never”或“OnFailure”
kubectl apply -f job-example.yaml
两分钟后,待sleep命令执行完成并成功退出后,Pod资源即转换为Completed状态,completions也从0/1变为1/1
并行式Job
spec.parallelism的值设置为1,并设置总任务数.spec.completion属性便能够让Job控制器以串行方式运行多任务。
串行运行5次任务的Job控制器示例:
Job扩容
- Job控制器的.spec.parallelism定义的并行度表示同时运行的Pod对象数,此属性值支持运行时调整从而改变其队列总数,实现扩容和缩容。
- 例如在其运行过程中(未完成之前)将job-multi的并行度扩展为三路:
$ kubectl scale jobs job-multi --replicas=3
- 执行命令后可以看到,其同时运行的Pod对象副本数量立即扩展到了三个:
$ kubectl get pods -l job-name=job-multi
删除Job
- Job控制器待其Pod资源运行完成后,将不再占用系统资源。用户可按需保留或使用资源删除命令将其删除。不过,如果某Job控制器的容器应用总是无法正常结束运行,而其restartPolicy又定为了重启,则它可能会一直处于不停地重启和错误的循环当中。所幸的是,Job控制器提供了两个属性用于抑制这种情况的发生,具体如下。
- spec.activeDeadlineSeconds <integer>:Job的deadline,用于为其指定最大活动时间长度,超出此时长的作业将被终止。
- spec.backoffLimit <integer>:将作业标记为失败状态之前的重试次数,默认值为6。
- 例如,下面的配置片断表示其失败重试的次数为5,并且如果超出100秒的时间仍未运行完成,那么其将被终止:
spec: backoffLimit: 5 activeDeadlineSeconds: 100