Kubernetes 笔记 10 Job 机器人加工厂

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。

Hi,大家好,我是 CloudDeveloper,欢迎大家和我一起学 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 对象:

Kubernetes 笔记 10 Job 机器人加工厂

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

查看一下 Pod 的状态:

Kubernetes 笔记 10 Job 机器人加工厂

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

Kubernetes 笔记 10 Job 机器人加工厂

看到历史输出:

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfdsy.html