当前位置:   article > 正文

Kubernetes jobs:使用模版进行并行处理

yaml job 并行任务

Kubernetes job并行处理,使用模版展开

在这个例子里,我们将运行多个Kubernetes Jobs,配置文件从同一个模版展开,然后创建多个jobs任务。

你需要首先了解 Jobs 的用法。

基本Template展开

首先,下载job的模版,文件名为 job-tmpl.yaml

application/job/job-tmpl.yaml
  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: process-item-$ITEM
  5. labels:
  6. jobgroup: jobexample
  7. spec:
  8. template:
  9. metadata:
  10. name: jobexample
  11. labels:
  12. jobgroup: jobexample
  13. spec:
  14. containers:
  15. - name: c
  16. image: busybox
  17. command: ["sh", "-c", "echo Processing item $ITEM && sleep 5"]
  18. restartPolicy: Never

pod template不同,我们的 job template不是Kubernetes API 的样子。这是 yaml格式的Job object 代表,同时里面有一些占位符,在后面进行填充,这里的$ITEM 占位符语法对 Kubernetes 来说是没有意义的。

这个例子中,容器唯一的处理只是 echo 一个字符串然后 sleep 一会儿。在真实场景下,处理可能是一个耗时的计算,如渲染一个电影或处理数据库里的一部分数据。这里 $ITEM 参数可用于指示帧数或者数据的行列数。

该 Job 和它的 Pod 模版有一个label: jobgroup=jobexample. 这对于系统没有什么特殊的意义,只是操作所有的job时作为一个组更为方便。我们将该标签放到所有的 pod template, 就可以使用单个命令检查所有与该job相关的Pods 。当job创建后,系统会加入更多的标签,以将Job的pod与其它的区分开来。注意,这个 label key jobgroup 对 Kubernetes没有特殊意义,你也可以使用自己的标签机制。

下一步,扩展template为多个文件,每一个 item 将被处理。如下所示:

  1. # Expand files into a temporary directory
  2. $ mkdir ./jobs
  3. $ for i in apple banana cherry
  4. do
  5. cat job-tmpl.yaml | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml
  6. done

检查一下结果:

  1. $ ls jobs/
  2. job-apple.yaml
  3. job-banana.yaml
  4. job-cherry.yaml

这里,我们使用sed 替换了字符串 $ITEM,通过循环变量进行。 你可以使用任何template 语言 (jinja2, erb) 或者写一段代码来创建这个Job对象。

下一步,使用kubectl 命令创建所有的jobs对象,如下:

  1. $ kubectl create -f ./jobs
  2. job "process-item-apple" created
  3. job "process-item-banana" created
  4. job "process-item-cherry" created

检查所有的jobs状态:

  1. $ kubectl get jobs -l jobgroup=jobexample
  2. NAME DESIRED SUCCESSFUL AGE
  3. process-item-apple 1 1 31s
  4. process-item-banana 1 1 31s
  5. process-item-cherry 1 1 31s

使用 -l 选项来选中jobs组中的所有对象 (There might be other unrelated jobs in the system that we do not care to see.)

检查同一组标签的pods:

  1. $ kubectl get pods -l jobgroup=jobexample
  2. NAME READY STATUS RESTARTS AGE
  3. process-item-apple-kixwv 0/1 Completed 0 4m
  4. process-item-banana-wrsf7 0/1 Completed 0 4m
  5. process-item-cherry-dnfu9 0/1 Completed 0 4m

没有一个单个命令可以看到所有jobs的输出,通过循环来做也不难,如下:

  1. $ for p in $(kubectl get pods -l jobgroup=jobexample -o name)
  2. do
  3. kubectl logs $p
  4. done
  5. Processing item apple
  6. Processing item banana
  7. Processing item cherry

多个Template参数

在上面的例子中,模版使用了单一参数,而且作为label。 但是 label keys 有一定的限制,参见 what characters they can contain.

稍微复杂一点的例子,使用 jinja2 template 语言来创建我们的job objects。使用单行的python script转换template到文件。

首先, 拷贝、粘贴下列Job object到文件名为 job.yaml.jinja2

  1. {%- set params = [{ "name": "apple", "url": "http://www.orangepippin.com/apples", },
  2. { "name": "banana", "url": "https://en.wikipedia.org/wiki/Banana", },
  3. { "name": "raspberry", "url": "https://www.raspberrypi.org/" }]
  4. %}
  5. {%- for p in params %}
  6. {%- set name = p["name"] %}
  7. {%- set url = p["url"] %}
  8. apiVersion: batch/v1
  9. kind: Job
  10. metadata:
  11. name: jobexample-{{ name }}
  12. labels:
  13. jobgroup: jobexample
  14. spec:
  15. template:
  16. metadata:
  17. name: jobexample
  18. labels:
  19. jobgroup: jobexample
  20. spec:
  21. containers:
  22. - name: c
  23. image: busybox
  24. command: ["sh", "-c", "echo Processing URL {{ url }} && sleep 5"]
  25. restartPolicy: Never
  26. ---
  27. {%- endfor %}

上面的 template 定义了每一个job objects的参数,使用python dicts 的 list (lines 1-4)。然后, 循环处理参数集合,产生job的yaml object。多个 yaml 可以通过 --- 符号进行分隔,因此我们将其内容输出到一个job文件,用于kubectl 的后续操作。

你需要 jinja2 package,可以通过命令安装: pip install --user jinja2

现在,使用单行python 程序来扩充这个模版:

alias render_template='python -c "from jinja2 import Template; import sys; print(Template(sys.stdin.read()).render());"'

输出被保存为文件, 如下操作:

cat job.yaml.jinja2 | render_template > jobs.yaml

或者直接发送给kubectl, 如下:

cat job.yaml.jinja2 | render_template | kubectl create -f -

可选方法

如果你有大量的job objects, 很快会发现:

  • 使用labels来管理大量的Job objects是很累人的事情。
  • 一次性创建大量的job,有可能导致资源使用超量。
  • 一次性创建超大量的job,可能导致Kubernetes apiserver, controller, 以及 scheduler超出负荷。

这种情况下,你应该考虑使用其它的 job patterns 了。

转载于:https://my.oschina.net/u/2306127/blog/1982577

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/563770
推荐阅读
相关标签
  

闽ICP备14008679号