00:02
各位战友大家好,今天我们一起来分享一下cooperber noticets的job控制器。Job控制器在目前行业解决方案当中是怎么样一个存在,就借今天这个机会呢,我们一起来深入的交流一下。本次课我们分为三步走,第一部分基础篇,我们要搞懂脚步控制器的概念定义,然后呢,我们还要了解它的使用场景和它的工作原理。第二部分核心篇,我们要搞懂照不控制器有哪些特性,以及它压录文件应该怎么写,有哪些具体的参数,然后还要了解它的并行机制。第三部分实践篇,我们要搞懂叫我生命周期里最关键的一个部分,就是失败重试策略,这个我会单独拿出来给大家来详细的进行讲解。我们还要搞懂叫不控制器的常规的命令以及环境演示。
01:08
首先我们来看胶布控制器的概述,什么是胶布控制器?胶布控制器是K8S中用于运行一次性任务的API对象,负责启动指定数量的pod,追踪记录达到complete状态的pod个数,判断是否达到设置的阈值来确保po的完成。既定任务,通常用于部署一次性任务或批处理任务。与Deployment不同的是,Job不维持长期运行服务,Po完成后会结束。嗯,其实它的核心概念就是这些,相信呢,通过PPT的一些个表述,大家也能够对它有一个初步的认识。好吧,这块我们就不再赘述了,我们往后看吧。
02:00
典型的使用场景,它使用场景其实很多啊,一次性任务嘛,就像我们在Linux当中有一个at的这个服务能力是吧,用于执行一次性任务,执行一个命令也好,或者是跑一个脚本也好,或者是干一个什么什么事情,在K8集群当中叫我就是来完成这个任务的控制器是吧。我这里就先举一个例子啊,数据处理。我给我给大家来说一个场景,就比方说我们嗯,双十一吧,用户访问量层层的往上涨,对吧,我这时候发现,哎呀,我这个机器负载整体比较高,然而呢,我一些个数据呢,也是非常重要的,我怕我这个数据出什么问题,这时候我要跑一个交付控制器,赶紧把我当前的数据先备份一次,可不可以,这个就是使用场景之一,当然了,具体的场景还要根据实际的业务来做判断,好吧,这里我只是做一个,呃,举一个例子啊,然后让大家更好的理解一些。
03:05
好吧,这个地方就不再赘述了。我们再来看一下job不控制器的工作原理,首先定义对象用户,定义job布对象,指定破的模板和其他配置选项,明确任务执行的具体要求。也就是说我们要在压某文件当中指定我们启动的类型,就是交付控制器,然后调度破的K8S会根据job定义的pod。然后pod被调度到合适的节点后,开始执行具体的任务,也就是破D被调度到那个节点成功起来以后,就开始跑我们的任务了,然后呢,这个时候就像是第三点说的,要监控pod,交波控制器会持续的监控pod的运行状态是吧,你因为你这个一次性任务嘛,比方说你中断了是吧,那你这一次性任务也就中断了,所以他要去监控破D,要确保第4联完成任务。
04:07
是吧,你不能说你这任务跑一半儿断了你就不管了,你得监控这个破D,有问题的话,你还需要哎,把这破D再重新调度重启一下,然后完成你没有完成的任务,对吧?就像第4点提到的嘛,完成任务当关联,当所有关联的破D都完成任务以后,Job的状态会被标记为completed,表示工作结束,然后呢工所有一次性任务都跑完了,我们的pod使命也不都已经完成了吗?这时候胶布控制器会清理,就是所有运行的pod。因为没有必要了,对吧,你的任务已经结束了,因为你这个性质呢,就不像deployment一样持久化的存在,Job不结束了就没了。好吧,这个地方也是比较好理解的,我们继续往后看,我们来看一下它的核心特性是吧,首先是执行控制,它可以并行执行,它可以指定一个数量是吧,就比方说我这个备份数据库吧,还是举刚才那个例子,备份数据库,如果说我数据库非常的庞大呢,是吧,你可能你起一个破的,你备份起来是比较费劲的。
05:27
是吧,所以我们这时候要并行,我们可以起10个甚至更多来完成我们当前比较繁重的一个任务,然后还有成功技术追踪完成任务的破的数量,直到达到指定的完成数量,对吧?就比方说哈,我再给大家举个例子,嗯。你说我的任务是不是应该有个期那个预期呀,对吧。我现在希望哎,你帮我这个一次性任务啊,这个破的要帮我完成啊,10个任务。
06:04
对不对,那我就会设置一个这么个阈值,设定为10,然后你这个破D呢,完成一次这个计数值就加1,完成一次计数值加1,直到他满足10,也就是说有哎有10个这么个任务被完成了,这时候。这个胶布控制器就会判断啊,好,我的任务就是成功完成了,我可以退出了,大概就是这么一个意思,当然了,这个地方可能说起来会比较的晦涩一些,这个不用担心啊,我们大家先有一个初步的概念,在后边的实验环节呢,我会带着大家来看到这个实际的效果,这个这块不用担心,来我们再来看第二个容错机制,失败重试,对吧,就像刚才提到的,如果说我的破的。是吧,因为说我这个任务比较繁重,在执行的时候给崩掉了,那么胶布控制器会发现它,并把它尝试的重启,然后呢,让这个破者再继续完成他的任务。
07:08
再来看第三个资源管理,自动清理。之前我们也提到了,我们这个任务跑完了交拨控制器呢,就会清理到清理掉对应的po的资源,因为你这个已经没有用了,你没有用了,你还占着我们etcd的一个资源,这个完全也是没有必要的,所以就会把这些已经完成的破的给清理掉,好吧,然后是可观测性生命周期管理,管理任务的启动,监控完成和清理的全生命周期,是吧?然后监控日志,收集job执行的日志情况,方便问题调查和性能分析,当然这个后面我会在实验环节再详细的讲到的,这里我们先有一个嗯,基础的概念。呃,这个时候我们来看一下哈,有哪些常用的参数,具体的压木文件我们先不看了,我们先只看参数,压木文件的话,待会儿会在后面的实效环节,我会带着大家来详细的再再分析核心参数,先看第一个back of limit任务失败时尝试重新运行的次数,默认是6,如果说你不指定哈,那那它就是6,这个是什么意思呢?就比方说我这个破的是吧,失败了,那允许我失败几次呢?
08:27
那不能说是我不定义,那就是一直失败,一直失败是吧,我这个任务完不成了,那不行,他要定义一个阈值,这个阈值是多少,默认是6,也就是说我这个胶布控制器起的pod默认啊。他只能失败6次,也就是重试6次,超过6次不好意思,那我就会判定你这个效果是不行的,那你就不要再跑了,不要再占用了和浪费资源了,是吧?这个就是back off limit的一个定义,我们再来看第二个compleles,指定任务需要完成的总次数,达到该次数以后识别成功,就像我们刚才说的,就比方说我要完成,嗯,这个一次性任务啊,我让他们要完成10次,完成10次才满足我的预期嘛,那如果说你没有完成10次,那就没有满足我的预期是吧?这个就胶布控制器呢,还会在不断的。
09:28
尝试完成,然后来尽量的满足我的这个compleles预期的一个情况,这个也很好理解,相当于相当于就是给这个定个指标吧,那你不能说我给你嗯安排一个任务是吧,我希望你给我把这10个活给干了,结果呢,你没干成是吧。这个也就是不符合我的预期的,所以说我需要定义这么一个参数来约束我的一个要求。我们再来看第三个并行parallelism,指定并行运行的任务个数,控制同时执行的破的数量,这块应该怎么理解呢?就比方说哈,有些任务啊,就比方说像刚才那个备份数据库,如果说我数据库体量是非常的大。
10:19
那比方说啊,我起一个破的,我去备份,那你说是不是压力也会比较大呢。但是如果哎,我起10个甚至20个,然后去完成这一个任务,是不是就显得压力没那么大了,压力就被分散掉了,对不对?这个就是定义这个并行参数的一个思想。Para.好吧,这个也很好理解,然后我们再看第三个,这个叫嗯,生存时间超时,然后是完成,这个该怎么理解啊?嗯,任务完成后自动清理pod的时间,就比方说啊,我们这个定义50吧,也就是说我这个任务一次性任务的破的啊,已经跑完了,完成了,那么就会在50秒以后把这些破绽哎全部都清理掉,避免它占用我etcd的一些个资源,是吧,因为这些我已经跑完了嘛,就像刚才说的,已经跑完了也没啥用了,你说留着干啥?
11:22
是吧,就可以清理掉了,这个定义的就是这个参数,然后重启策略start policy重启策略这个地方需要注意,Job控制器中的重启策略只能设置为never和unfi。Na是什么意思呢?就是无论你这个执行成功了还是没成功,这个普尔达都不重启。对吧,就不管了,就比方说我要我指定并行了10个要起来是吧,要10个并行那个10个破的,那么比方说有有一个。运行失败了。
12:00
对吧,这个容器崩溃掉了,那么如果是never的话,就不会重启,那你就剩下那9个,你就干一下吧,是吧,这个是这个参数的意思,然后再看offer,它的这个含义呢,应该怎么理解。失败时重启。对吧。失败式重启,也就是说,哎,我正常退出了,当然我不重启啊,因为我已经正常退出了,如果说我失败了,比方说。我还是备份数据库那个例子吧,备份的压力比较大是吧,导致我这个pod给崩溃掉了,那么如果这时我的重启策略是onfa的话,那么它就会重新启动这个pod,继续完成它的任务。在实际的这个生产环境当中,选择onfa是比较多的。好,这块我们就不再赘述了,待会儿实验环节的话,还会再拿出来再说的。
13:01
B型机制啊,这块我们再来讲解一下,就像刚才提到的嘛,可以指定任务需要完成的总次数,比方说设置成6或者是10这个都可以啊,然后变形,我们可以设置破的副本的个数,比方说设置成3个,那就是三个破的同时去完成这一个任务,我就是去,嗯。执行这一个任务,然后两者配合使用就可以实现一个什么情况呢?分批并行处理会大大的提高我们的这个任务效率啊,然后示例的话就不需要看了,然后后面下面那个命令参数也不需要看。失败总体策略刚才已经详细讲过了,这里就不再赘述了。自动清理机制也就不再赘述了,呃,常用命令的话,这个之前我们都讲过,库CITY2CREATE,还有A类的一个区别,以及查看控制器的具体命令和怎么删除资源,我们之前都已经详细的讲过了,这里也就不再赘述了。
14:09
嗯,最佳实践啊,最佳实践的话,我准备了几份压布文件,待会儿在实验环节我会带着大家一一的来过一遍,这个不要担心,好BT部分就已经结束了。下面就开始我们的实验环节。下面就开始我们的实验环节,这里我准备了几份压模文件,我们来依次的看一下,首先来看第一份啊,我们来解读一下。嗯,API version定义核心组合版本,这个kind的要起一个叫步控制器,然后Miss data定义元数据,我们的job控制器就叫hello-job,然后定义规格back of limit允许尝试。
15:02
重就是重拉4次,比方说我这个失败了,我可以重建是吧。几次,4次。这个地方就是这个意思,然后要起一个pod的模板。你们定义了什么呢?定义了重启的策略,这里是never,永不重启,然后容器,容器的名字叫做哈,容器的镜像就是b z box, 然后镜像的拉取策略是如果本地有就用本地的,如果本地没有就从远端仓库拉取。重要的一点来了,Command要执行一个命令,执行一个什么命令,我们看一下啊,先AO一句我是正常日志输出,然后再A口一句即将开始错误演示,然后休眠两秒,开始执行一个错误的命令,这个主要是要演示什么呢?我们主要是要演示这个失败的重试次数,就是看一下他达到这个4次以后会有怎么样的变化,看看是不是我们预期的,哎,就是不再重拉了,就卡死在那儿了。
16:11
对吧,来我们一起来执行一下啊,口CTRF,内杠yjob2.m回车。然后库奔是吧,CTL guide是吧,现在已经开始拉这个容器了,好第一次失败。这样我加个杠W吧。What a cat?我们再来看一下现在的一个状态哈。现在是12345,为什么是五个,因为我们第一次新建的,这个是第一次新建嘛,因为这个不算,因为他们没有重启,第一次失败了,所以要开始第一次重启是吧,第一次重启又失败了,第二次重启,第三次重启,第4次重启是吧?是这样一个流程,当然了,具体的重启的这个顺序啊,我们可以通过这个秒数来判断,当了可能不是从下往上的啊,我们可以通过这个描述来判断,我这这里只是举一个例子,这里重启的四次就是我们定义的。
17:29
Back off limit4。是吧,这是第一个参数,来,我们现在把这份压模回退一下,库块CT l deletee-F,呃,叫波二点压模,好,我们先把它回退一下,然后我们再来看第二份亚母。第二个家么,我要做的演示是累计成功5次,对吧?前面这些我就不再赘述了,我们重点看这里。Sta下面我定义了一个comples,我也就是需要成功5次。
18:01
对吧,你看我是怎么写的啊,我这里要起一个容器,然后我里面执行的命令是,哎,我先打印,从1~10。然后打印完了以后呢,就算完成了,对吧,完成了以后我再起第二个,然后我再起第三个,我再起第4个,再起第5个,这个就是我构造的一个,嗯。简单的校本啊,当然了,我们这个要根据实际的生产环境来,我这里只是举一个例子,我们这块的命令可以替换成你需要的命令嘛,或者是你需要执行的脚本都可以,好吧,来,我们执行一下酷派CTL空格PLY-F,然后是job3.m回收。Auver c guide Ford.好,这已经跑了好几个了,好已经有3个完成了,第4个正在创建,好已经有4个完成了,好现在5个全部完成了,然后呢,我先清一下屏啊。
19:00
然后我们再怎么查,他都始终是5个了,对吧,你看这是不是就符合我们的预期的呢?因为我这里定义的需要成功5次,那他这儿就成功了5次是吧,我这儿成功了5次,然后呢。我校不控制器就不需要再重新那个新建了。因为满足我的期望了。然后我们来看一下啊,看可以看一下日志,看一下它是不是打印了。哎,这些东西。好,把CTL logs, 然后把这个pod的名字占过来,诶,回收对吧,是不是从1打印到10了,每一个pod其实都是完成了这样一个动作,从1打印到10是吧,标记完成,然后呢,再起第二个pod,再从1打印到10,直至完成第5个。这就是completions的一个含义,这里也很好理解,我们再把这份回退掉,再来往后演示。
20:00
我们先来看一下第4第三个牙目前面就不再演示了,这个实验主要是给大家看一下什么呢?并行是吧?并行分批,并行分批怎么理解,我这里定义了我只一次啊,我们可以并行两个,但是呢,我需要完成四个,那他是不是需要跑两次的对吧。也就是我依次前起俩,这俩同时完,这俩也先后完成了,完成完以后了,那么再起第三个第4个啊,完成我的这个compleles对吧,并行批次去完成,我们来看一下我怎么写的这个命令啊,我就是让他起来以后休眠10秒。也就是说我这个两个破的啊,训卖完10秒以后,那么第三个第4个破D就开始新建了,完成以后呢,就全部结束。
21:00
达到这个阈值,哎,任务完成,我们一起来看一下效果,Cooper CT ly p ly, 嗯,杠F。叫4点回撤来酷波。CTL盖的。好的,现在已经是两个在完成了,对吧,那我们再观察一下。好,10秒钟过去了。好10秒钟过去了,是不是我们发现一个情况啊,已经有两个标记未完成了,对吧,Completed.好的,我们去啊,好,20秒过去了,20秒过去了。也就是说,满足了我定义的。COMP4。是不是就符合预期了,然后你再怎么。刷新查看,那它都是不会变的。
22:00
这个就是我们的第三个实验,我们再来回退一下。T, 嗯,和F9,我们再来看一下第4个实验,最后一份压么?我做了一个虚假的演示哈,备份数据库,当然了,这个实际的命令部分我们可以写这个MYSQL档,我这里也只是随便做一个演示,为了让大家看到效果,我们来看一下这份押宝文件是怎么写的。API version和me原数据这些都已经讲过了,就不再赘述了。这个地方。需要我注意的是这个参数active deadline seconds15,这个是什么意思呢?相当于我这个破,呃,我这个叫板啊,开始创建到结束一共就15秒的时间,就哪怕。是吧,你这个任务没有完成。但是超过15秒了,那么不好意思,那我也会把你强制杀掉,就相当于是我给了你一个期限是吧,不会让你无穷无尽的去一直的在跑这个一次性任务,因为我们是在实际的生产,生产环境当中啊,是有很多的定时任务存在的,不能说是因为你一个任务阻塞了后边的一系列任务,所以我这里定义了一个时间。
23:21
好吧,然后我们再来重点再看一下这个命令部分,我这里。虚构这个啊,虚构这个假设说我备份数据库是10秒是吧,是不是就是在我的一个呃范围以内的,所以它会成功退出。来,我们先来看一下这个的效果,不是CPLLPLLY-F角。可爱的来,我们一起来看一下。好起来了,起来以后它会休眠10秒,10秒以后它就会变成compilations一个状态。好,状态已经变了,证明已经完成了,这个预期就已经达到了,但是呢,我们现在需要搞点小破坏,我们把这个设置成16,设置成16是不是就不在这个区间呢?
24:10
我们再来看一下是一个什么样的效果,后边CTL,嗯,叫我先把它回退掉啊,然后我们把这份压部文件改一下。我们把这个sleep是吧,就假模假模假样的,就是这个数据库,它它要备份16秒,我们就故意让它超时一下,看看它会怎么样,APL ly-f job五回车,嗯,会SPLY盖。我们等他15秒。看看15秒会发生什么?哎,开始销毁当中了,对吧。来,再来看一下。没了。是不是就超时了?因为超时,所以叫我以及他所起的破的全部被销毁掉了。
25:08
这个呢,就是。Active deadline seconds的一个含义,到这里呢,Job控制器的部分就已经全部讲完了。感谢大家的观看。再见。
我来说两句