00:01
各位战友大家好,今天我们一块儿来看一下and point.本次课我们从六个角度进行切入,第一,为什么需要endpoint?第二,Endpointent的核心概念,第三,底层工作原理,第4 andpoint slice的新架构,第5,实战场景应用,第6,牌照与最佳实践。首先我们来看一下为什么需要endpoint。概述是这样描述的,在coberts的世界里,Pod是应用运行的最小的执行单元,但它们本质上是短暂的。Deployment等控制器会根据策略动态的创建和销毁破D。这意味着pod的IP是不稳定的,随时可能发生变化。这种动态性是K8S弹性伸缩的基础,但也带来了服务发现的难题。
01:04
核心挑战,当一个前端应用需要访问后端服务的时候,他怎么找到那些嗯,随时可能会变得破绽IP呢?其实这种像是给一个频繁搬家的朋友寄信,你需要一个稳定的一个入口。之前我们讲到过service service提供了一个稳定的访问入口,对吧?就是为一组功能相同的pod提供一个稳定的统一的访问入口。通常是配置一个class的IP,然后我们去访问这个class的IP,然后它会帮我们转发到后端的po,对吧?无论后端的port发生什么样的变化,客户端只需要访问这个嗯,Class的IP就可以。再来看endpoint实时的网络地址簿,扮演着service的后端清单角色,实时维护着service背后所有健康pod的实际IP地址和端口列表,当被创建的时候,被动且可用的目标容器。然后再看endpoint的核心概念解析,什么是endpoint呢?就像刚才已经提到的。
02:22
本质上是一组后端pod IP和端口号的映射列表,充当了service和pod之间的一个通信桥梁。就比方说我们用户通过service class IP要问到后端,那它不是直接就可以帮你转发到后端了,它中间有一个endpoint,里边记录了你后端的IP地址和端口是吧?不然的话,你这个service你不知道,哎,你该往后端的哪个地方转发,其实andpoint就是解决了这么一个问题,然后再看service port andpoint三角关系是吧?刚才已经讲到了这里,我们再简单的看一下哈。
03:06
1定义服务规则,创建携带select的service对象,声明服务访问的端口和匹配逻辑,也就是说我这个service的匹配标签需要和后后端的这个po的标签要一一对应对吧?然后再看第二个控制器自动发现and point controller监听到事件后,立即在集群中筛选符合label标签的port资源。就像我们之前已经提到过了,什么样的pod可以被纳入service的后端呢?不是说它是个pod就可以,它需要首先它得匹配到标签,第二它得是就绪状态,对吧,缺一不可。再看第三,生成映射关系将健康的是吧,Ready的。破的地址信息实时的填充到同名的andpoint对象中,建立映射逻辑,在我们在创建service的时候是吧,会其实会自动带起来一个和service名字一模一样的and point资源里边呢,就会记录后端健康的port的一个。
04:21
地址信息,然后再看第4,动态维护更新,持续监控破的状态变化,自动增删and point中的地址,确保流量始终指向健康的实力,也就是说我后端有一个破,如果这个挂掉了。IP发生变化了,那么and会感受到,也就是说会监听到你这个发生的变化的这么一个事件,然后维护自己的一个列表。然后再往下看。Headless service和endpoint headless service是这个什么意思呢?无IP的特殊服务,通过设置class IP没no创建,是cut中不可分配虚拟IP的一个。
05:13
服务转发类型,它不依赖cooper proxy做负载规则转发,而是直接服务发现的能力交还给客户应用端,这个该怎么理解呢?就比方说啊,我们可能在部署的时候,我暂时不知道我这个class,呃,Class的IP,或者是我不需要这个class的IP。我该怎么办?我该怎么访问到这个后端破,我可以通过这个Q2DNS解析的方式访问到后端,也就是说我可以先写到先写一个嗯嗯,那个叫什么service的名字啊,然后service,然后嗯,点local,那个叫什么class IP点local点儿。是吧,大概就是这么一个格式,当然了,具体是怎么写,后面的实验环节我会给大家来详细的说,然后我就会通过这种的方式访问到后端,相当于我不记住IP了,我访问了一些一个service的域名,哎,通过他成功转发到后端。
06:14
好吧,其实就是这样一个方式,它和class的IP实现的目的是一样的,都是为了访问后端嘛,但是前提不一样,你class的IP,你最起码你得知道IP吧。但是呢,我们如果通过hand这种方式就不需要了,我们只需要知道它service的名字,然后搞一个固定搭配,是吧,Service的名字,然后命名空间后面还有一串固定格式,哎,我们写上它就可以访问到了。好吧,这块也比较好理解,再往后看andpoint工作原理解析。嗯,刚才其实已经讲到过了啊,就是监听你这个API service的状态,如果说获得发生变化,或者service发生什么变化了,然后我接收到这个变化以后,我会自动的违约货我的这个后端列表。
07:04
嗯,这里有一个组件大家也需要了解一下,Cooper proxy将流量引入终点cooper proxy, 其实嗯,也是必须要掌握的这么一个组件啊。Coopery是运行在KYS集群每个节点上的关键网络代理组件,他负责实现service的虚拟IP,也就是class IP的机制,是连接集群内部发现和实际的访问的核心枢纽,通过动态维护节点内核的网络规则,让客户端流量能够透明的路由到后端的实际实力,这个该咋理解呀?就像我们之前嗯说的哈,Service and point port三个对吧,是这么一个路径,但是and point不负责转发,他只是做了这么一个映射关系,那么谁负责转发呢?Cooper policy cooper PRO会根据andpoint的内容实时的维护你这个node节点的。
08:14
网络规则,IP boss也好,Ipvs也好,他会实时的去维护这个,嗯,转发规则,然后呢,去做流量转发,这个是cooper PRO去实现的,好吧,这个一定要掌握,非常重要。我们再来看一下endpoint slice endpointent slice是endpoint的升级版,它有哪些特性呢?我给大家举个例子哈,原来我们现在使用的哈,不不,我们不是不原来的就现在使用的endpoint,其实它有一个上限,它后端我记得应该是5000个pod,可以说就是最高啊,大概是能存5000个po的一个。
09:01
列表清单,如果说你这个某一个port发生地址变化了,重建了也好,或者是迁移了也好,怎么样怎么样,反正是你的IP发生变化了,那么那这个endpoint需要重新的更新。是吧,你这个end part重新更新,那你是不是每个节点上的cooper又得重新维护一下你本地的这个网络规则呀,转发规则对不对,那你说这个网络流量和这个IO是不是都会瞬时会变得很高很高呀,就导致一个转发的延迟和抖动。Andpoint slice就解决了这么一个问题。他是怎么做的?你看原来比方说我举个例子啊,我是100个。后端有100个pod是吧,我这个service后端是100个pod,那我把这100个pod,哎,我做了一个分组,我每个我分上,我举个例子啊,我分上25个是不是100个,我一共分了四组,那比方说我后端的破的。
10:03
我在发生一个什么什么变化,那我是不是我只维护我这个。25个25个一组的这个小组就可以了,对不对,然后我API server, 我就下发一个指令,哎,我这个是吧,组一里边的哪个谁谁谁发生了什么变化了,你帮我重新维护一下,那你说这种情况下是不是就比那种一次性维护。100个也好,5000个也好,用一次性全量维护,就是这个成本要低很多呀,对不对,我只需要还说通知,哎,我这个你这个小组那个谁谁谁发生了变化了,你调整一下,然后我节点我就会查啊,我维护的这个25个小组里边,我给谁谁谁调整一下就可以了,那如果说你之前用endpoint的话,你全量维护,那你瞬时的这个网络抖动和延迟,其实嗯。就是那个怎么说,嗯,消耗还是比较多的,对吧,其实这个就是他解决一个核心问题,他给后端的pod,也就是后端的资源做了一个分组。
11:08
是吧?然后再往下看and the point slice的设计和优势,我们再来看一下吧,核心思想是分片化整为零的存储革命,摒弃传统的endpoint单体大对象模式,将service端点信息分散存储在多个轻量化的endpoint slice对象中,默认单个andpoint sce最多容纳100个端点实例。例如一个存有一个拥有350个pod的服务会被智能的分成四个独立分辨,从根本上重构了服务发现的数据分发逻辑。第一,极致性能优化单点破的变动需更新单个小分片而非全量数据,就像刚才我们提到的,我只改那一个小组的就可以了嘛,我不需要再全量的通知更新了,对不对?这大幅的降低了API server的处理压力和etcd的存储开销,同时让网络传。
12:08
传输的数据包体积显著减少,提升大规模集群的响应速度,核心收益是更新成本从0降至01。嗯,突破规模天花板,彻底解决了传统pointent对象因数据过大导致etcd写入瓶颈,通过水平拆分的方式,理论上可支持服务后端挂载无限数量的D,从容应对超大规模微服务架构的业务需求,核心收益是从百级到万级的容量跨越。再看第三个云原生功能进化,云原生支持双站地址,同时内置存储端点的纵区和node节点拓扑信息,这位流量的智能路由、跨区域容灾以及拓扑感知的负载均衡策略提供了关键的数据基础。
13:10
核心收益是更智能的网络与调度支持。性能对比我们来一起看一下哈,Cooper的CPU负载,原来传统的endpoint是吧,全量更新,然后呢,我们后面就使用andpoint slis了,那么它优化后仅5.4%是吧,降低了94.6%的资源占用,因为他做了一个分组了嘛,所以说他这个压力就没有那么大了。然后再看第二个LST请求响应延迟,面对大量端点数据时,旧方案响应迟缓,拖慢服务发现流程提数字0.25每秒延迟缩短至83%。第三个再看第三个规则,同步速度,旧机制处理大列表时极易产生延迟,导致处理流量切换不及时,效率响应提升了10倍不止,然后呢,响应速度实现质的飞跃。
14:17
对,好啊,这说来说去其实就是这个and poent slis比较好,当然了,这个pointent slis是在KYS1.33版本以后才引入的,然后再看第4个哈单服务端点容量受限于etcd存储与处理能力,旧方案无法支撑超大规模服务,对吧?也就是你原来的point也就是5000左右,当你使用point s以后,你可以突破上万是吧,集群规模不再受限。好,我们再来看一下实践和应用,实践和应用到时候我们在实验环节给大家详细展开吧。好吧,这里就不再赘述了。
15:03
好,PPT部分就到此结束。我下面开始我们的。好,那就开始我们的实验环节,我这里准备了两个小实验哈,我们先来看一下压某文件。第一个小实验的压某文件是做一个无头服务,给大家展示这个无头服务通过嗯Q尔DNS解析到后端的破灯以及嗯实时感知,然后更新and point.资源的一个小实验啊,先来看一下这份压ma文件第核心组版本,然后要起一个service service的名字叫my headless service, 然后SPA规格class IP, 这里一定要写这个哈,No.不然的话你这个不行,你得选到的话,这才能识别成一个无头服,好吧,然后select要匹配的破的标签是什么呢?APP, 然后冒号买APP。
16:06
然后后端的这个对外暴露的这个port是80,然后target port容器的也是80,好吧,然后再看这份压脖文件,我要起一个state for set的控制器,然后state for set的控制器名字叫做APP杠,State for said.副本我要起三个副本,然后标签选择器的话也是这个,因为这个我要和那个service做关联嘛,所以说一定要满足一个子集匹配,然后service name是吧,我这里要关联这个headless service了,所以说我这里有一个service name和service name的名字呢,就写到嗯,Headless service的name就可以了,然后time我要起一个容器,容器的。标签是吧,一一匹配上了,对应上了嘛,然后spike container容器名,容器的名字叫nja,镜像是ns latestt拉,拉取策略是本地有就用本地的,本地没有就从远端仓库拉取,然后容器对外暴露的端口是80。好吧,来,我们一起来看一下库巴CTLPLY啊,CTLPLY-F,然后是诶,好,Headless, 好,先把服务起来,然后呢,我们再把控制器起来。
17:32
杠F控制器是state for三好服务起来了,然后对应的这个pod也关联上了,对不对?我们来看一下啊,CTL guide或者好都起来了,然后我们看一下这个service的情况,Guide service, 好,Service也有了,对吧?然后Class IP这一列是不是就是符合我们预期值的这个now,也就是一个无托福对吧?然后我们再来看一下对应的endpointpoints。
18:03
先看看有哪些资源吧,然后get and po INS, 我比较喜欢打这个键盘啊,于是每次我都会手打一点,好看一下。哦对对对,我我不用再输出了,我不用我的,因为我的习惯是输出一下压部文件,好吧,这里就我就不再输出了,咱们就直接看这里就可以了,这里已经把后端的地址列出来了,10.133.211.80是吧,222.126226.70,看看能不能对应上啊对杠OY。嗯,126是吧,有126211211。7070是不是一一对应的呀,那么这时候我做一个小实验啊,我比方说我,嗯。删掉一个port。Count the RP.嗯,Part的现在哪个part的第二个吧。
19:03
按理说删掉这个破以后IP是不是会发生变化呀,对吧。啊,7073,哦,这个地方有了七三,按理说我这里发生变化,是不是我的endpoint的资源也会被维护呀?来,我们一起来看一下啊,The point.I'good turn.七三是不是变了,刚才还七零呢,现在变成七三了,是不是动态监控着这个,嗯。Service的变化和破的变化呢,对吧,所以这个point还是非常可信的啊好,这是第一个。嗯,实时更新的实验就算完成了,然后我们再来做一下这个无头服务,我们通过库尔DNS解析到后端的pod,好吧,来,我们现在起一个。临时的一个小容器哈,临时的pod。啊,我这里提前准备列一行命令,我把它复制一下。
20:04
清一下屏,然后我启一下,好,我们可以看一下这条命令哈,Cooper city run跑一个什么呢?嗯,名字叫做debug的。Pod, 然后镜像拉取镜啊镜我要拉取的镜像,然后镜像拉取的策略是吧,然后我要然后起来以后我要用SH。好,我这个ns lookup ns lookup是什么呢?我的service的名字对吧,Service的名字叫做我看一下哈,My headless.哎,这里我复制过来了,My headless service是我的名字对吧,然后点儿。Default里面空间,然后这个格式是固定的哈,.svc.cluster.local, 这个格式是固定的,我们来解析一下,看看它会解析到什么。是不是成功解析到了后端的3个pod地址呢?
21:05
对吧,哎,我们可以访问一下,克一下,哎呀,我科一下什么呢?科一下这个这个是不是就相当于我的后代,对吧,我克儿一下看能返回什么。CU哦,CU2,不好意思啊,打错命令了,CU2我看一下啊,还没这名啊,不影响,最起码我能解析到,我肯定能访问了,对不对。好,这块是没有任何问题的。那也就是到目前这个无头服务的解析访问和嗯,实时监控是没有任何问题了,我们现在把环境回退一下啊,我们开始做第二个小实验,L-F,嗯,State for site先回退掉,然后再把。那个叫什么at least也给也给回退掉,然后我准备的。
22:02
这个实验我看一下啊,外部。这个实验比较有意思哈,我们来一起来解读一下这份M文件,我要起一个service,我service的名字叫做external inx, 然后我又直接定义了这个后端的这么一个端口了,端口映射是吧,这个和之前唯一的区别就是什么呢?之前我定义了标签对吧?因为我要匹配到后端的port嘛,所以我在这个service里面定义的标签,但是这个我没有定义,为什么没有定义?因为我需要手动的指定一个我需要访问的一个地址,所以我这里没有做那个标签的匹配,好吧,这块大家应该能理解。然后我这里写了一个分隔符,我要开始第二份压了,第2份压模我要干什么呢?我要起一个破的。为啥要起一个pod呢?我就假装这个pod是一个外部对吧,因为我没有标签进行匹配,所以说我的service不可能匹配到这个破的对不对。
23:10
我就模拟这个破D,哎,就是一个外部服务,好吧,然后我们来看一下这个压ma文件核心组版本,然后起一个破的破的名字叫做嗯,Fuck external in, 然后标签的话,我随便写一个,然后需要起个容器,容器的名字叫做INS,镜像NS的,然后就像拉取策略,然后容器的端口,好吧,这个已经很熟悉了,然后再看第三个andpoint,如果要做外部服务的话哈,Andpoint的名字也就是这个name一定要和service是一模一样的,这样它才能和service做到关联。好吧,然后我们再通过这个subs site定义后端的这么一个地址,当然我这里先随便写一个,先占位哈,不然的话待会儿运行会报错,待会儿我们执行完以后,我们再把这个真实的地址,哎,再改成我们真实的一个外部地址,好吧,这块儿也比较好理解,现在我们就执行一下杠F。
24:10
We know.现在我们要做的是什么呢?我们要查看一下。Pod的一个地址情况杠OY现在破的地址是不是这个呀,对吧,我们要进到这个文件里面,把它改成这个。如果你不改的话,相当于你指的这个外部地址是错误的。所以要把它改一下,然后呢,再通过这个play更新一下。好,更新了,这时候我们再来看一下啊,Get改过来没有呢?Get poor杠,Orright是不是改过来了啊不不不,不能这么看啊,啊不好意思,嗯,And poor in4请这样看一下是不是,哎,我看看n in哦,这儿有了,是不是改过来了,它的后端是不是指向了这个10.0.226.76,对吧?这也就是我们破D的地址,我这里起这个破的是为了模拟一个外部服务哈,证明了我指向的地址是吧?它是可以通过手动来指定的,我是为了完成这么一个目的,所以我起了这么一个破绽,然后用了这么一个地址,我们在实际的生产环境当中,你要指定外部地址的话,肯定是要指你集群以外那个服务的一个固定的地址,对吧?我这里主要是做一个演示,大家应该可以理解哈,好,然后完善以后哈,我们该怎么办。
25:41
嗯。我们访问一下吧,对吧,因为这个已经起来了嘛,我们比方说我们进我我再起一个pod哈,起一个pod,然后我们进pod里面,我们访问一下这个,看看能不能访问到来,我把这个。
26:01
嗯,我看一下啊,我再起一个刚才的那个b z box的波吧。好起来了,起来了以后我们访问一下哈,问一下TL啊啊可以TNE可以,那就TNE吧。哎,然后这个是80对吧。是不是没问题,绿色的通了对吧,我们看看,哎,我试一下啊,我尝试一下看看可不可以那个什么,嗯,哎看推没有看好好继续啊C2呀,我看看能不能通过这2的访问,哎呀,没这命令。你这个命令。你这命令我解析其实t net通了是吧,我既然t net这个地址的80端口能通,那我看肯定是没有任何问题的是吧,这个实验呢,也。
27:00
到这里也算是完成了,主要是让大家看到这个效果,当然了,为什么具体客人没成功,因为我没有这个命令,好吧。哎,对,我看看能不能从鸡群外边给他串通了啊。Cooperu city guide service.嗯,Service, 你看,因为我这里有一个IP是吧,我起了一个class的IP,那我就通过这个访问过去吧,好吧,CC2L,嗯嗯。Worker gig.是不是可以访问成功呀,对不对,我通过这个class的IP成功的。转发到了后端是吧,这也是依赖于我们endpoint的,嗯,一个外部映射,其实到这里的话,服务那个就是演示的话已经结束了啊,如果说大家还有什么疑问,可以在评论区留言,当然了也可以说是给我私信都可以,我也希很希望和大家做一个深入的交流,嗯,那就到这里的话,实验结束,感谢大家的收看,我们再见。
我来说两句