k8sJob控制器
Job控制器用于调度pod对象运行一次性任务(批处理脚本),容器中的进程在正常运行结束后不会重启,而是将pod对象置于completed状态,若容器中的进程因错误而终止,会根据配置确定是否重启,而未运行完成的pod对象因其所在的节点故障而意外终止后会被重新调度,Job的本质是确保一个或多个Pod健康地运行直至运行完毕
工作中有的作业肯需要运行多次,用户可以采用串行和并行的方式:
单工作队列的串行式job:以多个一次性的作业方式串行执行多次作业,直至满足期望的次数
多工作队列的并行式job:可以设置工作队列数(作业数),每个队列仅负责运行一个作业
串行job示例
apiVersion:batch/v1
kind: job
metadata:
name: job-example
spec:
template:
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 120"]
restartPolicy: Never
注意:Pod重启策略默认为Always,对于job来说并不适用,需要重新设定Never或OnFailure
并行job示例
apiVersion: batch/v1
kind: job
metadata:
name: job-multi
spec:
completions: 5
简单说即job结束需要成功运行的pod次数
parallelism: 2
简单说即job并行运行的pod数
backoffLimit: 5
activeDeadlineSeconds: 100
注:可选的持续时间(以秒为单位)
template:
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 120"]
restartPolicy: OnFailure
并行作业
适合作为作业运行的三种主要任务类型:
- 非并行作业
通常,除非Pod发生故障,否则仅启动一个Pod。一旦Pod成功终止,作业即完成
- 固定完成计数的并行作业:
1、为指定非零的正值.spec.completions
2、Job代表整体任务,并且在1到范围内的每个值都有一个成功的Pod时完成.spec.completions
3、尚未实现:每个Pod传递了1到范围内的不同索引.spec.completions
- 具有工作队列的并行作业:
1、不指定.spec.completions,默认为.spec.parallelism
2、Pod必须在彼此之间或外部服务之间进行协调,以确定每个Pod应该如何处理。如:一个Pod可以从工作队列中获取最多N批的批处理
3、每个Pod都可以独立地确定其所有对等方是否都已完成,从而确定了整个Job,当作业中的任何 Pod成功终止时,不会创建新的Pod
4、至少一个Pod成功终止(所有Pod都终止),则作业成功完成
5、Pod成功退出,则其他Pod仍不应为此任务做任何工作或编写任何输出。他们都应该退出
对于非平行作业,可以不使用.spec.completions和.spec.parallelism,而两者均未设置时,均默认为1。
对于固定完成计数作业,应该设置.spec.completions为所需的完成数量,可以设置.spec.parallelism也可以不设置(默认为1)
注意:对于工作队列 Job,您必须保持未.spec.completions设置状态,并将其设置.spec.parallelism为非负整数
控制并行
可以将请求的并行度(.spec.parallelism)设置为任何非负值。如果未指定,则默认为1。如果将其指定为0,则作业将有效地暂停直到增加
出于多种原因,实际的并行性(随时运行的Pod数量)可能大于或小于请求的并行性:
- 对于固定的完成计数作业,并行运行的吊舱的实际数量不会超过剩余的完成数量。.spec.parallelism有效地忽略的较高值。
- 对于工作队列作业,任何Pod成功后都不会启动新的Pod 但是,其余Pod则可以完成。
- 如果作业控制器是还没来得及反应。
- 如果作业控制器由于任何原因(缺少ResourceQuota,缺少权限等)未能创建Pod,则可能是Pod少于请求的数量。
- 作业控制器可能会由于同一作业中先前的过多Pod故障而限制新Pod的创建。
- 如果Pod正常关闭,则需要花费一些时间才能停止。
Pod后退策略
在某些情况下,由于配置中的逻辑错误等原因,您需要在重试一定次数后使作业失败。为此,请设置.spec.backoffLimit为指定重试次数,然后再将作业视为失败。默认情况下,将退避限制设置为6。与作业相关联的失败Pod由Job控制器重新创建,且其指数退避延迟(10s,20s,40s…)限制为六分钟。如果在作业的下一个状态检查之前没有出现新的失败Pod,则会重置退避计数。
注意:版本1.12之前的Kubernetes版本仍然存在问题#54870
注意:如果作业具有restartPolicy = "OnFailure",请记住,一旦达到作业退避限制,运行作业的容器将被终止。这会使调试作业的可执行文件更加困难。我们建议restartPolicy = "Never"在调试作业或使用日志记录系统时进行设置 ,以确保不会因疏忽而丢失失败的作业的输出
扩容和缩容
job控制器的spec.parallelism定义的并行度表示同时运行的pod对象数,此属性值支持运行时调整从而改变其队列总数,实现扩容和缩容
后续高级请看官网文档,以上部分内容出自官方文档
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/