00:00
大家好,欢迎大家继续收看上硅谷的Linux云计算视频。我是汪洋老师。那这节课呢?我们继续向后去学习容器的生命周期。那在之前的课程中呢,给大家去讲解了,我们怎么去通过资源清单去创建一个pod,对吧?但其实中间还有很多的一部分我们并没有搞清。比如在pad被创建的时候,它到底经历了哪些过程?我们必须要把这个过程理解清楚以后,才能够去做一些探测。那为什么需要有探测这个池呢?比如我们现在运行了一个pod。Pod里面呢,运行了两个容器,如果这个两个容器它还在,但是里面运行的进程已经死亡了,或者意外中断了。由于某种故障的这个容器并没有退出,造成这个泡的还处于一个running状态。这时候其实服务已经是不可用的了,对吧,但是。
01:02
对于整个炮来说依然是可用的。所以这时候就会出现问题了,那怎么去做这种纠缠,以及在pad里面的容器创建的时候,它需要有一些初始化的过程,那到底他们到底是怎么去做的,怎么去实现的,那这节课的过程中呢,我们就给大家一一解析。好,那首先呢,我们先看这么一张图。那这个描述的就是我们整个pad从创建到死亡的整个过程。那最开始的时候,当我们的请求指令被下达到我们的API接口,被调度到我们的库light上,他要去进行一个所谓的容器的环境的初始化。那接着呢,会进入到我们的pod生命周期内部,也就是pod开始创建了,对吧?那泡创建的时候,它需要进行一个unit c的创建INC的过程。
02:02
初始化C容器。叫初始化容器。初始化容器是什么含义呢?比如我现在想去运行一个pod,里面运行两个不同的容器,那这两个容器运行的前提条件就是在本机的什么什么存储下面有一个什么文件存在,它才能正常运行。那这时候呢,我就可以通过这个英利C,它去把这个文件给生成。记住,阴利的C只是用于初始化的,它并不会一直跟随着我们的P的生命周期存在,也就是这个阴利的C在初始化完成以后就会死亡,需要大家注意一下。那细心的同学可能会。发现对吧,在这里呢,我会画了很多个INC。这里只花了两个,对吧,它不止两个,还可以更多,也就大于等于一个都是允许的,甚至没有也行。
03:03
好。那并且每一个英尼的C在结束以后才能进行下一次的阴尼的C的构建。也就是不能并行哈,我不能这边因你的C啊运行的呢,这边引你的C也一起运行,这也一起运行肯定是不行的,这是一个线性过程,需要大家注意一下。其实我还少画了一个东西,是什么东西呢?叫做pass。PA这个基础容器的创建,在我们的pod一旦被建立的时候,这个基础容器就已经被拉起了,就已经被创建了,那接着再去走我们INC的初始化,那接着再到我们真正的容器的。内部。也就是主容器,当然这里的主容器可能也有多个,那如果我现在再画多个主容器的话,是不是给大家搞懵了?那我们现在假设的就是我现在有一个泡的pod,里面就一个容器,这个容器是我想要的,可能是PP,可能是ningx,可能是他们看等等。
04:08
好,那在这个主容器的运行过程中呢,主容器的运行过程中呢,首先它会进行一个stop操作,以及一个结束的时候会进行一个stop操作。也就是在容器运行之前。开始运行了,我可以让他去执行一个指令,当容器在退出的时候,我可以让再进行一个指令,执行完成以后才允许他退出,会有一个start以及stop的操作。并且大家会发现还有两个模块对吧,一个叫read,一个叫live。Z的含义叫做就绪检测。的含义叫做生存检测。那这两我们给大家举个例子。
05:06
我们之前给大家讲过,有一个控制器叫做我们deployment,对吧。Deep的下面呢,去管理了很多的一些。泡。比如国内的四个po。当然它这里还有一层我们的R,对吧,我们就不画了,管理的四个泡。那这四个po呢,是一个一个去创建出来的,那在deployment上面呢,我们可以去创建一个SVC。比如它的是noteport模式。也就意味着这个集群可以被。共享给我们的。K8S环境之外了,那这时候呢,我们的客户端就可以在这里过来访问了。
06:01
这是完全没有问题的,对吧?好,那有没有想过一个问题,假设这里的比如是汤姆开的,在第一次启动的时候,它的初始化步骤是不是还是有点容,还是有点长的,对吧?他需要把项目给展开。那在这种时候的话,如果一旦这个pod创建成功,那我们在这上面看到的我们的get pot get pot Co CL get pod,看它的状态已经变成running了,Running的含义就是这个SVC已经把它拿到。对外的访问队内里去了,但是如果这个他CAD它的部署程序没有完成,什么叫没有完成呢?就是还不能对外提供访问,但是现在的状态又是running running的含义就是我可以对外访问。理解我的哈,我的话的含义。能听清吗?就是的含义,就是这个pad会显示它是running,但其实真正里面运行的主要的。
07:05
进程还没有加载成功。这个时候如果把它暴露给我们的外网用户去访问的话,那是不是就会访问中断啊。访问不成功对吧。那这是不是不太合理啊?所以这时候我们就需要有一个叫做read就绪检测,什么叫就绪检测呢?我可以根据我的命令,我可以根据我们的TCP连接,我可以根据我们的FTP协议获取状态,判断你这个服务是否现在已经可用了。诶,如果可用的话,我再把你当前的运行状态给它改成running。能理解我的意思吗?这就是就绪检测的含义,就是看这个容器到底现在能不能被正常提供给外网访问。不仅仅只是你这个跑的起来了。好。那第二个就更容易理解了,第二个叫love。
08:03
也就是我们的生存。检测。那就像我们刚才说的,我们里面这是一个pad对吧,Pod里面会运行一个阻容器。我们把它叫做慢C。好慢叫慢C,那这个主容器有可能里面运行了一个,比如NX吧。里面运行了一个N的进程,那这个进程呢,有可能假死了这么多,有可能对吧,也不是不可能发生嘛,我们一定要把事情想到最极端的一方面。我说的是技术哈,技术哈,生活还是要多向上一点的是吧?技术我们一定要把它想到最极端的方面,如果最极端的方面我们都能把它解决的话,那平常的日常访问是不是就不成问题了,对吧?好,那在这里呢?恩,Ing出现了一个僵尸进程。
09:13
变成了僵尸进程。也就意味着这里的恩格斯已经。名存实亡了,对吧,但是这个进程还没有倒闭,那这个进程没有倒闭,那这个主容器呢就会运行,那主容器运行的话,Pad呢,显示的状态就是running running的含义就是能够继续为外网提供访问。明白什么意思了吗?我们需要有个机制,当发现ningx已经不能正常提供对外的访问的时候,或者是当我们的容器内部已经不能正常提供访问的时候,我们应该怎么办?可以把它对吧,重启或者是重建炮等操作。
10:01
好,那这个呢,就是我们的live。那这几部分加在一起以后呢,就组成了我们整个的容器的生命周期,或者pod的生命周期。我们再从头到尾给大家过一遍哈,这个这张图别看不多,但是很重要。首先我们的库ctl,像我们的I接口对吧,库ipi发送指令以后,库ipi会调度到我们的库light。当然这个调度过程是由etcd在中间完成的存储对吧,以及专的。好,那这个CU lightup light呢,去操作我们对应的。C,对吧?C,那cri呢,去完成我们的容器的环境的初始化,在初始化的过程中呢,它会先启动一个。Passu的基础容器,这是谷歌给我们做了一个非常非常精简的容器,对吧?它是负责我们的网络以及我们的存储卷的共享的,也就同一个泡道中,里面的所有容器都是共享的。好,那接着它要进行一个INC的初始化,或叫多个unit c的初始化,当然INC也可以没有。
11:22
也可以没有。那尼的C在初始化完成以后,如果是自动就是正常退出了,你退出码一定要是零对吧,如果非零的话,就不代表你这个程序没有自动退出啊,就没有正常的成功退出对吧?他要重新执行,根据我们的重启策略去判断。那多个多个初始化,初始化的容器都已经做完了以后呢,它就可以进入到我们的慢C的运行了,慢C也就是我们的主容器,在刚运行的时候,你可以允许他去启动一条命令。或者执行一个脚本都可以对吧,命令跟脚本其实差别不大了,对吧,可以渐渐被调用嘛,好,那慢C在结束的时候也会允许他执行一个stop的命令。
12:09
也就是我在退休的时候啊,我要怎么办?交代一下后事是吧?好,那在过程中呢,会有readness和live的参与,那为什么这个readness并不是顶头的,原因是我们可以在多少秒以后再进行read的探测。我们可以这样定义,我说哎,但五秒以后在容器运行,五秒以后你再开始我们的read的探测,这是允许这样去声明的,所以这里没有顶头,需要注意一下。好,那同理也一样。那read在没有进行探测检测啊,就绪检测执行成功之前呢,我们的这个炮的它的状态是不可能变成running的或者ready的。只有当read检测成功以后,这里的pod才会显示为running,或叫reading。
13:03
那在这个过程中呢,我们还有另一个叫level的参与。它呢,会伴随着我们的整个的主容器的生命周期。当我们的主容器,它里边的进程。跟我们的level的检测出现不一致的情况的时候。也就level探测这个主容器已经对吧,已经出现损坏了,或者是不能正常工作了,那我就可以执行对应的重启命令或者是删除命令等等,根据我们的重启策略有关,后面我们再给大家详细介绍。好,那这个呢,就是我们的整个的pod的生命周期了。
我来说两句