k8s控制器之job--第九弹 job如何使用扩展进行并行处理

这篇具有很好参考价值的文章主要介绍了k8s控制器之job--第九弹 job如何使用扩展进行并行处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本模板扩展

下面是一个 Job 的模板文件:

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 对象,而仅仅是 Job 对象的 yaml 文件(其中包含一些占位符)。例子文件中的 $ITEM 对 Kubernetes 并没有任何意义,仅仅是一个占位符,必须在使用时用实际数值替换。

在此例子中,容器唯一做的事情就是 echo 一个字符串,并等待一小段时间。在实际使用中,应该是某种有意义的计算,例如渲染视频的某一帧图片,或处理数据库中某些记录。模板中的 $ITEM 占位符可用来指定视频的帧数,或者数据库记录的行数。

此 Job 及其 Pod template 包含标签 jobgroup=jobexample。对系统来说此标签并没有任何特别之处。该标签可以用来方便地操作这一组 Job。Pod 上也包含该标签,以便我们可以使用一条命令即可检查这些 Job 的所有 Pod。在 Job 创建以后,系统将添加更多的标签以区分不同的 Job 创建的 Pod。jobgroup 并不是 Kubernetes 特殊要求的标签,你可以使用任何标签达到此目的。

接下来,下载该模板文件,并将其扩展为多个文件:

# 将模板文件扩展为多个文件,并存到一个临时文件夹
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 替换为循环变量的值。你可以使用任意模板语言(jinja2,erb等)或编写一个程序来生成 Job 对象。

接下来,创建这些 Job:

kubectl create -f ./jobs

输出结果如下所示:

job.batch/process-item-apple created
job.batch/process-item-banana created
job.batch/process-item-cherry created

执行命令,检查 Pod 的状态:

kubectl get jobs -l jobgroup=jobexample

输出结果如下所示:

NAME                  COMPLETIONS   DURATION   AGE
process-item-apple    1/1           14s        20s
process-item-banana   1/1           12s        20s
process-item-cherry   1/1           12s        20s
  

此处,我们使用 -l 选项选择这一组 Job。执行如下命令可查看这组 Job 所有的 Pod:

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
    

目前还不能直接使用一个命令去检查所有 Pod 的输出,但是,可以通过一个循环来检查所有 Pod 的输出:

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

多模板参数

在前面的例子中,每一个模板的实例包含一个参数,同时,此参数也被用作标签。然而,标签的主键是受限于 句法和字符集 的。

下面这个例子稍微复杂一些,使用了 jinja2 模板语言来生成 Job 对象。我们将使用 python 脚本将模板转换为一个文件。

首先,创建一个文件 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 %}

此模板中,使用 python 字典表(1-4行)为每个 Job 对象定义了参数。然后通过一个循环遍历这些参数,并生成 Job 的 yaml 对象文件。

  • 多个 yaml 对象可以合并到一个 yaml 文件,使用 --- 分隔即可
  • 在运行时,你的环境中需要由 jinja2 包,如果没有,可以通过 pip install --user jinja2 命令安装

执行 python 脚本,以将模板扩展为多个yaml文件:

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 apply -f -

替代方案

如果您有许多的 Job 对象要创建,最终您会发现:

  • 即使使用了标签,管理数量众多的 Job 对象仍然是非常麻烦的事情
  • 一次性创建所有的 Job 对象可能会是您超出 resource quota的限制,但您又不想等待太长时间以逐个创建 Job 对象
  • 一次性创建数量众多的 Job 对象可能使 Kubernetes apiserver、controller、scheduler 等组件过载

在这些情况下,您可以考虑其他的 job pattern文章来源地址https://www.toymoban.com/news/detail-498983.html

到了这里,关于k8s控制器之job--第九弹 job如何使用扩展进行并行处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • k8s控制器之job--第二弹编写Job的定义

    与所有的 Kubernetes 对象一样,Job 对象的 YAML 文件中,都需要包括如下三个字段: .apiVersion .kind .metadata Job 对象的 YAML 文件,还需要一个 .spec 字段。 .spec.template 是必填字段: 用于定义 pod template 与 Pod 有相同的字段内容,但由于是内嵌元素,pod template 不包括阿 apiVersion 字段和

    2024年02月10日
    浏览(25)
  • k8s控制器之job--第四弹Job的终止和清理

    当 Job 完成后: 将不会创建新的 Pod 已经创建的 Pod 也不会被清理掉。此时,您仍然可以继续查看已结束 Pod 的日志,以检查 errors/warnings 或者其他诊断用的日志输出 Job 对象也仍然保留着,以便您可以查看该 Job 的状态 由用户决定是否删除已完成的 Job 及其 Pod 可通过 kubectl 命

    2024年02月10日
    浏览(10)
  • K8s(Kubernetes)学习(四):Controller 控制器:Deployment、StatefulSet、Daemonset、Job

    K8s(Kubernetes)学习(四):Controller 控制器:Deployment、StatefulSet、Daemonset、Job

    什么是 Controller 以及作用 常见的 Controller 控制器 Controller 如何管理 Pod Deployment 基本操作与应用 通过控制器实现 Pod 升级回滚和弹性伸缩 StatefulSet 基本操作与应用 Daemonset 基本操作与应用 Job 基本操作与应用 Controller 无法解决问题 1 Controller 控制器 官网: http://kubernetes.p2hp.com/

    2024年02月09日
    浏览(35)
  • k8s控制器之DaemonSet--第三弹DaemonSet 是如何调度的

    v1.12以后默认禁用 通常,Kubernetes Scheduler(调度器)决定了 Pod 在哪个节点上运行。然而 DaemonSet Controller 创建的 Pod 已经指定了 .spec.nodeName 字段,因此: Node 节点的 unschedulable (opens new window)字段将被 DaemonSet Controller 忽略 DaemonSet Controller 可以在 kubernetes scheduler 启动之前创建

    2024年02月10日
    浏览(16)
  • 18-k8s控制器资源-cronjob控制器

    18-k8s控制器资源-cronjob控制器

            job控制器是执行完一次任务,就结束;         cronjob控制器,是基于job控制器,定期频率性执行任务;等同于linux系统中的crontab一样; [root@k8s231 pi]# vim cronjob.yaml apiVersion: batch/v1 kind: CronJob metadata:   name: xinjizhiwa spec:   schedule: \\\"* * * * *\\\"   #定义job的模板   jobTemplate

    2024年02月22日
    浏览(58)
  • k8s 控制器

    Kubernetes(K8S)是一种开源的容器编排平台,它可以自动化地管理容器化应用程序的部署、扩展和运行。K8S中的控制器是一种重要的组件,它可以确保应用程序的状态与期望的状态一致。在K8S中,有五种常见的控制器,它们分别是: 1. ReplicaSet控制器 ReplicaSet控制器用于确保P

    2024年02月13日
    浏览(12)
  • K8s控制器

    K8s控制器

    kubectl create tabtab 下面的所有都可以创建模板文件 --dry-run=client -o yaml 查询资源对象的帮助信息         kubectl explain pod.spec.restartPolicy            #这里对上下层级关系需要清楚 获取Pod模板         kubectl run mypod --image=xxxx --dry-run=client -o yaml 获取Deployment         ku

    2024年02月03日
    浏览(34)
  • 15-k8s控制器资源-deployment/部署控制器

    15-k8s控制器资源-deployment/部署控制器

            在学习rc和rs控制器资源时,我们指导,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制,重新拉取新的pod来实现回滚或者迭代升级;         那么

    2024年02月21日
    浏览(17)
  • 14-k8s控制器资源-rs控制器replicasets

    14-k8s控制器资源-rs控制器replicasets

            replicaset副本控制器,简称:rs控制器;         用法:与rc控制器“几乎”相同;         能力:可以指定pod的副本始终存活,相比于rc控制器;支持标签匹配,也支持标签表达式         注意:不论是rc还是rs资源,都是通过“标签”惊醒匹配pod的,如果有同样

    2024年02月21日
    浏览(19)
  • k8s---pod控制器

    k8s---pod控制器

    工作负载,workload用于管理pod的中间层,确保pod资源符合预期的状态。 预期状态: 1、副本数 2、容器重启策略 3、镜像拉取策略 pod出故障的出去等等 1、replicaset:指定pod副本的数量 三个组件:                 1、pod的副本                 2、标签选择器,判断

    2024年01月18日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包