00:00
那这几个东西呢,都很重要,比如你的C。比如start stop,比如每一个都很重要,我们一个一个给大家过一遍。每一个都给大家演示一遍,可以吧?那接下来我们先看第一个就是我们的阴历的C,我们的阴力的容器,对吧?我们的初始化容器pot能够具有多个容器。应用运营在我们的容器里面,但是它也可能有一个或多个先于应用容器启动的盈利的容器,就像我们这里看到对吧,慢C在启动之前还有个阴尼的C存在,好,那阴尼的容器与匹隆容器非常像,除了以下两点,第一个阴尼的容器总是运行到成功完成为止,每个阴尼的容器都必须在下一个阴尼的容器启动之前成功完成。那说白了也就意味着对于我们的阴历的C,它不像我们的慢C,慢C如果退出的话,Pod是不是就结束了?
01:01
那阴影的C退出并不会跟P的生命周期有关,也就是PD并不会结束。但是in的C如果不正常退出的话,慢C是到不了这一步的。并且尼的C如果没有正常退出pod是需要进行对应的流程处理的,比如重启对吧?是吧?那为什么德森没有初始化成功呢?我们重来一次吧,这么一个操作。号。第二个就是我们之前说过的每一个阴历的C。都要等前一个英的C正常的结束以后,它才能执行,如果第一个英的C总是不执行成功的话,那第二个英的C也不会被出现。需要注意一下,这是它两个特点对吧。那底下是不是做了一个总结啊?如果pod的引你的容器初始失败,库布耐利时会不断的冲击该pod,直到因尼的容器成功为止。然而如果pod对应的restart policy策略为never的话,那他们永远不会重启。
02:06
这是跟我们的重启策略有关的,对吧,我们的默认的是不是应该是always,那就一直重启对吧?Never就永不重启,需要大家注意一下。那还有就是阴尼的容器的作用,给大家解释一下,第一个。因为init容器具有与应用程序容器分离的单独的镜像,所以它们可以启动相关的代码。有如下优势,第一个,它们可以包含并运行使用的工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些使用工具的。也就意味着,如果我需要去提前去,在主容器启动之前,我们需要有一些文件被创建,需要有一些数据被梳理,但是这些梳理数据或文件的创建工具呢?加载到我们的慢C以后呢,又会造成这个慢C的冗余。对吧?这些工具并不是一直都会用,造成它的冗余,那随着我们的工具越来越多,它的稳定性是不是也会得不到保障?
03:07
所以在这个时候,我们就可以通过把这些工具写入到INC,让他在初始化的过程中帮我们把后面慢C所用到的一些文件提前给它串联出来,那这样的话,慢C又不需要去包含这些文件。又能够正常引用这些文件。能理解我的意思吧,设计很巧妙对吧?好,下一个它们可以包含使用工具和定制化的代码来安装,但是不能出现在应用程序的镜像中。例如创建镜像没必要from另一个镜像,只需要在安装过程中使用类似的什么CWK啊,Python或dig这样的工具,那其实跟这个是不是一样的,这一部分讲的是它的安全性,这一部分讲到的是它的荣誉性,对吧,好,下一个。应用程序镜像可以分离创建和部署角色,而没有必要联合他们构建成一个单独镜像。
04:05
也就意味着这样的话。在我那。主容器运行的时候,它可能需要有一部分把这些代码给它构建出来,另一部分再去运行这个代码,有这么两套流程对吧,第一套走完以后才能走走第二套,第二套就是持续的过程。那在这种情况下,我们完全可以把第一套剥离成我们的引领的C,让他去执行,这也是没有问题的。好,下一个应用程序镜像。啊,这个讲过了对吧?我们看下一个in容器使用Linux namepace,所以相对应用程序的容器来说,可以具有不同的文件系统视图,因此他们能够具有访问的权限,而应用程序则不能。这个可能大多数人就听不懂啊,对吧。想这么一个事情,假设我现在有一堆文件。这堆文件呢,可能是我们后面的一个慢C所要需要去运行的,运行的时候需要去调用的,但这对于文件呢,对于这个慢C来说,没有权限去访问。
05:10
因为这一个文件所在的目录还有一些其他比较重要的一些文件,如果我把这个目录的权限赋予给这个慢C了,那慢C后期可以随便调用这个目录下的所有文件。技术是所有文件,但是我只需要它的其中一个文件,那这样安全性是不是就会出现隐患?在这种情况下,我完全可以把它的权限赋予给英尼C,把这个权限赋予给Li尼的C,让英利的C获取到这个文件以后,写入到我们的曼C。那这样的话,Need c在写入这个文件以后就会。退出了。那慢C呢,又没有权限获取这个目录的权限,这样的话,慢C它的安全性是不是也会提高。能理解我的意思吗?可以分权限去治理。对吧。你不是数始化吗?哎,我给你他的权限,你初始化完成以后,我把这个文件给你,你就不需要他的文件权限了,很容易去理解。
06:06
没问题吧?好。下一个。他们必须在应用程序启动之前运行完成,而应用程序是并行运行的,所以in容器可以提供一种简单的阻塞或延迟应用程序启动的方案,直到满足了一组先决条件为止。这是什么意思呢?我们过来重新看一下对吧?我们看一下这张图,我们之前说过,在一个炮的生命周期里,我们假设这里面只有一个慢C,也就一个主容器。它会有自己的初始化容器,以及start stop read等等。那假设如果现在有两个不同的慢C存在的话,我还有一个慢C,他也会拥有自己的in need c,多个start stop read等等。我想表达的是什么含义呢?
07:00
假设我们现在就有两个pod啊,就有两个容器,一个pod有两个容器,我们可以过来画一下图给大家看一下。现在。我有一个大。好。里边呢,运行了第一个我们的。容器。第二个。两套,第一套容器是我们的MY。第二套容器是我们的。阿帕奇。加pip的环境。那最终他想要的结果应该是阿帕奇访问到MYSQL获取数据,对吧?好,虽然我是这样定义的。容器也是有先后启动顺序的,先起第一个,再起第二个,对吧。那问题来了,虽然他是先起的,他是后起的。
08:01
但是这个启动顺序其实是非踌的,并不是人为去调用的,对吧,你说K8S系统调用你说有多快。所以基本上他起的话,他就已经启动了。那会出现什么问题啊?可能阿帕奇加PP它启动稍微快一点,它就立马能够被访问去连接MYSQL了,结果MYSQL现在还没有启动,还没有初始化成功呢。这时候就会报错了。那报错这里面的检测机制可能会认为,诶连不上,是不是容器出问题了,然后退出吧,那整个pod重启重启重启重启。是这个意思吧。所以在这种情况下,完全可以在。我们完全可以在这里,在我们阿帕这里对吧,加一个英尼C。加音乐C。这个的C呢,可以去检测探测这个MYS是否正常。如果正常的话,就退出循环。退出容器。那只要是检测这边正常退出自己的容器,退出完成以后,就阿帕奇就开始启动了,阿帕奇启动成功以后买车,因为都已经启动成功了,因为我这里有探测啊,对吧,所以我就可以启动去连接了,这样是不是就不会造成某些环境的意外。
09:15
能理解我的意思吗?当然我这里举的例子可能稍微有点不恰当,原因是什么呢?因为他那连接的话,哪怕出现意外,是不是也不会报错啊,也不会退出对吧,那在某些服务的依赖性比较重的情况下,那极有可能出现这种方案,以你的C也是我们的一个解决方案。也可以这么去使用,完全没有问题。好。那既然你的C这么重要。那到底怎么去实现呢?我们过来看一下对吧。好。那这里呢,给大家写了一个模板,我们可以过来看一下。首先。IPIWV1版。因为是po的类型嘛,对吧,看的pod类型mad data一行一行给大家解释一下哈,Name这个pod叫什么叫MYAPP杠、pod labels标签有哪些?第一个是APP等于MY,如果你想有多个的话,直接在下面写即可,比如我,对吧,冒号。
10:19
记住哈,这一定是英文的,唯一这样随便写可以有很多很多个好,然后接着我们就把它删了哈。Spark描述信息,详细的描述信息,Contain第一个容器内幕,对吧,叫map contains,那用了镜像的是bey bos bay boss呢,是一个非常小的封装我们很多工具的这么一个仓镜像。那我们可以给他command,就是在这个镜像启动的时候,给它赋予一条命令,用来取代CMD的命令。需要注意一下可以被取代CMD的命令。好,SH-C运行什么命令呢?叫echo the APP is running,然后呢,OS结束完成以后休眠六分钟。
11:05
好,又来了一个in con。也就是在我们想为这个容器赋予初始化容器的时候,在这里就可以用一个in了。杠name第一个初始化容器叫杠mass,它的镜像呢也是basic box。然后杠c until ns lookup my service until是当条件真的时候退出循环,对吧?当条件为帧的时候退出循环,那nsup们去检测MY的这么一个。这么一个解析,也就是我们的FQD名称。然后循环对吧,输出,然后循环休眠两秒开始循环,好又定义了一个。DB。好运行的叫什么呢?叫s boss。也是box对吧,镜像好运行什么命令呢?检测的是MYDB的这么一个house name。
12:07
不能讲内蒙的吧,应该是FQ0。或叫域名检测,这个域名有没有解析成功,如果解析成功的话,那就退出循环,如果没解析成功的话,输出这么一句话,然后休眠两秒,再检测,再休眠,再检测,再休眠,直到这个麦DB能够被解析,跳出循环,那这个印尼的进程是不是就结束了?也就意味着在这里给大家解释的是现在有两个不同的in尼的进程。对吧?好,我们把这个命令给大家执行一下,当然我们现在是不是在我们的仓库里还没有我们的PUSE,对吧?我们可以把我们仓库打开这个仓库啊,其实现在我们用的地方不多,主要想给大家演示什么呢?演示的是这个K8S集群啊,到底怎样跟你的私有仓库配合起来,之前很多学生在一直在私下联系,我问杨哥怎么跟我的哈,怎么连接的时候会出现意外,其实他的主要解决的思想就是。
13:07
K8S毕竟是调度dock的嘛,只要do能去访问到这个哈。K8肯定能访问到啊,所以我们是不是添加了一个安全认证的仓库即可解决这个问题,那包括后面呢,我们还会给大家讲一个cigarette怎么去访问一些私有仓库,需要借助到我们这里的HUB去演示,那其他的实验呢,大部分情况下我们是不需要它的。那我们可以提前把这个镜像下载一下。P,呃,叫I boss。少了一个叉对吧,好,我们稍微等一下。当然我们也可以不先下载,让它去运行的时候自己去下,但是我这里的网我不知道快不快,我提前把它下载下来。对吧,非常小,就是封装了一组命令而已。
14:01
好,那这边我们也把它下一下吧。因为我不知道最终会运营在哪个节点,对吧。当然还是那句话哈,你不提前下也可以,因为我们这里现在我的网比较差,所以防止等会要下载失败,我再重新守一下,比较慢,比较耗时间。那在这边呢,我们就可以去写一下。你你,他。Pad加mail对吧。我们可以把这里的命令给分过来了,每一行都带大家解释了,一定要知道每一行的含义,对吧?好。别嫌我啰嗦啊,我再讲一遍,我们现在的主要的思想就是先运行了一个pod这炮的啊圈运行了一个。呃,对,Pad pad里面呢,有一个主容器叫map。麦可能呢,使用的是BA bos的这么一个镜像,这个慢C呢,在运行的时候主要输输输出的一段话叫做。
15:00
The APP is running对吧?好,然后就开始休眠六分钟了。也就是六分钟之内,这个容器不会退出。好,然后呢,又定义了一组初始化,叫英尼容器INC定义了两个不同的初始化容器,那它先初始化,它在初始化是这个意思吧。那在这个初始化容器里使用的使用的镜像呢?依然是我们的besy boss,依然是BAS boss,然后让它在启动的时候进行一个反向循环,对吧?就是当条件为帧的时候,什么条件呢?Ns lookup去解析my service的这一个。主机名。那这个主题名呢,或者FQ0名称呢,其实跟我们的后面定义的这个SVC有关。因为我们之前是不是给大家见过有个叫做DNS服务,对吧,DNS服务会把我们的一些po的啊,比如deployment啊,比如MMVC啊,SVC啊,这种东西会把它解析成对应的IP,也就一旦我有这一个SVC了。
16:06
那我们的K8S集群内部的DNS就会把这个SVC解析为IP。能理解我的意思吗?所以我们开始检测它,探测它,哎,到底能不能解析,解析成功。就退出循环了,那第一个初始化技能就没了,解析不成功,输出一段话,然后修眠两秒以后再去进行第二次循环。以此类推,那第二个呢,跟前面的一个不同点就是它检测的是MYDB的SVC。那这样讲相信大家应该能理解了,对吧?那我们过来把这个实验给大家做一下。好,我们保存退出city啊,Create。杠f create创建对吧?杠F从哪个文件去指定,从我们的pod加ma文件去指定回车。Already said,这个pod已经存在了,对吧?我们去看一下我们当前用哪些pod,我们把这些pod给删除一下。
17:05
这里有一个deployment的控制器管理的,如果我现在只删pod的话,那deployment是不是为了满足它的预期,它会重建重建重建,对吧?所以我们都一起把它删掉。Delete。Deploy问题。好杠杠二代表删除所有的deployment。我们再跌炮的这些是不是开始退缩了,对吧,好。CR delete。我们现在基础删除pod杠刚啊,删除所有炮。当然这里的所有的含义和deploy面的所有的含义都是在default名称空间下去指定的,对吧?默认使用的名称空间就是我们的default,需要注意一下。好,我们再去get,我们看一下没了,那CU ctl GI s VC。这个SVC是不是也有个deployment,我们这里不用的,我们都给它删掉吧。
18:00
口部CT delete删除的是SVC,此外可以简称为SVC,需要注意一下。删除了对吧。那接下来我们再去create。向need回车。那CU CL git我们看一下。看到了吗?瑞就绪了吗?并没有,对吧,总共就有一个需要就绪的结果,现在就绪值为零,那studio当年的状态in状态总共有两个初始化进程,哎,我现在一个都没成功的,能看明白吧?当然我们也可以第可不进去我们看一下。好,看到了吗。创建这个炮的成功了,没下文了,原因是什么呢?这里开始我进行我们的就绪检测,当然在哪里看一下,以你的可对吧,第一个。开始了,好。Running,那现在我们可以看一下它的日志。
19:01
CU ctl对吧,然后log查看的是谁的呢?我们看看我们的D叫什么。C log。采用的是他的。杠C,我们的初始化进程叫什么叫?In。MY是吧,我们看一下。看到了吗?这是不是解析NS洛up解析啊,解析不成功没有啊没有啊没有啊,所以他会重新重新重新重新重新重新。是这个意思吧,好,所以这边呢。他的in的C也一直过不去。那怎么能过去呢?来,我们去运行一下。创建一个SVC,看的类型为SVC,我们的ipi沃接口是V1版数据信息是这个名称叫Spark,详情是pod,有po的就要被暴露,对吧?它的协议是TCP的协议,端口是八零那。暴露到SVC的端口呢,是9376,好,我们把它创建一下。
20:07
第一个叫什么叫?点要麦。这些模板我们在后边会逐渐逐渐带大家去,一行一行读,时间长了,你自然而然就能够学会自己手写了,对吧?好,慢慢来也行。库CT啊,Create-f my service。那我们在库ctl get我们看一下。稍微等一下对吧。好,我们稍微等一下啊,我们已经发现了,对吧,这里已经进入了我们的一杠啊,这是什么含义呢?我们之前是不是在我们的my pod my pod里面去定义了两个初始化INC,对吧?好,那其中一个呢,已经成功了,原因是什么呢?C啊,Get s VC,我们在这里呢,创建了一个my s my service的这么一个SVC,这个my service s VC被创建成功以后,会被我们本机的一个。
21:10
集群内部的DNS,我们去看一下,叫做。嗯。它呢去解析到这个IP,也就意味着内部的所有容器默认都会把这两个机器的。两个机器的内部IP配置成DNS服务器,那我们的这个pod呢,会请求到这个DNS服务器上请求问哎,有没有MY的。FQ0名称呀,那如果你这里的SVC创建了MY,它就会被写入到我们的DNS,那DNS就会返回对应的数据。返回数据成功以后呢,我们在这里定义的反向循环就成功了,对吧,成功就退出了,因为它解析的是MY成功是不是就退出这个循环了,那退出这个循环也就意味着这条命令是退出代码为零的,因为正常执行成功的,对吧,所以这个阴利的第一个过去了。
22:04
第一个过去了还不还没用对吧,因为还有第二个,第二个检测的是MYDB。MYDB是不是现在还过不去,所以我们现在要去创建一下麦DB了。SVC,我们看一下好。MMYDB.ma。Cooper cityl、杠FMYDB麦。Cor get,我们再等一会儿。
23:05
还是这种敲着有手感是吧,我们稍微等一下。没有这么快。好,已经出现了泡的in need了,对吧,A麦铺诶镜像下载失败了,什么情况我们看一下。CUBA第斯CP。哪个节点在NOD01下载boss失败了?的。Dog。这里需要注意一下啊。嗯,什么情况呢?By c bos这个镜像我们后面没有用版本号对吧?它默认就会用拉提子标签保存在K8S里,如果你用的是拉提标签保存的话,他每次再去使用这个镜像的时候,它都会去从我们的仓库去下载,原因是拉的标签它在不同的时刻代表的根本不是同一个版本,能理解吧?
24:10
我们之前说过这个概念,对吧?拉提代表最新稳定版,我十年之前的最新稳定版和十年之后的最新稳定版能是一回事吗?是这个意思吧,所以它会重复的从我们的远程的镜像去下载。那所以以后大家尽量用镜像,能不用拉的就不用拉,能理解我意思吗?哪怕对吧,虽然是拉,你可以给他改一个。改个标签,我们改成一个V1VR等等,只要是拉的,它就会默认从远程去荡,需要大家注意一下。我们再看一下。已经装订了对吧,虽然下载一次失败了,它是不是重复去下载,下载后面就已经成功了,那这样的话,两个英need的进程的实例是不是给大家减给大家演示好了。对吧,我们在。In,你的C里面有两个定义了两个利尼的C。
25:02
都能正常被执行,并且你发现如果英语的C没过的话,我们的主也就是慢C根本都不会被运行。相信大家对英你的C的一个概念应该建立了,没问题吧?好,那这就是我们的C。
我来说两句