Kubernetes 笔记 10 Job 机器人加工厂
本文首发于我的公众号 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
这里用到了上面说的两个参数:completions
和 parallelism
,表示每次并行运行两个 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 机器人加工厂的更多相关文章
- 操作系统概念学习笔记 10 CPU调度
操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU.操作系统能够提高计算机的吞吐率. 对于单处理器系统.每次仅仅同意一个进程执行:不论什么其它进程必须等待,直到C ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- 《C++ Primer Plus》学习笔记10
<C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...
- k8s Kubernetes v1.10 最简易安装 shell
k8s Kubernetes v1.10 最简易安装 shell # Master 单节点快速安装 # 最简单的安装shell,只为快速部署k8s测试环境 #环境centos 7.4 #1 初始化环境 ...
- 使用kubeadm搭建Kubernetes(1.10.2)集群(国内环境)
目录 目标 准备 主机 软件 步骤 (1/4)安装 kubeadm, kubelet and kubectl (2/4)初始化master节点 (3/4) 安装网络插件 (4/4)加入其他节点 (可选 ...
- SQL反模式学习笔记10 取整错误
目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...
- JAVA自学笔记10
JAVA自学笔记10 1.形式参数与返回值 1)类名作为形式参数(基本类型.引用类型) 作形参必须是类的对象 2)抽象类名作形参 需要该抽象类的子类对象,通过多态实现 3)接口名为形参 需要的是该接口 ...
- 二进制手动部署kubernetes 1.10.10
转载于:https://www.jevic.cn/2018/09/23/kuberentes-1.10.10/?tdsourcetag=s_pcqq_aiomsg#heapster 通读一遍在实际操作 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
随机推荐
- netty源码分析之揭开reactor线程的面纱(二)
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下 reactor线程 我们已经了解 ...
- C++中的静态类型和动态类型的定义
当我们使用存在继承关系的类型时,必须将一个变量或者其他表达式的静态类型与该表达式表示对象的动态类型区分开来. 表达式的静态类型在编译时总是已知的,它是变量声明时的类型或者表达式生成的类型: 而动态类型 ...
- [Usaco2005 dec]Layout 排队布局 差分约束
填坑- 差分约束一般是搞一个不等式组,求xn-x1的最大最小值什么的,求最大值就转化成xa<=xb+w这样的,然后建图跑最短路(这才是最终约束的),举个例子 x1<=x0+2x2<= ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...
- BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割
BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作 ...
- BZOJ_2142_礼物_扩展lucas+组合数取模+CRT
BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...
- csc.exe的环境变量设置
csc.exe使用来编译*.cs文件的,但必须要在安装目录下使用.所以需要设置一下环境变量. C#的环境变量设置 1.“win+R” 打开运行窗口,并输入 “cmd”: 2.运行“set path=% ...
- 机器学习类别不平衡处理之欠采样(undersampling)
类别不平衡就是指分类任务中不同类别的训练样例数目差别很大的情况 常用的做法有三种,分别是1.欠采样, 2.过采样, 3.阈值移动 由于这几天做的project的target为正值的概率不到4%,且数据 ...
- [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
前言 最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底.总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice ...
- 每日分享!JavaScript的鼠标事件(11个事件)
鼠标的11个事件 具体的事件解释如下: click:按下鼠标(通常是按下主按钮)时触发. dblclick:在同一个元素上双击鼠标时触发. mousedown:按下鼠标键时触发. mouseup:释放 ...