文档章节

Kubernetes 笔记 10 Job 机器人加工厂

o
 osc_a22drz29
发布于 2019/03/27 11:32
字数 1762
阅读 16
收藏 0

精选30+云产品,助力企业轻松上云!>>>

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复**「1024」**即可领取,欢迎大家关注,二维码文末可以扫。

Hi,大家好,欢迎大家和我一起学 K8S,这是系列第 10 篇。

通常,我们在执行任务时,会启用多个服务,有些任务需要长时间运行,全天 24 小时不中断,所以一般会启用 Daemon 类的 服务;而有些任务则只需要短暂执行,任务执行完,服务就没有存在的必要了。

容器提供服务运行的环境,根据任务持续运行的时间,将容器分为两类:服务类容器和工作类容器。

服务类容器需要一直运行来提供持续性的服务,而工作类容器则是运行一次性的任务,任务完成后便会退出。

前面学习的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器,而工作类容器则由本文要讲得 Job 来管理。

Job 多用于执行一次性的任务,批处理任务等,Job 就像是现代化机械加工厂的机器人,当有任务来的时候,便会启动,按照预先设定好的程序执行任务,直至任务执行完,便会进入休眠状态。

进一步,Job 根据任务的类型和执行的动作又分为以下几类:

  • 单 Job 单任务:只启动一个 Job 来完成任务,同时 Job 只启用一个 Pod ,适用于简单的任务。
  • 多 Job 多任务:启动多个 Job 来处理批量任务,每个任务对应一个 Job,Pod 的数量可以自定义。
  • 单 Job 多任务:采用一个任务队列来存放任务,启动一个 Job 作为消费者来处理这些任务,Job 会启动多个 Pod,Pod 的数量可以自定义。
  • 定时 Job:也叫 CronJob,启动一个 Job 来定时执行任务,类似 Linux 的 Crontab 程序。

上述 Job 的分类需要注意两点:

1)Job 执行失败的重启策略;Job 执行的是一次性的任务,但也不保证一定能执行成功,如果执行失败,应该怎么处理?这个是由前面所讲的 Pod 重启策略来决定的。在 Job Controller 中,只允许定义两种策略:

  • Never:Pod 执行失败,不会重启该 Pod,但会根据 Job 定义的期望数重新创建 Pod。
  • OnFailure:Pod 执行失败,则会尝试重启该 Pod。

两种策略尝试的次数由 spec.backoffLimits 来限制,默认是 6 次(K8S 1.8.0 新加的特性)。

2)批量任务的多次并行处理的限制;对于批量任务,通常是一个 Pod 对应一个任务,但有时为了加快任务的处理,会启动多个 Pod 来并行处理单个任务。可以通过下面两个参数来设置并行度:

  • spec.completions:总的启动 Pod 数,只有当所有 Pod 执行成功结束,任务才结束。
  • spec.parallelism:每个任务对应的 Pod 的并行数,当有一个 Pod 执行成功结束,该任务就执行结束。

下面通过几个例子来实践一下上面的几种 Job 类别。

几个例子

单 Job 单 Pod 执行一次性任务

首先,定义 Job 的 yaml 配置文件 myjob.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  template:
    metadata:
      name: myjob
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo", "hello, I'm CloudDeveloper, Welcome"]
      restartPolicy: Never

执行 kubectl create -f myjob.yaml 创建 job 对象:

可以看到期望创建的 Job 数为 1,成功执行的 Job 数也为 1,这表明该 Job 已经执行完任务退出了。这个 Job 执行的任务就是创建一个 Pod,Pod 中创建一个 busybox 容器,并进入容器输出一段字符串:“hello, I'm CloudDeveloper, Welcome”

查看一下 Pod 的状态:

可以看到,该 Pod 的状态为 Completed,表示它已经执行完任务并成功退出了。那怎么看该任务的执行结果呢?可以执行 kubectl logs myjob 调出该 Pod 的历史执行信息进行查看:

看到历史输出:

hello, I'm CloudDeveloper, Welcome

以上是执行成功的情况,如果执行失败,会根据 restartPolicy 进行重启,重启的方式上面也说了。大家可以自己实践下。

多 Job 多 Pod 执行批量任务

首先,定义 Job 的 yaml 模板文件 job.yaml.txt,然后再根据这个模板文件创建多个 Job yaml 文件。模板文件如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: work-item-$ITEM
spec:
  template:
    metadata:
      name: job
    spec:
      containers:
      - name: c
        image: busybox
        command: ["sh", "-c", "echo work item $ITEM && sleep 2"]
      restartPolicy: Never

其中,$ITEM 作为各个 Job 项的标识。接着,使用以下脚本,根据 Job 模板创建三个 Job 配置文件:

#!/bin/bash

for i in app book phone
do
  cat myjob_tmp.yaml | sed "s/\$ITEM/$i/g" > ./jobs/job-$i.yaml
done

最后,创建三个 Job 对象,如下:

单 Job 多 Pod 执行批量任务

这种方式是用一个队列来存放任务,然后启动一个 Job 来执行任务,Job 可以根据需求启动多个 Pod 来承载任务的执行。定义下面的配置文件:

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  completions: 6
  parallelism: 2
  template:
    metadata:
      name: myjob
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo", "hello CloudDeveloper"]
      restartPolicy: OnFailure

这里用到了上面说的两个参数:completionsparallelism,表示每次并行运行两个 Pod,直到总共 6 个 Pod 成功运行完成。如下:

可以看到 DESIRED 和 SUCCESSFUL 最终均为 6,符合预期,实际上也有 6 个 Pod 成功运行并退出,呈 Completed 状态。

随便查看其中一个 Pod 的历史执行情况:

# kubectl logs myjob-5lfnp
hello CloudDeveloper

定时任务 CronJob

定义一个 CronJob 配置文件,如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo", "Hello CloudDeveloper"]
          restartPolicy: OnFailure

kind 类型为 CronJob,spec.schedule 表示定时调度,指定什么时候运行 Job,格式与 Linux 的 Crontab 命令是一样的,这里 */1 * * * * 的含义是每一分钟启动一次。

创建 CronJob 对象,通过 kubectl get cronjob 查看 CronJob 的状态:

过一段时间再查看 Pod 的状态:

可以看到,此时产生了 3 个 Pod,3 个 Jobs,这是每隔一分钟就会启动一个 Job。执行 kubectl logs 查看其中一个的历史执行情况:

# kubectl logs hello-1536764760-lm5kt
Hello CloudDeveloper

到此,本文就结束了。我们从理论结合实践,梳理了 Job 的几种类型,下文我们开始看一种有状态的 Controller——StatefulSet。

同样,需要学习资料的后台回复“K8S” 和 “K8S2”,想加群学习回复“加群”。


我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
NLPIR搭建行业知识图谱实现智能客服应用

近几年,随着人工智能技术的深入发展及在各行各业加快落地化部署,客服行业已逐渐成为了人工智能技术众多落地应用中的重点应用场景。不少企业已经采用了智能客服机器人来替代大部分人工客服,...

ljrj1234
01/13
0
0
NLPIR系统构建知识图谱助力智能客服服务

目前,市场上的智能客服机器人已经是一款成熟的SASS产品,90%以上的企业都可以直接接入,数据保存在云端或者机器人公司的数据库,部署非常方便。同时,对于一些大型集团公司或者金融类企业,...

ljrj1234
01/16
4
0
GitOps 与 ChatOps 的落地实践

说到 GitOps 和 ChatOps,那就不得不谈到 DevOps。DevOps 作为一种文化,旨在促进开发、测试和运维人员之间的沟通与协作。而促进合作的方式,往往是使用一系列工具,完成这三个角色的相互协作...

Docker_
06/19
0
0
Kubernetes 落地案例|风靡全球的维基媒体 Wikimedia 正全面迁移至 Kubernetes

Kubernetes ,让世界维基大变样 众所周知的非营利性维基媒体基金会,旗下包括全世界最大的协同编辑参考项目:维基百科。为帮助用户维护和使用维基,基金会成立了维基媒体工具实验室,在这个宿...

Caicloud
2016/12/13
24
0
使用Kubernetes 构建自动化平台

编者按:本文由Wercker CTO Andy Smith 分享,他分享了Kubernetes如何帮助他们节省时间并加速开发。本文是关于Kubernetes 1.3新功能一系列深入文章的第九篇。 我们在Wercker运行数百万容器执...

时速云
2016/08/12
755
0

没有更多内容

加载失败,请刷新页面

加载更多

Eclipse_JavaEE_Tomcat_MySQL环境配置

安装java环境,配置系统变量(JAVA_HOME,绝对路径) 下载eclipse+Tomcat+mysql window——》preference——》server——》runtime——》tomcat环境 项目右键build path 配mysql jar ,libra...

愿有时光可回首
37分钟前
20
0
MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8 在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。 ...

zhxhash
58分钟前
17
0
leetcode面试题 17.13(恢复空格)--Java语言实现

求: 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboo...

拓拔北海
今天
19
0
B站跨年晚会究竟做对了什么?

燃财经(ID:rancaijing)原创 作者 | 赵磊 编辑 | 周昶帆 “补课”是《bilibili晚会 二零一九最美的夜》这个视频中,观众在前两分钟刷得最多的弹幕,寓意着观众是在元旦之后回来补看跨年晚会...

子乾建建_Jeff
01/07
55
0
关于Scrapy爬虫项目运行和调试的小技巧(上篇)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 迟日江山丽,春风花草香。泥融飞燕子,沙暖睡鸳鸯。 扫除运行Scrapy爬虫程序...

yuhan336
04/02
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部