00:02
各位战友大家好,今天呢,咱们一块儿来看一下coopertti的service暴露。本次课呢,我们从以下几个方面进行切入,首先我们要了解service为什么会作为K8的网络重要组成部分。第二,Service的定义、作用以及它解决了哪些问题?第三,Service的工作原理,它是怎么匹配到后端破的是吧?流量是怎么样流转的?第4 service的类型,对应的类型是由哪些使用场景?第5 service常用的配置参数有哪些?首先我们来看,我们先设想一个场景吧,我们之前学到过,破者的IP其实不是固定稳定的,对不对?可能因为你节点的变化,或者说因为你扩缩容,导致你的破的IP会发生一定的变化,这个时候如果其他组件去访问你这个应用的时候。
01:03
是吧,但因为你的IP已经发生变化了,那是不是就访问不到了呀,是不是就无法保证这个业务的连续性,如果说你这个是是吧,双11双12,那你说你这突然访问不到了,你说是不是灾难性的一个,呃事故呢。来,我们再来看一下service的定义,我总结了两个词儿啊,稳定门面,或者说是统一前台,就像刚才说的pod,其实在后端来说,嗯,访问入口不稳定,但是呢,我们可以通过service来固定一个稳定的门面,或者说前台。是吧,其实是一种抽象的一个概念层,就是为一组功能相同的pod提供一个稳定统一的访问入口。我给大家举个例子哈,就比方说你去饭店吃饭,你不用直接找到后端的厨子了。你直接就告诉诶这个这个前台的这些这些人是吧,或者是服务员什么的,你就跟他说,诶,我想吃个鱼小果丝宫保鸡丁,然后呢,他就会给你去传话是吧,告诉后厨哎,你做这个鱼香有丝宫爆鸡丁,这样是不是你就直接通过了这个服务员。
02:18
就直接就是访问到这个后端了呢,是吧,后端就知道你这个需求了,对不对,其实就是这么一种概念,就是有一个稳定的访问入口来,我们继续service解决了什么核心问题呢?第一服务发现客户端怎么找到后端的破,如果破的IP频繁发生变化,是吧,导致这个连接失败。是吧?你看解决方案啊,我写的提供,嗯,那个固定的访问点,Class的IP加端口,或者是那个DNS域名客户端,只需连接该地址,无需关注后端的细节是吧?这个刚才我们经提到了嘛,就是举了一个点菜的一个例子,你跟服务员说,然后服务员给你去后厨告诉他们,哎,你要炒个什么什么菜,对吧?然后再看第二个负载均衡,Service自带一个负载的一个能力,就比方说你后端有好几个pod是吧?当应用有多个pod副本的时候,如何将大量的请求合理的分发到不同的pod上,避免单pod过载呢?内置这个负载均衡的机制,自动将请求均匀转发给就是后端的pod副本,然后提升系统的吞吐量和可用性。
03:37
嗯,我再举刚才那个例子吧,那比方说你看后厨有5个人是吧,那你说服务员过来了,喊了一声,炒个香肉丝吧。这个厨子开始炒了,然后呢?前台前厅又有客人点菜了,说你再给我炒一个宫保鸡丁吧,那你说正在炒鱼香肉丝,那个是不是你在炒宫保鸡丁,是不是就忙了?
04:01
你是不是顾不过来呀,那么哎,第二个厨子就开始炒了是吧,对吧,你看这几个厨子一一个都不能闲着是吧?来菜了你都得玩上顶,就是这么一个概念,就是不能逮着一个人,逮着一个破的猛薅,对吧?你得把这个流量和这个需求诶给摊匀了,给到后端,然后再看第三个解耦和抽象,这个怎么理解呢?就比方说哈,原来我们在比较早之前的一个部署方案当中,你前端啊,可能会访问后端的一个某个固定地址。对不对,但是因为我们通过这个service,就是把你后端的这个,嗯,一个访问入口,或者是某一个。单个的组件服务是吧,微服务隔离出来了,那你们那你就直接访问他的service IP就好了,就就就可以了,就不用说是你这个是吧,你后端可能改了个什么东西,你前端也得跟着一块儿改,那不用是吧,就是建立一种什么关系呢?嗯,你看你看我这个举的这个例子哈,在前后端建立稳定的抽象层也就在这个之间。
05:11
你这个前面改了之后是吧,我这个后边其实破的发生什么任何变化,或者镜像更新了什么的都不受影响,后端破的的变化是吧,均被service屏蔽,前端代码无需修改,就是做了一个解耦的操作。来,我们继续。Service的核心价值啊,稳定性,可用性和发现性和扩展性,好吧,这个在咱们在后边做实验的时候,你会嗯,更好的去感受一下这个service的一个工作和魅力。来,再往这儿看service的工作原理,你说它是怎么匹配到后端的标签的,呃,怎么匹配到后端的破D的是吧,你说一个集群那么多破的。
06:00
而且那么还那么多service是吧,那你说是他是怎么关联到自己。就是所需匹配的这个po能力,就是通过标签选择器,我们之前讲到过对吧,我们应该在讲RS的时候讲到过这个概念,通过label select标签选择器,也就是说你service的标签一定可以和pod的标签做子集匹配,比方说你这个service定义的标签是吧,K8S冒号V1,那你破里面一定得有一个这个K8S冒号V1的这么一个标签,不然的话你无法匹配,只有你匹配上了以后,我们再看第二点end point匹配上以后,这个service会把你这个后端的port加入到这个endpoints里边。动态维护嘛,Service绑定的这个破的一个关系,那不然的话你是不维护是吧,你这个破都坏了,那不之前的问题还不还出现了吗?你这个服务中断了对吧,所以说他会实时的去维护。
07:06
你是匹配到了哪些,然后哪些破者的IP呢,就会被写到这个enterpoint里面,然后再看cooper PRO运行在集群里所有节点的网络代理,这个该怎么理解,就比方说嗯,流量过来了是吧?他会先查一下这个end point, 就看看后端有哪些pod对吧?就比方说我这个NOE2上面有一个这个D,那它就会这个转发到NOTE2上面。是吧,然后NOTE2就是通过这个cooper policy, 然后再转发到这个对应的po上面知道吧。然后我们再来看标签选择器,嗯,这块已经说过了啊,就是一定要和pod做一个子集匹配。Andpoint后端动态的一个清单是吧,刚才也讲到过了,实时维护后端一个IP。
08:05
节点调度员是吧,大家记得这个地方我多强调一点啊,我们现在游戏我记得应该是1.23以后吧,还1.24以后,我们现在都是用IPVS的,因为这个嗯,根据一些个使用场景吧,和一些个部署经验来看的话,IPVS在转发效率上会更高一些。当然了,现在。用的比较多的IPC boss和IPVS这两个啊,这个其实嗯,对于一般集群来说的话,这个不是很明显啊,大家知道一下就可以了。然后我们再来看第这个service的类型,Service类型一共有四种,第一种是class的IP集群内部通信,就相当于是把你后端的这个pod呀,就是生成了一个VIP出来,知道吧,我们就是通过访问这个VIP能轮询或者说反向代理到后端的port的,它就是这么一个身份。然后再看这个note port集群外部访问note portd是在每一个note节点上都开了一个端口,我们又可以通过这个note节点的IP+note port访问到后端的这个pod。
09:19
然后再看load balancer, 这个需要结合公有云的一个,呃,LB负载均衡去做使用,这个相当于也是生成一个VIP嘛,然后去转发到后端的pod是吧,只不过这个是嗯对公对外暴露的。然后再看external name, 这个是访问外部服务,就是通过返回一个c name记录,将集群内部的一个service相当于是映射到集群外部的一个域名了,就比方说我集群内部可能是需要访问一个外部的一个什么服务,对吧?我们也可以通过external name这种方式,然后去访问到这个外部的服务。
10:00
嗯,克拉斯IP这里刚讲过了,好了,这几个地方我就不再展开了。好,我们再来看一下service的常用配置哈,API version这个就不说了啊,就是定义核心组合版本,然后kind的是类型,medata.name, 这个是原数据,我们要给一个这个类型的service起一个名字,然后select标签选择器很重要啊,用于匹配到关联后端的这个pod,然后typeb typeb, 你这个是什么类型的呀?刚才我们是不是讲过4个类型,有克class斯的IP的,当然class的IP是默认的啊,还有noted note balancer, 还有external name. 然后再往下看,我们要定义一个端口组,端口组里面有三个。非常重要,我们这个需要记一下,第一个是也就是service暴露在service service暴露在class IP上的一个端口,相当于是集群内部就是访问这个class的IP+pod这个端口。
11:03
对吧,然后你就可以转发到后端了嘛,然后再看下一个target port target port相当于是嗯。流量已经就是通过service接收到了,但是service通过哪个端口给出去呢?就是通过这个他给的po,相当于是他给他泡的,就是相当于你这个容器里暴露的一个端口。你知道吧,就比方说我们有一个网站服务N也好,或者是阿帕奇也好,通常啊,我们我们就说常规的一个标准端口是80,对吧,那你这个target就得写80,因为你这个容器。对外监听的就是八零。是吧,这个很好理解哈,然后我们再往下看note part note part这个地方就是第一个就是你在note节点上要开的一个静静态端口,就方便你这个集群外部的访问,你这个node节点加你这个node pod来访问到后端的pod,然后再往下看,这个是亲和性啊,因为为什么要提到一个亲和性呢?因为设置为class塞PE的时候,实现来自同一客户端的请求转发到同一IP,就是同一个pod,相当于绘画粘制。
12:20
这个怎么说,因为有的访问好像不是说每次都需要说,就是做轮询的,就比方说我有个什么服务需要长连接是吧,我就可以通过这种方式,就是转发到后端一个pod,因为后端一个pod,同一个pod可能会存在我的一个连接的信息,或者是一个缓存信息是吧,考虑到这一点,所以说你看这个参数其实非常重要的,嗯,主要就是这些,然后PPT部分呢,就已经结束了,下面开始我们的实验环节。
13:01
好,各位战友,我们开始实验环节,我这里呢准备了几份压模,首先我们先来看一下class的IP类型,Service的样本文件,前面API version kind的vegetable data, 然后这些东西我就先不讲了哈,因为这个之前已经讲过很多次了。然后我们重点看一下这里match labels是不是要做一个匹配标签的动作,对吧?我这里定义的两个建制,对,APP engines, 然后typeb class IP, 对吧?然后又开始起一个破D的模板,是不是直接又匹配了上面这个标签的,这就相当于是做上匹配关联了,让我这个service知道我后端的破的,诶,是哪个呢?是这些是吧?我们看看我用的是什么镜像啊,用的是一个in的latest,然后镜像拉取策略是if not present的意思是如果本地有就用本地的,如果本地没有,就从远端窗口拉取,然后这里的端口,我把容器的80端口进行一个对外的。
14:01
暴露,然后呢,我们通过三个连字符,诶,就是相当于是一份压迫文件里面我要起另外一个资源了,我们一起来看一下哈,API version v1,这是service的核心组合版本,然后kind就是service,然后measure data name INS IP杠,Service这个就是service的名字,然后SPA定义,定义一个规格,Typeb类型呢,就是class IP类型,当然了,你不写的话,默认其实也就是class IP也可以不写,然后select匹配上面的那个po标签是吧。你看是不是一一对应上了APP n typeb class的IPAPPN,然后type class IP是不是对应上了,好吧,这个比较好理解哈,然后定义的一个端口组是吧,然后service端口,嗯,对外暴露的是80,然后target port是80,相当于是八零生物转发到后端容器的80端口嘛,啊这块比较好理解,来我们一起来执行看一下库边CT ly a p ly-F,然后克IP点回车。
15:14
好,然后这就创建成功了,后们来看一下库CTL get port, 好两副本是吧,起来了,然我们再来看一下service的状态,Get service, 当然了,Service的话也可以简写啊,SVS就可以好吧,回收是不是创建了一个NS-class IP-service的这么一个service类型的,对吧?来按照我们的预期哈,我们访问这个class IP, 这个VIP是可以就是轮询后边的pod的,对吧?来我们一起来看一下效果,看一下啊,10.0100.255.21访问成功了吧,但是这个轮询效果是不是不是很明显,来我们想一个办法啊。
16:02
嗯。库泊C库泊尔CTL改或我们进到这里面去,CT Le ex exc a进到这个里面去,哎,然后刚刚比一下的SH,嗯。EXECTLAEXE.杠it,我看我看一下我这命令哪里有问题哈,Exec-it,然后的名字杠杠。哦,这样的,我刚不好意思啊,刚才少写了一个空格,好这样我就进来了是吧,然后我LS我看一下,嗯,我这个路径应该是在user,然后是share吧,然后NSHTML,对这里哈,好我先进来,进来以后我艾CHO一个,嗯,艾CHO一个一点HTML是吧。哎,扣个什么内容呀,哎,扣个一吧。
17:02
追加到这里面好吧,这就算完事了,后退出来。好,在位进到另外一个坡的。另外一个破纸的名字叫这个好复制上粘贴同样的命令粘过来,然后IO,这个等于IQ2。好。然后我再退出来。就相当于是我在这个put里面一里put的1和2里面都创建了一个一点HTML,然后这里面的内容不一样,我们可以来看一下这个区别哈。好,然后这个得输数,然后一点HHTML回收21211是吧,是不是可以看到变化,说明这个service是给我在做一个负载均衡的,也就是说并不是其中的一个pod一直在承接流量是吧?通过这个实验我们可以看到这个分子均衡效果还是比较明显的,221122212121212对吧。
18:13
好,然后这个就是class IP的一个作用,好,这个实验我们就可以了,De到F,然后我们再来看一下note的效果啊。好,我cat了一个note po的雅M文件,然后这里是API version, 这个不对,不再赘述了,同样通过match labels去匹配标签,好吧,然后镜像的话还用的是一个这个基本上起这个pod的这个是没有什么变化的,我们主要看service部分kind的service,然后给service起了一个名字N这s note port-service,然后typeb写的是note port啊,注意啊,这块一定要区分大小写啊,首字母是要大写的,这个N和这个P是要大写的,然后再你看右select匹配标签,然后定义端口组Ford,相当于是service对外暴露了一个,然后target port是容器的端口,然后note是你这个每个note节点上起了一个静态端口,好吧,当然家这个可以指定啊,区间是3万到3,嗯,0767应该是,嗯,好,我们一起来把它起下来。
19:27
他累啊,No the port回正来先看一下port的状态,Get port, 好啊,好好,都说你了是吧,然后我们来测一下啊,嗯嗯,负载均衡我们就不测了,我们主要是通过集群。就是访问这个集群节点的IP+note,然后去访问到后端。啊对,然后我把这个输出出来杠O。Y的长长格式显示是吧,一个调度在了WORKER2,一个调度在了WORKER1,这个时候我该怎么访问呢?我可以通过C2L,我在master节点通过这个克命令,看哪个呢?我克2-2是吧,好的。
20:12
A.哦,我知道了,默认访问的是那个。30080应该这样。是不是?是不是也就是说我通过node节点加这个30080成功的访问到了它后端的pod?这个呢,就是note port的一个作用,当然了,我们再把它改成1哈30080,是不是也可以访问到呀。好吧,这个就是note port的作用,DEP, 我们把它回退掉看,再看一下note balanced-f no port回退掉啊。嗯,那个叫什么来着,Of the balance, 好,我们一起来看一下样本文件,前面这个还是一样的,就不再赘述了,然后主要看service部分,嗯,起一个service service的名字叫做N,这杠LBLB就是load balance的缩写,然后杠service,然后type写的load balance, 注意大小写区分,然后select做的标签匹配,然后暴露的端口,这个service集群内部暴露的是不是说集群内部啊,就是暴露的是80端口,集群内集群外都是对外暴力的80,好吧,然后target的相当于是后端这个容器的对外暴露的80端口。
21:38
好,然后我们给它执行一下库CTLYKTLY-F啊,当然了,这个我没有办法啊,就是给大家彻底的还原出来效果哈,因为balance这种类型的service,它是需要依赖公网的food子均衡的。Get service, 所以说它这个external,也就是外部IP,它一直是painting状态,因为它依赖这个外部的负载均衡嘛,所以说它分配不到这个对应的VIP,好吧,这个大家知道这件也就可以了,当然了,如果你们后期在环境当中有这个公网的LB的话,那么这块是可以分配一个VIP出来的。
22:26
好吧,然后通过呃外部访问这个VIP,然后加80端口就可以成功访问到后端的破了。好,这块我就回退了,De-F,然后road balance, 嗯,好,不好意思啊。好回收,然后我们再看一下最后一本要某external name.External name不用起po的,因为它是直接就把这个映射到外部的一个服务了,我们一起来看一下啊,K起一个service,然后name叫external-service,然后typeb是external name external name, 哎,开始定义了,你要映射到哪儿呀,我这里写随便写这个,当然呢,我们要后期就根据实际的来,我随便写了个DNS,点baidu.com。
23:18
好吧,来,我们给他看一下它的效果吧。嗯,哎,不对,这个叫external内,其实这个因为我现在这个环境啊,是一个内网环境,所以它并不能解析到外网,我们主要是讲一下它的原理。Service.大家来看哈。啊,这个已经生成了,对吧,也就是你这class IP是空的,你这个你看外部IP是可以解析,这个就相当于是什么呢。比方说你集群内部某个组件是吧,需要访问外网的服务,那么你就可以通过这个连接到它对应的服务。
24:02
是吧,相当于是你嗯,找了根水管子是吧,连接到公网去了,好吧,这个也比较好理解,然后。这个状态的话,呃,不是说状态啊,类型的话就是这4个已经给大家做过一个详细的解释和演示了,嗯,本次课就到这里,感谢大家的观看,我们下次课再见。
我来说两句