tnblog
首页
视频
资源
登录

kubernetes Job讲解

6694人阅读 2021/3/3 18:32 总访问:3470769 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes

kubernetes Job讲解

需求来源

Job 背景问题


我们可以通过Pod来直接运行任务进程吗?

这样做将会产生以下几种问题:

1. 我们如何保证 Pod 内进程正确的结束?
2. 如何保证进程运行失败后重试?
3. 如何管理多个任务,且任务之间有依赖关系?
4. 如何并行地运行任务,并管理任务的队列大小?

Job 管理任务的控制器


Job 能帮我们做什么事情?

1. 创建一个或多个Pod确保指定数量的Pod可以成功地运行终止
2. 跟踪Pod状态,根据配置及时重试失败的pod
3. 确定依赖关系,保证上一个任务运行完毕后再运行下一个任务
4. 控制任务并行度,并根据配置确保Pod队列大小

用例解读

Job语法



新属性:
- restartPolicy: 重启策略
(值有Always, OnFailure,Never。 默认是 Always。)

- backoffLimit: 重试次数限制




举例(job.yaml):

  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: pi
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: pi
  10. image: perl
  11. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  12. restartPolicy: Never
  13. backoffLimit: 4

job类型以及元信息:

  1. kind: Job
  2. metadata:
  3. name: pi

镜像建议提前下载好

查看job状态


- COMPLETIONS: 完成pod数量

- DURATION: Job实际业务运行时长

- AGE: deployment创建的时长

查看Pod

  1. # kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. pi-w7gfb 0/1 Completed 0 25m


Pod 名称格式: ${job-name}-${random-suffix}

Completed 表示已经执行完了

labels均为自动匹配与添加

- ownerReferences:声明此pod是归哪个上一层controller来管理


并行运行Job


我们有时候希望Job运行的时候可以最大化的并行,并行出n个Pod去快速地执行。同时,由于我们的节点数有限制,可以也不希望同时并行的Pod数过多,有那么一个管道的概念,我们可以希望最大的并行度是多少,Job控制器都可以帮我们做到。请参考下面的示例(parallel-job.yaml)


  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: paral-1
  5. spec:
  6. completions: 8
  7. parallelism: 2
  8. template:
  9. spec:
  10. containers:
  11. - name: param
  12. image: alpine:latest
  13. command: ["/bin/sh"]
  14. args: ["-c", "sleep 30; date"]
  15. restartPolicy: OnFailure


- completions: 代表本pod队列执行次数,这里8代表中国任务将会被执行8次

- parallelism: 代表并行执行个数,这里2代表并行执行的pod数量,也就是说会有2个pod同时运行

我们通过让它的每个pod都催眠30秒,来进行观察。

查看并行Job运行

CronJob与Job的不同


它们之间最大的不同在于周期性任务作业计划

- 在未来某时间点运行作业一次

- 在指定的时间点重复运行作业


CronJob语法

属性 描述
jobTemplate Job控制器的模板,用于为CronJob控制器生成的Job对象
schedule crontab 时间格式相同
startingDeadlineSeconds Job最长启动时间
concurrencyPolicy 是否允许并行运行
successfulJobsHistoryLimit 运行留存历史job个数

Demo-CronJob.yaml

  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: hello
  5. spec:
  6. schedule: "*/1 * * * *"
  7. jobTemplate:
  8. spec:
  9. template:
  10. spec:
  11. containers:
  12. - name: hello
  13. image: busybox
  14. imagePullPolicy: IfNotPresent
  15. args:
  16. - /bin/sh
  17. - -c
  18. - date; echo Hello from the Kubernetes cluster
  19. restartPolicy: OnFailure
  20. startingDeadlineSeconds: 10
  21. concurrencyPolicy: Allow
  22. successfulJobsHistoryLimit: 3

在准备运行之前很有必要说一下schedule设置时间的格式,上面的yaml是每分钟执行一下,这里我截了官方的一张图,并制作了一个表格提供参考。要生成CronJob调度表达式,您还可以使用诸如crontab.guru之类的Web工具。

举例 定义
每年1月1日午夜运行一次 0 0 1 1 *
每月在每月第一天的午夜运行一次 0 0 1
每周一在周日上午的午夜运行一次 0 0 0
每天半夜运行一次 0 0 *
每小时开始一次,每小时运行一次 0
每个星期五的午夜以及每个月的13日的午夜开始任务 0 0 13 * 5

运行测试

架构设计

管理模式


1. Job Controller 负责根据配置创建Pod
2. Job Controller 跟踪Job状态,根据配置及时重试Pod或者继续创建
3. Job Controller 会自动添加label来跟踪对应的pod,并根据配置并行或者串行创建pod

Job控制器


上图是一个 Job 控制器的主要流程。所有的 job 都是一个 controller,它会 watch 这个 API Server,我们每次提交一个 Job 的 yaml 都会经过 api-server 传到 ETCD 里面去,然后 Job Controller 会注册几个 Handler,每当有添加、更新、删除等操作的时候,它会通过一个内存级的消息队列,发到 controller 里面。

通过 Job Controller 检查当前是否有运行的 pod,如果没有的话,通过 Scale up 把这个 pod 创建出来;如果有的话,或者如果大于这个数,对它进行 Scale down,如果这时 pod 发生了变化,需要及时 Update 它的状态。

同时要去检查它是否是并行的 job,或者是串行的 job,根据设置的配置并行度、串行度,及时地把 pod 的数量给创建出来。最后,它会把 job 的整个的状态更新到 API Server 里面去,这样我们就能看到呈现出来的最终效果了。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

oracle数据库表dual的讲解

我希望有个如你一般的人我还是很喜欢你,像日光洒满天地,温柔惬意。先提个问 :oracle数据库里dual表是什么表?这几天在使...

Kubernetes DaemonSet讲解

Kubernetes DaemonSet讲解[TOC] 需求来源背景问题我们可以让每个集群内的节点都运行一个相同的Pod吗?如果这样做,以下的...

VLAN接口类型讲解

VLAN接口类型讲解[TOC] VLAN简介VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个...

大白话讲解Promise(一)

原文连接:https://www.cnblogs.com/lvdabao/p/es6-promise-1.html author:吕大豹 2015年, ES2015正式发布(也就是ES6,E...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request["imgBase"]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///<summary> ///转全角的函数(SBCcase) ///</summary> ///<paramname="input">任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial("_分部页")第二种:@{ Html.RenderPartial("分部页");}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...
这一世以无限游戏为使命!
排名
2
文章
635
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术