大家好 今天很高兴站在这里来和大家分享一下如何在Amintem Service Mesh中去enable我们的EBPF那Eris和我都是来自英特尔的一个运源生开发团队然后我们现在目前都主要致力于Service Mesh的一个开发和优化今天稍有遗憾的是Eris现在本人在美国所以她没办法赶到现场没办法赶到现场和大家来面对面的做一个交流所以今天主要由我来给大家做一个简单的介绍和分享今天我主要会从以下几个方面进行展开什么是Amintem Mesh当然这个前面已经有几个topic简单的介绍过一下然后是Amintem Mesh的data plan目前是如何工作的以及如何去使用EBPF去加强我们的Amintem Mesh的data plan最后会有一些在enabling EBPFre-direction过程中的一些lesson论的以及一些下一阶段的可能的一些方向和想法首先在我们再简单的过一下Amintem Mesh的一个backgroundAmintem Mesh是去年的9月份正式announce出来了一个实验版本然后在今年的3-4月份我印象是3-4月份然后Amintem Mesh的一个code合并录了一个主分制然后随着S2 1.18的一个releaseAmintem Mesh也进入了一个Alpha的状态目前社区正在努力的向beta阶段做一个改进和开发然后之前也提到过Amintem Mesh和原来Sidecar模式的Service Mesh的最主要的区别在control plan上面其实它没有太大的改变主要是在一个data plan上面它会有比较大的一些变动相较于传统的Sidecar模式的Service MeshAmintem Mesh将数据面从application port中彻底的一个玻璃出来了不再使用Sidecar或者一些innet container去做一些Port中网络的一些出实化和用户的application port的网络会变得更加干净这也是Amintem Mesh这个名字的一个由来就是说Port中是一个很纯净的一个方式Amintem Mesh 8也把那个四层和七层隔离开来了也就是说用Setano去做一个四层的服务然后七层的服务依然交给Waypoint目前社区的实现还是沿用原来Sidecar模式中的Voyproxy去做一个实现Setano是Sto社区去年开始用Rust进行编辑的一个轻量级的一个proxy它目前是主要去支持了一个HBone的一个Serial TrustSetano的一个代理七层的一个之前也有topic提到过七层的Voypoint它是现在转换成了一个可按需的扩展的一个七层代理这样的话就提升了一个资源调度的一个灵活度Amintem Mesh把Setacard Proxy挪成了一个社区里面介绍是一个Remote Proxy的模式这就要求我们在数据面能够透明地去解取用户的一个数据流量并且还是要去转发给重定向给Setano去做一个更进一步的处理原来Satacard模式下面我们所有的用户流量数据是在Port的一个Network Namespace中原来是非常方便的可以通过IP Tables一些如何去把这个数据给解决到我们Satacard Proxy中现在把它挪出Port之后那就对我们提出了一个要求是说如何在Port的traffic进入host network space之后把它解决给Setano这就相较于原来Satacard模式这个从数据转发层面来说会变得复杂起来也是现在目前Amintem来说个人认为的一个数据转发的一个关键问题之一这幅矿通简单介绍了一下Amintem Mesh中Application流量是如何被解决并且转发给Satano的之前有小伙伴已经更加详细的介绍了我这边再简单的过一下Application Workload就是像网上一样还是作为Client或者作为一个Server去进行一个流量的一个分发和接受在host network中我们需要对加入Amintem Mesh对应的所有的出口流量我们需要通过Policy Loot 策略路由以及IP Tables的规则把它解取并且最终的overlay通过Genev tunneloverlay到Satano中相对于Ingress流量一样对于它的入口流量一样我们也需要通过这些策略路由IP Tables去进行一个解取并且转发通过overlay把数据包原封不动的原汁原味的去转发给Satano port这里的Genev tunnel其实起到了两个作用一个是可以把Application port出来的traffic packet原封不动的去overlay给Satano这样就可以使得Satano那一侧的处理就像原来Satcom模式一样另外一个它可以通过Genev tunnel这个interface去标记Label它是一个inbound的traffic还是一个outbound的traffic对于Satano port的这边因为它本身也是一个demo set的port它的网络接口也是一个简单的VSpell的ETH接口对于它来说它其实会处理三种不同的流量一个就是Port过来的一个outbound的流量这个时候我们可以通过outbound的Genev tunnel去接受这个流量还有一个就是inbound的一个port的traffic另外最主要的一点还是它Satano本身去initialize的一些trafficNormal traffic一个是通过H bone加密的一些zero trusted traffic一个是往local port去做的一个planetest的一个request当流量被成功的结局并且转发到了Satano之后Satano会去inspectLayer 4的信息然后根据当前系统的一些control plan的配置来决策下一条到底是去往remote的Satano port还是去往waypointService doing the waypoint或是一个local的一个application port这就是主要是简单介绍了一下port的流量是如何被透明的在hostnetworkNamespace中结取至Satano也就是说我们对相近于原来Satakaproxy的一个remote proxy正如上一页slide提到的Genevue tunnel不仅把原式的数据包原汁原位原封不动的给结取并且转发给了Satano proxy使得Satano proxy可以像原来Sataka那样进一步去处理流量更进一步的两台Genevue tunnel其实也扮演了刚刚提到过它是扮演了一个label标签的作用用来驱逢inboundoutbound还是normal traffic而且目前从ambient mesh整个设计来说Satano定位于Satano定位于一个类似与当前节点application port在位于同一个hostnetwork的host的一个remote proxy那就以这样的一个场景来说的话EBPF是相当合适去解决这样同一个主机内部traffic redirection问题的一个方案吧这样也就可以进一步去减少Genevue tunnel的一些分包解包的一个overhead也可以相对应的去提升一些性能上面的优势然后在去掉Genevue tunnel之后其实通过EBPF去做这样一个转发相对来说也可以把原先在hostnetworkNamespace面去配置的一些相对于原来Sataka里面更加一些复杂的propercy routes一些apptables的规则可以一并去除掉因此我们在EBPF进行数据转发的方案中数据面上我们对于每一个在ambient meshscope范围内的port我们在它的对应的在hostnetworkNamespace vspell的interface上我们会挂在我们的EBPF程序在这个EBP程序里面我们会对所有它的inbound的流量打上标签并且通过BPF redirected的help function去把这个包直接转发给Satano相对于inbound的流量也是一样的我们会打上标签然后通过BPF redirected把它转发给Satano那在Satano的egress相也就是Satano的出口相我们会通过查找数据表来查看说这个destination IP是否是我们ambient scope meshambient scope中的一个application port如果是的话如果Hit到的话我们会直接通过一样的通过那个BPF redirected把这个包直接转发给对应的application port这样就跳过了一个协议站的然后在Satano英语上我们会通过之前的一个数据包标签的一个一个classified直接可以去把这个package给对应的listening socket或者一个已经established的一个socket那通过这样的一个BPFTCE-BPF的一个hook的挂载我们就可以把原先在host networknamespace中的一些policy-lutaip-tables以及gnew tunnel给省略掉那控制面上来说的话我们和原先的ip-tablesmodels其实是一样的EBPF redirection也是通过一个事件的驱动当有迫得的端口被新建或者删除的时候会通过estew的estew的CNR plugin来通过一个通知调用我们的EBPF redirection的一个control plan这个control plan会去负责挂载或者卸载一个EBPF的program同样同样也会去更新一个EBPF maps与此同时那个estew CNR demo也会是不间断的去监听整个note上面的一个port以及namespace的一个event因为可能用户会动态的去port theincrewed.eventmesh或者excrewed.eventmesh它今天听到相对的事件也会通知到我们的EBPF redirection的control plan去做一个相对应的挂载和卸载的一个动作我们的同时也用到了EBPF maps去作为一个 user space和cernal space之间的一个桥梁这个EBPF maps主要作用的是把control plan的一些配置规则下发给一些配置规则以及port的一些interface信息ip信息max信息下发给dataplan的EBPF program去使用这是一个maxqps一个performance的一个test这个test是在一个看的cluster中进行的我们是使用forthio作为client和server作为一个数据数据测试那可以看到在不同的connection数量上的情况下EBPF redirection的一个性能相较于原来的ip tables的一个性能会差不多大概都在有20%左右的一个performance提升那说了这么多我们如何去enable我们这个EBPF mode的一个redirection首先我们可以根据社区的那个指引getgetting started withambient match这个链接里面会有一些去如何setup一个基本的k8sinfrastructure的一个步骤然后在安装instill的过程中呢我们只需要加上一个变量就是Values.ci.ambientdirectMode等EBPF那通过这样一条命令我们安装的ambientinstill呢它就是支持ambient的一个EBPF redirection的模式那当安装完成后我们可以通过instillCNi.log去确认是否EBPF redirectionenable了也可以在note的vthpair上去tcfiltershow一下看一下是不是有在ambient matchinclude the port上面的interface是否已经发展上了一个EBPF的程序那目前的状态呢是有点遗憾的是在前几个月instill做CNCFgraduation的时候呢在这个EBPF bytecode的一个license check上面呢目前CNCF那边还没有一个特别明确的指引所以暂时EBPF的code呢在manbrunch上面是disable了相信呢在CNCF legal community有一个明确指引之后呢EBPF的code会马上回到一个主分支当然大家如果想尝试的话可以通过自己去编译这样一个支持EBPF的H2CNi的一个image我把命令也贴在了这里然后或者如果如果大家只是想尝试的话可以直接通过我已经预编译好的一个docal image这个docal image是基于目前最新的1.191.0release的image然后这里面已经把EBPFenable了然后可以直接通过下面下面这一条命令直接进行安装那之前提到了目前EBPF redirection方案中呢是使用到了一个TCEBPF的hook那么大家肯定会有一个疑问如果有很多越来越多的模块因为现在EBPF也相对来说使用的人会比较多那会有越来越多的模块使用到这样一个TCEBPFhook大家都往这一个interface上面去挂在它的EBPF program那模块之间的一个逻辑优先级将会是如何去共存的呢这是一个从左边这应该是从一个Libre BPF bootstrap里面去摘取的一个代码片段它主要是一个TCEBPFhookHandler的一个视线右边那个是从Colonel的samples去摘取的一个片段可以看到大家它的一个Handler的入餐就是一个SK buffer的contest在它的代码段里面可以去实现一些对packet的一些读取或者去修改这样一个packet它的返回值看到很多粒子里面都是用TCEBPFhook或者TCEBPfshortTCEBPfshort的话去丢弃Job这个包我们更进一步的去探究一下Colonel中这些TCEBPFHandler最终是如何被执行和使用的呢TCEBPFhook这边有它有一个優先级Priority的一个设置顾名思义High priority的Handler会優先被执行它在同一个Priority之中又可以挂在多个Handler这里面Colonel中的实现它是对于一个同一个Priority中的Handler它是用一个SU List去实现的然后每一次插路的时候它都会往这个List的表头去插路所以当它真正被执行的时候它都会是先执行最后最新一个被插路的一个Handler这些Handler何时会去终止呢我们可以看到目前来说它有四个主要的一个Rhythm CodeTcAck OKTcAck Short以及TcAck Onsback和TcAck Pipe那前面两个呢它都会直接把如果有一个Handler返回了前面那两个纸那整个TC的Handler的Chain它都会直接停止掉那后面两个呢它会继续去执行你后面如果你还有Handler的话就会执行后面Handler的一些方讯那下面我通过两个小例子来看一下就是TcOK和TcPipe或者TcAck Onsback的一个行为那左边这边的话写了两个简单的一个HookHook的其中它主要是把主要是打了一条LOG然后做删了一个返回值那我们通过把Hook1Hook在了Interface的Priority 1的那个Chain上面然后把Hook2installed在了Priority 2的一个Chain上面那我们可以通过Debug的一个LOG output可以看到整个这个Interface上面的Packet它始终只有用到了一个Handler那个Hook1的一个Handler那个HandlerHook2的Handler始终没有被调用到这也就可能会造成一个大家多个模块去做集成的时候会碰到一个问题就是说为什么我的扣的压根就没有被调到但是单独做一个测试的时候可能我可能比较perfect那如果我们左边这边是另外写了两个Hook的Handler那这两个HookHandler我们就用TCX pipe作为一个返回值那我们分别在Interface的Priority 1Chain上面去先后Hook了先后Hook了那个Hook1和Hook2然后在Priority 2的Chain上面也先后Hook了先后Hook了Hook2和Hook1那可以从DebugLog的那个Output看到对于同一个包呢它是一次会被Priority 1的Hook2Hook1以及Priority 2的Hook1Hook2去做一个Handler的一个Puzzle CheckOK今天很高兴能和大家分享那个AmintMesh中数据转发方面的一些细节以及最后对TCBP Hook的一些探究那对于Amint Redirection而言其实还有大量的一个工作需要被去完成和完善那主要我能想到的有一些是比如说和不同的CNI Plug-in去做一个基层以及和CNI的一个Network Policy去做一个交互基层最后呢之前也有伙伴提到了去用SocketMac做一些Redirection上面的一些加速或者用其他的一些技术去做一些加速那很高兴如果大家有兴趣的话可以和我们在Esteed Select Channel上做一个更进一步的交流好的感谢李淳的精彩分享