本文首发于我的公众号 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. toFixed()一不小心踩了一个坑

    toFixed,多么简单的一个函数,昨天突发奇想做两道算法题练练手.结果,踩到了一个从未遇到的坑! \n 简单来讲是要对输入的很多组数据,自己写一个函数做个处理,把每次函数处理的结果要相加求和.最后输 ...

  2. 关于xpath相对路径前加点与不加点的区别

    转自:https://blog.csdn.net/qingmu_9923/article/details/51771602 最近在用selenium做web工程自动化测试的相关项目,会经常用到元素定位 ...

  3. 树莓派.设置无线网卡为AP工作模式(pi2和pi3)

    树莓派2的设置办法: 1. 安装NetworkManager管理工具(可选),以支持nmcli命令 sudo apt-get install -y network-manager 2. 安装hosta ...

  4. java基础学习周计划之3--每周一练

    每周一练第一周 一. 关键代码:1.斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...数列第一项和第二项是1, 从第三项开始, ...

  5. message.go

    +MsgIDLength:]     return &msg, nil } func writeMessageToBackend(buf *bytes.Buffer, msg *Message ...

  6. BZOJ_1058_[ZJOI2007]报表统计_STL

    BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...

  7. 复仇者联盟3热映,我用python爬取影评告诉你它都在讲什么

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  8. mysql保存不了4字节的问题(也就是表情)

    这个问题   https://blog.csdn.net/ppwangGS/article/details/62044887 有详细的解决办法 这里我就是记录一下我遇到的问题 这种问题一般是往数据库 ...

  9. ToB蓝海的台阶-PaaS,SaaS技术详解

    前言 随着大量SaaS公司进入市场,我们看到颠覆性的软件服务以各种方式进入企业流程-从营销工具到支付系统.随着SaaS帮助优化业务流程,实现更流畅和自动化的运营,风险投资公司首先潜入池中寻找最优秀和最 ...

  10. vue.js - 奇怪的 event 对象

    好久都没有写点东西了, 前段时间工作搞得头大,真的就是一起加班到死了.废话不多说,写这篇文章是因为这次因为 event 对象闹了一个乌龙,以此总结一下. 一.event 对象 (一)事件的 event ...