大家好 我是柯比今天来跟大家分享一下就是构建高效的辅网格使用MoreBridge的EBPF来加速主要是Aband的这一块东西其实刚才关于Aband的模式其实刚才包括其实华为阿里包括英特尔的其实很多讲师已经讲得很透彻了其实我这边也就不用太过多介绍稍微过一下因为对反正Aband的模式大概可能加个部分就是类似这样的就是通过杰林代理加上Waypoint的这种模式去做那个四层气增分开的一个处理对然后呢 我今天呢其实主要就是来讲一下就是可能也是EBPF相关的但是呢可能和就是和社区官方的那个EBPF模式可能有一些可能有一些不一样的地方所以我们来一起看一下然后比如说这个图呢其实跟之前各位老师分享的也差不多这个只是大家的表现形式可能不太一样就比如说我们从一个对 算不用了就是比如说我们从假设我们想要从一个两个破的在节点之间访问比如说史丽普想要去访问Halloween的那它的一个流量路径比如说它是从破的出来然后会到主机的一个破的网卡上经过EBTables或者Ebset这样的规则然后把这个流量转到自己的Retellers里面去然后转到Retellers之后再通过Retellers里面的EBTables做那个Tproxy把流量转发到做透明代理转发到Retellers的应用里面去然后Retellers里面自己处理业务逻辑可能是本节点也可能是其他节点比如说后面会通过HBong的这种方式做隧道将流量转发到其他节点然后在对端节点上比如说可能会做一些处理之后到具体的业务破的其实大家可以看到就是整个这个念路它其实算是比较长的就是怎么说呢就是节点代理模式嘛因为它有的这种模式就是它其实从一个破的的流量一个流量从破的出来它是会经过很多的可能也叫工序加工吧就是经过各种转发和处理比如说当然细节比如说它出来可能要打一些Mark然后通过IP入口各种方式去将流量转发到Retellers里面再去处理吧其实这个过程呢因为其实像刚才其实也讲了其实像社区的这种IP Table做Retellers这流量转发这一个方案其实有很多个问题吧包括其实之前的老师也讲过就是它其实适配性有很大的问题包括比如说它对社区很多一些CNI特别是一些比如说用了IP Table的规则或者这种东西的时候会产生一些比较大的一些冲突其实可能到目前也没办法适配很多比较就是比如说像Galico或者一些模式可能都不能很好的去适配那这也是APen的这种模式呢就是因为它要通过主机网络那用了一些主机网络比如说其他CNI用到的比如像IP Table这种技术站之后那就势必会引来的问题因为大家都用了同样的技术站都产生冲突又因为比如说IP Table它是自带顺序属性的它要各种练那你如果你的这项练没有在你希望的这条路上去生效的话那就会有问题那可能还有一些比如说CNI它本身它也会做一些测量路由的情况下那这个东西就可能会可能也会就是很难去处理所以说这也是目前就是也不是目前就是之前在IPen的模式拆出来的时候就是也遇到问题就包括呢其实前段时间刚才前面的李淳同李淳刚才也讲了就是包括Estudio在后面引入了EBPF去做流量转发当然这个模式呢我之前也有和他们一起就是讨论过就这个方案呢大致呢其实简单描述一下了其实主要的一个点呢其实还是用EBPF用TC在挂在那个主机上的破网卡的上面去然后呢去代替原有IPTables的能力去实现一个流量的转发这一部分呢其实相当于就是就是把以前最容易出冲突的那一部分吧就是给换成了EBPF就相当于我以前比如说一代IPTables去做规则那现在我把这条路给换掉我直接当它的其实刚才准也讲得很详细了这其实是就是我当流量出来的时候到主机网卡的时候这个时候呢可能我根本就还不需要把IPTables的内存它直接在挂在主机网卡上的EBPF程序就用TC这一块去做流量的一个处理然后呢将它出来的流量进行一个相当于是叫TC Redirect就是直接将符合某一些特定其实如果是出口的话其实只要就是理论上来说你如果是Returnal里面的这些破的因为它之前已经通过CNI这一块进行过判断了那它这一块就是这个TC程序一定是挂在了就是只是被EBPF模式管理的破的下那如果只要是有TC的这个程序那它也不用去判断说我的这个破的是不是需要处理那肯定都是处理那它就通过通过EBPF直接将做TC Redirect直接将它的一个这个数据包给重定向到Returnal的Returnal因为它也是个破的嘛它也在主机上有那个破的网卡所以它会直接将它的流量Redirect到就是左边左下角那个就是它的一个网卡上去然后再通过破网卡到破的内部这个时候其实它只是就是EBPF到这里就是基本上它的一个作用就完成了然后它在里面其实还是要运用比如说Tproxy运用破的内部的Tproxy这一块将它的这个流量从内合copy到比如说Returnal的业务应用里面所以它是这么一个路径其实在这种模式下就相当于就是它可以解决很大一部分可能之前可能不能用那些生涯的一些问题或者说它其实还可以就是刚才展示过了嘛就是它可能能带来一些性能上的一些提升因为它直接走copy的话会就是会对那个相当于流量路径变短就它不用去出现非常少的东西对网络的延迟啊包括它的TPS可能都有一定的提升这个方案呢就是其实也是非常OK但是对 总体的方案其实就带来的也很清楚刚才其实讲的也很清楚就是可能大致是这么个东西然后出去的那边呢其实就没有什么特殊的一些变化其实还是走以前的一个逻辑对然后至于说EBPF的细节就比较那里面怎么做了其实我们刚才也讲过了那其实这个问题呢当时其实因为其实Malbridge呢这个项目其实也做了一段时间我们其实也一直在做EBN出来的时候我们也一直在考虑支持这个方向这个方式呢它其实看着也就是挺好的就是它能就是弥补很大一部分就是和深爱的宗罪好或者说在做加速做性能优化也好其实都挺好然后呢但是呢它其实还有一个问题吧就是这个也是我们Malbridge这一块当时最开始也没有可能没有做类似的方案的一个初衷就是其实因为它的一个核心关键就是在这种模式下就是它其实都是依赖不管是之前的IPTOPO还是现在的比如说像EBPF这种模式因为它其实都依赖就是要有Port Wang卡就是因为TC的Redirect它只能在同一个网络命名空间去进行Redirect它不能说跨网络命名空间去Redirect所以说这就要求就是说流量一定是要到主机之后然后都在主机这个命名空间网络命名空间里面在它们的网卡之间去做Redirect所以说那这种情况下其实就会带来一个问题就是如果说我们是一些就是没有Port Wang卡的这种网络生涯模型那它其实也是不能是比较比如说类似于像Marcovline或者说像一些SRV这种网卡其实这种在国内的企业其实还是有包括我们的一些东西其实还是经常会遇到的那其实在不管谁就是相当于就是目前吧至少我看着目前就是说即使Abbient模式也没办法适配这种CNI但是这种情况它可能是真实存在的可能很多企业它可能会有这种CNI的模型就它这个流量它不一定是要通过主机上再继续走一圈或者怎么样的那在这种情况下就是相当于你的就是Port和Retellers完全被隔离了两个不同的网络运动空间那它们之间的通讯也不经过可能啊就是这个看当然不一定说不经过就是这个可能不一定就是它的情况会比较复杂那在这种情况下那是不是就没办法用Abbient模式呢或者说没办法用EBP的模式所以说就基于这种情况吧就是说Merbridge它走的相当于是走的是另外一条路就是Merbridge这一块解决的其实就是相当于我们在就是也是看到Abbient这种模式嘛就是我们觉得它还是就是需要可能就是我们不能说再放弃就是可能在某一些特定的场景下的这些问题Merbridge其实很大一部分是为了解决这类的一个问题那它其实简单来说其实最简单就是因为我们没有了那个破网卡所以说我们必须从就是破的里面去下车破的里面的网卡这一块去下车或者怎么样那所以说在这个是一个总难就是在Merbridge的这种模式下呢其实它的网络路径就是其实已经被优化成就是比较简单了就是其实相当于我们从破的里面破的里面的进程发售期的流量它会直接经过EBPA或者Merbridge这一块去处理之后就是我们不需要再让它经过组织这样的网卡其实不这个时候呢就是不管你有或者没有组织的网卡那其实都是ok的它会直接将比如说你的这部分流量给塞到热车了里面就是在我们的这条电路里面呢就是其实我是没有划任何IP table或者其他相关的一些技术的就其实就是包括我刚才讲的比如说Return里面在不管是Aband的那个IP table还是那还是EVPF模式它其实都依赖比如说Tproxy去做一个流量的一个转发到Return的IP table的这个路径其实在我们这里就是它也会把它给就是也不需要就相当于是整个这条路径都不需要比如说IP table或者IP set或者Tproxy这种能力的去支撑那是怎么做的呢其实这里面的一个核心就是其实我们是想要就是代替掉就是传统就是IP table或者说网络生涯这种问题那我们肯定要就是找一些替代品比如说刚才应该是前面有有阿里的讽刺分享到就比如说它的那个它的那个我想想就是可能比如说会用IP set这种技术比如说我们要确定哪些POD的流量比如说我们需要对它进行处理或者哪些POD我们不需要在处理比如说只有Abbint只有Abbint管理的这些POD我们才需要去处理那这些事情呢我们在做在做EBPF的时候我们都需要去处理那其实在EBPF里面这个其实跟以前的那个Mabrid就是如果有停工的话可能会稍微数一点就是EBPF在内核成它其实是能力很强但是它是能力是有限的它提供的Helper函数也是比较有限的比如说它不能像我们随随便便任意的比如说在写一些业务应用的时候或者说写我们上层控制面的时候去比如说随便调什么接口也好调系统Score也好它是不提供的比如说那比如说我们现在要判断你这个流量它比如说是不是这个POD发起的那这个其实是一个比较复杂的事情或者说你这个POD是不是在EBPF的管理上或者你的IP是多少那这个东西其实是一个相对来说比较复杂的一个事情那我们这边其实就是相当于做了整个这一套东西吧就是其实我们的一个核心目的就是去代替主机的那一块主机上就是在主机网络运用空间里面它的那个IP table之后IP site的这一块或者IP rule那一块的一些能力那它怎么做呢其实主要的一个核心逻辑就是我们在业务的POD发起请求的时候我们会做一系列的它在发起请求之前我们就有一些预备众多比如说我会我会通过控制面加就是科乐城区比如说明确地知道比如说你这个POD或者你这个container它所处于它的一个状态比如说它是不是被EBPF的管理它的一个IP地址是多少那什么所有信息都会给它保存保存下来那然后当它比如说里面新建的一个进程比如说用Core或者说它的一个进程内部去发起一个请求的时候它会做比如说做TCP collect的时候那我们就会对它进行比如说会来进行判断如果说比如它是EBPF的模式那它想要发出去那我们会直接在这边进行一个处理相当于我们在它发起请求的这一刻其实在TCP连接还没有建立之前就是它在发起建立请求的时候我们会直接比如说修改就可以直接做到比如说修改它的一个目的地址这样就是直接可以修改成Retellert的地址我们不需要做任何的一个中间商那就相当于只要你的CNN能保证你的两个破的IP能够直通那你这个方案就是有效的相当于我们会直接在这边做这个事情那当然这个事情并不是那么简单比如说你修改之后它还有很多一系列比较复杂的事情比如说如何做原IP的一些保留如何解决比如说是不是会和传统来那个原有的比如说这种IPT或是MOS的一些冲突可能这些东西要解决的问题那其实核心呢就是比如说我们会通过Process Watcher去观念它的Sea Group然后去和它的那个在控制面去堵它的一些东西然后写回比如说Kerlert的Map然后当它发起请求的时候我们可以回去助理加上呢加上后面呢就是说我们做了这个处理之后其实就回到以前其实可能跟我们那个Murperage的模式比较像就是我们可以在中间加上EBPF的那个所谓Map Redirect的这种能力能够提供一个效率上的一个提升其实那这部分流量呢就是如果说看你的CNN实现就是当然有的CNN它可能还是要经过主机的网络协议站那这一块不就不是我们控制的那有的CNN比如说它可以不经过协议站对 它就是可能走另外一种方式那通过这种模式呢就是这边有一个简单的一个程度当然那个字可能比较小啊就是其实大概就是我刚才描述的一个事情比如说左上角它是控制面在干的事情比如说它会去WatchPro的呀会去读它的一些C Group的一些Info呀或者说然后会对它的一个一些那个信息进行关联对然后会把它的这些数据写入到EBPF的Map然后当右边比如说我们一个应用想要去访问另外一个应用的时候它会和柯乐陈去做一些交互比如说它会比如说如果要发起Connect的请求那我们这边会去做一些相应的一些操作比如说我们会去直接可能修改它的目的地修改它的那个目的地址那修改目的地址之后呢可能还会要做一些设置Origin的地址的一些设置Obs之类的一些事情一些绑定然后可能还有后续很多比如说包括为了后续做那个Circular Redirect而做的一些前置准备的一些事情最后呢可能就是说我们就可以直接这个流量处理完成之后呢它就会直接这个流量会就会直接到那个Retro的那个设定的端口这样的话呢它就相当于因为我们就是我们之前说嘛就比如说在Retro的颇度里面它其实还有比如说Tprox的模具因为本身可能这个流量到Retro的时候它可能目标地址就在传统的那个IPTF或者EBPF模式下就是流量包到Retro的或者说它的一个目标地址都还是那个就是原始的目标地址嘛那在这种情况下如果说我们不去处理的话那可能Retro的根本Retro的应用根本就收不到这个包所以它要接触Tprox这种模式把这个包做投明代理到这个Retro但是呢在我们这是Murbrid这种EBPF模式下其实相当于这个目标地址它已经是变成了就是Retro自己的IP加装口那在这种情况下它其实是就根本就不需要Tprox的模式去生效或者怎么样它也能够就是流量包能够直达Retro的EBP就是当然它也其实也不像以前就是可能看来是模式或者怎么样了它是一个准直达到这么一个模式对然后后面的话其实就包括它跟比如说Retro或者Retro或者Retro Web和WebPoint的之间啊这种模式它其实这些路径呢其实就没有什么特别大的区别还是走以前的一样因为它这一块也没有特殊的一些规则的一些事情所以说整个通过这个事情呢就是能够做到就是说我们在基本上是可以在任何CNI的这种模式下板就是能够实现一个就是很好的Z7N这种模式就是不用再去挑一些东西或者说我不用再去引来底层的tproxy模块就能够实现这个东西对但是呢这个东西呢它也不是就是说一下因为前面说的很好啊它其实也是有一些问题的就比如说第一个是那个Original SRC这个是个什么东西呢这个其实是另外一个事情就是Avent模式它其实有一个比较挺好的一点就是它比如说你在你的流量经过Retro再到比如说Sniff经过Retro到Halloween了之后呢它其实在模约情况下是能够实现一个就是我能够直接在Halloween了一次看到原IP地址都是就是EWP而不是Retro的就它是借助了一个Original SRC的一个能力但它这一块是依赖那个tproxy模式去实现的就它是依赖一个tproxy模式实现的所以说就是相当于本来从它会相当于就是它在Retro就是相当于Retro发到比如说发到12个端就是发到目标端的一个这些IP它是被特殊处理过它走Original SRC这样可以做到一个原IP保留的一个一个地址但是呢可能在我们这边就是这一块呢有方案但是可能目前我们还没做其实相当于从如果走了Murray的这些东西呢可能就是我们在那个如果是视存这一块的话就可能比如说从Holo的那边看到的就是Retro的IP就是可能是有这么一个问题但这一块也有解决方案只是目前可能还没做那第二块呢是那个redirect就是EBPF的Message Redirect和那个Zero Copy的一个冲突的一个问题就是因为我们知道嘛其实比如说如果是两个发起端和就是Client和Server如果在同一个节点那还经过自己的Retro的话其实其实那个Retro在这一块有一些特殊优化比如说它会走Zero Copy就是走那个Zero Copy把那个Downstream和Upstream直接连起来会因为因为那个Retro它其实定义是一个视存的一个主要是处理视存流量嘛所以它其实也不需要做太多的一个协议解析所以说它会直接通过Zero Copy在那个底层将那个就是Downstream和Upstream的这两个Connection进行连接然后让它们直接去Copy数据就会有这个优化嘛所以在这三上的这个东西它和BPF的Message Red Rect这一块是有一些是有一些因为它们功能其实有点类似嘛就是有点冲突或者怎么样其实这一块还目前来说就可能还不能很好的一个工作就是当然这个不能很好的工作不是说我这个功能不能用或者说不能怎么样只是说因为Message Red Rect这一块它主要是去做一些性能优化的嘛那其实只是说因为这一块你如果就是目前的种情况下因为Zero Copy都是开的嘛那其实相当于就是这一块还是只能用就是Zero Copy这一块的能力就不会用到那个EBPF的Message Red Rect的能力就是相当于就是我们对比一下就是其实就是社区的EBPF这一块方案它其实是通过那个TC的Red Rect去做一个在网卡之间考备数据去提高它的一个通信效率的这么一个能力然后Murbridge这一块它是通过那个就是EBPF的那个Message Red Rect这一块来实现两个进程之间Socket的一个直接考备数据的这么一个同学主要在两块有相似之处但是呢可能就是说其实可能在一些场景基本上可能差可能也没有什么太大差别只是说就可能Murbridge从一些通用性来讲就可能希望它能够在更多的场景能够用到而已对然后呢这一块呢其实就是Murbridge的一个就性能和严实吧这个可能不是非常的精确但大致呢就是可以看到有一些提升但是这一块呢就是没有提升特别大就是这个确实就是可能可能还需要仔细去研究一下这个也是目前的那个吧或者说可能看起来还没有之前的就是就是单分二式就是那个打所以可能也是就是可能后面可能有一些点嘛就是也有可能是目前不是非常的完善就可能后面我们要持续加强和一个性能化包括可能也有可能是我们测试的方法或者什么样的有一些关系吧但是这个因为是前段时间才做所以说还没有做得非常仔细对对然后其他的话我这边就暂时这么多就可能大家如果要可以关注的话因为这个也是一个Sense of Sandbox的一个项目就大家如果关注可以看一下或者交流一下好 我这边就等下谢谢大家有什么问题吗哎 特别你好那个我真的想问一下就是merbergemerberge的这个方案是否那个现在有考虑到说会不会把一些CNR的一些network policy啊之类的东西给bypassed这一块的话其实目前你的就是看CNR到底是怎么做的就是比如说像CNIM那一块的比如说如果是CNIM的那些东西它可能会有一些就是影响因为都是用EPA技术嘛但是比如说如果说一些其他的一些CNR比如说它如果用那些技术方案不同那可能是可能就没什么特别的影响这个得看大家就是谁生相嘛但是我们这边其实是就相当于是一个直接修改目标地址嘛还可能会就是有影响但这个东西确实不是非常好说比如说它如果比如像一些像卡里克它有些东西比如说或者一些其他东西它通过在主机上做IPTables那其实也可以也可以申请就这个比较复杂我不能就是那个好 谢谢感谢分享啊我这边提个问题其实刚才您这边提到说我们是把那个透明代理拿掉了对吧然后数据包是直接把目标地址改成了Zetano的泡的地址对不对那这个过程当中是Zetano是怎么去知道这个原始目标地址的或者说这块您能不能详细介绍一下谢谢这一块是这样的就是因为因为Zetano和业务破的发起破的它肯定是在同一个节点上对吧它肯定是处于同一个内核就是Zetano这一块它就是它其实有一个东西这个是内核在面有个叫结果叫SoccerOpt叫做OriginalDist就是OriginalDist就是原始目标地址就是它你在比如说建立年纪的时候比如说那个业务破的或者Zetano建立这个年纪的时候它不是有个支援组吗那它可以通过掉内核的那个GetSoccerOpt去拿到它的OriginalDist你把这个你自己连接看到的这个支援组传给内核然后内核里面会有一些相关的那我们这边是通过比如说因为都是通过EVPF做的嘛那EVPF这边会去Morconic GetSoccerOpt那个函数然后它当它比如说在查询我这边有记录因为我会把这个原始的目标地址记录在我的EVPF的Map里面那如果我查到了那我会把它直接的原始目标地址给你对它是这么一个实现的对所以说就是我们是用了一个EVPF程序然后用了一个EVPF的Map把它记下来了是吧对了对了OK好谢谢好那那就先这样大家如果有问题可以先下交流