文档章节

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

openthings
 openthings
发布于 2018/09/07 18:21
字数 1223
阅读 96
收藏 1

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

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

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

基本Template展开

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

application/job/job-tmpl.yaml
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

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 将被处理。如下所示:

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

检查一下结果:

$ ls jobs/
job-apple.yaml
job-banana.yaml
job-cherry.yaml

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

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

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

检查所有的jobs状态:

$ kubectl get jobs -l jobgroup=jobexample
NAME                  DESIRED   SUCCESSFUL   AGE
process-item-apple    1         1            31s
process-item-banana   1         1            31s
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:

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

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

$ for p in $(kubectl get pods -l jobgroup=jobexample -o name)
do
  kubectl logs $p
done
Processing item apple
Processing item banana
Processing item cherry

多个Template参数

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

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

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

{%- set params = [{ "name": "apple", "url": "http://www.orangepippin.com/apples", },
                  { "name": "banana", "url": "https://en.wikipedia.org/wiki/Banana", },
                  { "name": "raspberry", "url": "https://www.raspberrypi.org/" }]
%}
{%- for p in params %}
{%- set name = p["name"] %}
{%- set url = p["url"] %}
apiVersion: batch/v1
kind: Job
metadata:
  name: jobexample-{{ name }}
  labels:
    jobgroup: jobexample
spec:
  template:
    metadata:
      name: jobexample
      labels:
        jobgroup: jobexample
    spec:
      containers:
      - name: c
        image: busybox
        command: ["sh", "-c", "echo Processing URL {{ url }} && sleep 5"]
      restartPolicy: Never
---
{%- 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 了。

© 著作权归作者所有

openthings
粉丝 322
博文 1138
码字总数 687611
作品 1
东城
架构师
私信 提问
Kubernetes jobs:使用rsync建立定期备份任务

Kubernetes中的job和cronjob可用于批处理和定时任务。这里,我们使用其建立集群级别的文件备份机制。 关于Kubernetes中的job和cronjob使用,请参考: Kubernetes Jobs - 运行处理任务指南 Ku...

openthings
2018/09/09
75
0
谷歌生产级别开源容器调度和管理工具Kubernetes学习二

Batch Jobs Jobs 一个job创建一个或者更多的pods并确保指定数量的pods成功终止。当所有的pods成功结束,job会追踪这个过程。当成功结束数量达到指定数量,job本身结束。删除一个Job会清理由它...

自由linux
2017/01/27
0
0
分布式协调Kubernet

处理调度Jobs 单一的应用程序,就是之前在单个节点上运行的单个实例,包括了很多在数据库更新状态的调度jobs(现在也同样发布商务events)。单体程序创建在java中,并且大量使用Spring,所以...

Caicloud
2016/06/03
112
0
Kubernetes 系统架构初探\简单介绍

Kubernetes 系统架构初探简单介绍 一、前言 by Urs Hölzle, Google 翻译出来的意思是: Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经...

王振威
2018/07/25
0
0
Step by Step!Kubernetes持续部署指南

本文是作者通过亲身实践,从零基础开始,一步一步总结出来的Kubernetes持续部署工作流程。文章从前期的工具准备开始,到复刻存储库、测试、构建镜像、构建流水线最后进行部署,所有的工作流程...

RancherLabs
09/04
914
1

没有更多内容

加载失败,请刷新页面

加载更多

SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
24分钟前
3
0
C或C++不是C/C++

http://www.voidcn.com/article/p-mucdruqa-ws.html

shzwork
今天
6
0
OSChina 周六乱弹 —— 如何将梳子卖给和尚

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @for_ :划水五分钟,专注两小时。分享Various Artists的单曲《贝多芬第8号钢琴奏鸣曲悲伤的第三乐章》: 《贝多芬第8号钢琴奏鸣曲悲伤的第三乐...

小小编辑
今天
176
8
ES5

什么是ES5:比普通js运行要求更加严格的模式 为什么:js语言本身有很多广受诟病的缺陷 如何:在当前作用域的顶部添加:"use strict" 要求: 1、禁止给未声明的变量赋值 2、静默失败升级为错误...

wytao1995
今天
7
0
c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部