赞
踩
Kubernetes从1.2版本开始支持批处理类型的应用,我们可以通过Kubernetes Job资源对象来定义并启动一个批处理任务。
批处理任务通常 并行(或者串行) 启动多个计算进程去处理一批工作项(work item),处理完成后,整个批处理任务结束。
按照批处理任务实现方式的不同,批处理任务可以分为以下的几种模式:
Job Template Expansion模式:
一个Job对象对应一个待处理的Work item,有几个Work item就产生几个独立的Job。
通常适合Work item数量少、每个Work item要处理的数据量比较大的场景。
比如有一个100GB的文件作为一个Work item,总共有10个文件需要处理。
Queue with Pod Per Work Item模式:
采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item。
在这种模式下,Job会启动N个Pod,每个Pod都对应一个Work item。
Queue with Variable Pod Count模式:
也是采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item。
但与上面的模式不同,Job启动的Pod数量是可变的。
还有一种被称为Single Job with Static Work Assignment的模式,也是一个Job产生多个Pod,但它采用程序静态方式分配任务项,而不是采用队列模式进行动态分配。
考虑到批处理的并行问题,Kubernetes将Job分以下三种类型。
由于在这种模式下每个Work item对应一个Job实例,所以这种模式首先定义一个Job模板,模板里的主要参数是Work item的标识,因为每个Job都处理不同的Work item。
如下所示的Job模板(文件名为job.yaml.txt)中的$ITEM可以作为任务项的标识:
[root@bogon ~]# vim job.yaml.txt apiVersion: batch/v1 kind: Job metadata: name: process-item-$ITEM labels: jobgroup: jobexample spec: template: metadata: name: jobexample labels: jobgroup: jobexample spec: containers: - name: c image: busybox command: ["sh", "-c", "echo Processing item $ITEM && sleep 5"] restartPolicy: Never
生成三个job.yaml
mkdir jobs
for i in apple banana cherry ;do cat job.yaml.txt |sed "s/\$ITEM/$i/" > jobs/job-$i.yaml ;done
[root@bogon ~]# kubectl create -f jobs
job.batch/process-item-apple created
job.batch/process-item-banana created
job.batch/process-item-cherry created
查看job的运行情况
[root@bogon ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
process-item-apple 1/1 2m27s 3m32s
process-item-banana 1/1 44s 3m32s
process-item-cherry 1/1 2m46s 3m31s
在这种模式下需要一个任务队列存放Work item,比如RabbitMQ,客户端程序先把要处理的任务变成Work item放入任务队列,然后编写Worker程序、打包镜像并定义成为Job中的Work Pod。
Worker程序的实现逻辑是从任务队列中拉取一个Work item并处理,在处理完成后即结束进程。
并行度为2的Demo示意图
由于这种模式下,Worker程序需要知道队列中是否还有等待处理的Work item,如果有就取出来处理,否则就认为所有工作完成并结束进程,所以任务队列通常要采用Redis或者数据库来实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。