本文首发于我的公众号 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++编程技术等内容,欢迎大家关注。

Kubernetes 笔记 10 Job 机器人加工厂的更多相关文章

  1. 操作系统概念学习笔记 10 CPU调度

    操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU.操作系统能够提高计算机的吞吐率. 对于单处理器系统.每次仅仅同意一个进程执行:不论什么其它进程必须等待,直到C ...

  2. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  3. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  4. k8s Kubernetes v1.10 最简易安装 shell

    k8s Kubernetes v1.10 最简易安装 shell # Master 单节点快速安装 # 最简单的安装shell,只为快速部署k8s测试环境 #环境centos 7.4 #1 初始化环境 ...

  5. 使用kubeadm搭建Kubernetes(1.10.2)集群(国内环境)

    目录 目标 准备 主机 软件 步骤 (1/4)安装 kubeadm, kubelet and kubectl (2/4)初始化master节点 (3/4) 安装网络插件 (4/4)加入其他节点 (可选 ...

  6. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  7. JAVA自学笔记10

    JAVA自学笔记10 1.形式参数与返回值 1)类名作为形式参数(基本类型.引用类型) 作形参必须是类的对象 2)抽象类名作形参 需要该抽象类的子类对象,通过多态实现 3)接口名为形参 需要的是该接口 ...

  8. 二进制手动部署kubernetes 1.10.10

    转载于:https://www.jevic.cn/2018/09/23/kuberentes-1.10.10/?tdsourcetag=s_pcqq_aiomsg#heapster 通读一遍在实际操作 ...

  9. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

随机推荐

  1. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  2. Python软件目录结构规范

    设计项目目录结构和'代码编码风格'一样, 是为了达到以下两点: 可读性高 可维护性高 目录组织方式 Stackoverflow上有一些比较好的范式.

  3. TestNG失败用例自动截图

    参考:https://blog.csdn.net/wangxin1982314/article/details/50247245 1. 首先写一个截屏方法 public class ScreenSho ...

  4. java的classpath路径中加点号 ‘.’ 的作用

    "."表示当前目录,就是编译或者执行程序时你所在的目录下的.class文件:而JAvA_HOME表示JDK安装路径 该路径在eclipse中是以vmarg的形式传入的,可以在任务管 ...

  5. fileWriter.go

    package blog4go import ( "fmt" "path" "strings" ) // NewFileWriter ini ...

  6. .net core下使用Thrift

    因网站组(.net)与游戏服务端(c++)原来使用REST API通讯效率稍显低下,准备下期重构时改用rpc方式,经比较Thrift和gRPC两者的优劣(参照网上的对比结果),最终决定使用Thrift ...

  7. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

  8. Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造

    Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3

    Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的 ...

  10. SpringBoot集成Security,JWT,Swagger全分析

    GitHub地址: https://github.com/li-jun0201/springsecuritydemo本项目采用SpringBoot1.5.9, SpringSecurity,JWT, ...