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:
Job类型 | 使用示例 | 行为 | completions | Parallelism |
一次性Job | 数据库迁移 | 创建一个Pod直至其成功结束 | 1 | 1 |
固定 结束次数 的Job | 处理工作队列的Pod | 依次创建一个Pod运行直至completions个成功结束 | 2+ | 1 |
固定结束次数的并行Job | 多个Pod同时处理工作队列 | 依次创建多个Pod运行直至completions个成功结束 | 2+ | 2+ |
并行Job | 多个Pod同时处理工作队列 | 创建一个或多个Pod直至有一个成功结束 | 1 | 2+ |
Job Controller
Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。

Job Spec格式
- spec.template格式同 Pod
- RestartPolicy仅支持Never或OnFailure
- 单个Pod时,默认Pod成功运行后Job即结束
- . spec.completions 标志Job结束需要成功运行的Pod个数,默认为1
- .spec.parallelism标志并行运行的Pod的个数,默认为1
- spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试
一个简单的例子: apiVersion : batch / v1 kind : Job metadata : name : pi spec : template : metadata : name : pi spec : containers : - name : pi image : perl command : [ "perl" , "-Mbignum=bpi" , "-wle" , "print bpi(2000)" ] restartPolicy : Never $ kubectl create - f ./ job . yaml job "pi" created $ pods = $ ( kubectl get pods -- selector = job - name = pi -- output = jsonpath ={. items .. metadata . name }) $ kubectl logs $pods 3.141592653589793238462643383279502 ... 固定结束次数的Job示例 apiVersion : batch / v1 kind : Job metadata : name : busybox spec : completions : 3 template : metadata : name : busybox spec : containers : - name : busybox image : busybox command : [ "echo" , "hello" ] restartPolicy : Never
Bare Pods
所谓Bare Pods是指直接用 PodSpec来创建的Pod ( 即不在ReplicaSets或者ReplicationCtroller的管理之下的Pods )。这些Pod在Node重启后不会自动重启,但Job则会创建新的Pod继续任务。所以,推荐使用Job来替代Bare Pods,即便是应用只需要一个Pod。
参考文档
- Jobs – Run to Completion
- https://feisky.gitbooks.io/kubernetes/concepts/job.html