我这边就今天主要来给大家分享一下举一BPF做多级群流量调度的我们的一个思考和实践首先做一下自我介绍我叫张晓辉是在FloMesh担任高级原生工程师FloMesh是一家举一流量管理产品的一家企业我本身是有十多年的一个工作经验平时也会参与社区的一些工作社区开员比如说我会参与Linx Foundation APEC的一个开员步道师类的团队今年也有幸加入CNC F的一个大使我同时也是微软的MVP我平时也会做一些技术分享我自己有一个公众号就叫原原生之北不知道大家有没有关注过我会在上面会分享一些在技术上的一些思考还有一些技术上的一些分享过去几年我一直在技术架构研发的工作主要就涉及了像Kubernetes 微服Deluxe 容器这些方向所以说今天我会基于首先是Kubernetes 多机群这方面的流量调度今天主要会分享一下下面的一些内容首先会快速的过一下EVPF它的一些介绍还有它的一些应用场景后面会主要集中在我们原原生的流量调度原原生的网络流量调度这方面我们再看一下EVPF它怎么能去在多机群上面能给我们一些帮助首先EVPF的一个简介EVPF它的前身就是一个BPF这边就可能做一个简单的介绍一下太多的故事背景我们可能就不会做太多的介绍首先BPF就是EVPF它的前身就是Bockley的一个Packy的Filter从名字我们就看它就是一个包住过滤器它最早就在92年的时候是一篇论文这篇论文就是说它介绍了在Linux内核里面我们怎么去做一个包了这样的一个过滤大家可能基于BPF的还有一个工具TCP Dump大家可能都有用过其实论文的地址它也是在TCP Dump的网站上面的比如右边这个图使用我们BPF使用BPF它可以去做一些包住过滤我们可以写一些规则把我们的网络内核里面的一些包进行过滤BPF其实它最开始就是考虑的是为什么去做这样的一个产品就是说当我们去做想在内核提加一些功能的时候我们通常都可能会需要去在另一个社区迎接列表里面我们去提一个Proposal可能你还要对您Proposal去进行一个进行一番解释跟大家去做交流整个周期可能会比较长可能过了一两年之后可能你的代码它可能会合并到这个内核里面去整个周期是非常长的所以说BPF它就是通过一个这样的一个过滤器的这样的一个方式就是说我们把BPF的一个程序把它夹载到内核里面可以做一个动态这样的一个夹载后来就是说因为BPF它的一些灵活性后来就有一个EPF这样的一个工具EPF它其实就是一个Extinity的BPF它的最主要的一个概念就是说它是一个动态编程就是说可以在动态的在我们的内核里面夹载我们想要的执行的一些程序我觉得这个EPF我怎么去对总结总结一下就是说它帮我们去实现了一个内核的可编程就是我们不需要向内核里面去提销代码去合并到我们的社区的产品里面反而就是我们通过EPF可以快速地去做一个内核的一个编程内核编程它有哪些特点呢就是说它能保证一个稳定性它会经过使用它的一些Warefire这样的一个检查器去检查我们的BPF的程序加载到内核内核迅接里面的程序它是不是一个无线循环或者是它的一些代码的可达性通过这些检查器它去保证它的一个稳定性再另外就是说它可以做一个高效的处理就是我们写的这些BPF的程序就通过我们的这个工具首先编一程这种字节码然后加早内核经过检查器之后它就会做一个一个本计化的一个编译编一程这个本地的这种机器码它可以做一个高效的一个执行然后在一个安全除了这个检查器以外就是说它对外暴露的一些功能就是说我们在程序里面没办法去使用使用内核的这些直接去使用内核的那些功能反而是我它使用BPF它提供了一些它自己的一些API我们通过这些API去进行编程在它这个EPF领台就叫Helper的 Function然后再就是它可以去做一个热加载那这就是它最主要的一个特点就是我们不需要去编译内核所以我们就可以可以做一个实施的一个动态加载这就是BPF它的一个加载器和验证器的这样的一个流程就是我们使用C1去开发这样一个BPF的程序然后我们首先做一个编译编译成编译成这个字节码然后再通过工具通过一些各种比如说像购物里面的一些购物排绥上面的一些工具把它加到内核里面加到内核里面它首先去做一个做一个做一个静态的检查它会检查你的站码里面有没有无线徐环有没有一些无法达到的无法触达的一些函数检查完了之后它就会去做一个GIT的这样的一个编译编译它就会编译成这个字节码同时这些程序加载到这个内核里面它可以是还有另外一个概念叫EBPF的Maps相当一个存储它可以通过这个存储跟我们在用户空间里面的这些程序进行一个数据上的一些交互再就是EBPF它是一个事件驱动就是说它把很多的一些很多的一些内核的比如说那些内核的一些调用内核的一些事件等等它都会把它抽象成一个这样的一个event然后当我们去关注我们一些event的时候它就可以去出发一些我们的一些程序就是一个event action这样的一个流程它的一个事件就比如说包含了像kprob就像我们内核里面的一些方法一些方法的一些进出carrateprob其实就是carnalreturn的一个prob就是方法结束的我们方法推出的这样的一个它的一个出口的事件那除了这内核里面的我们还有用户空间的我们可以是可以去处理用户空间的一些函数的一些进出的一些事件还有这个sdp就是我们的一个快速数据路径当我们的网络主要是我们去做一些网络数据包上的一些一些这个叫action然后呢它有一些traceport它会关注我们的是这个系统里面一些特定的事件还有这个perf我们可以去做一些这个cpu的使用时间约上的一些监控那右边这个图呢我就不去做过多的介绍了今天主要后介绍我们的一些流量相关的那epf它的一个场景就是我们可以去监控监控我们的系统里面的这么多的操作监控我们的网络的一些数据包那我们可以继续继续这些我们就可以去做一些比如说我们可以在网络上去做一些工作我们去监控我们的一些网络的数据包我们可以去做一些DDoS的一些DDoS的一些阻止DDoS是这样的一些防护那我们可以去修改数据包的这个网络包的Packet它的一些tether比如说我们可以去做一些NAT做一些DNAT或者SNAT然后再基于我们的一些策略我们可以去做一些去实现一些比如说类似于白米单黑米单的这样的一些工作然后再我们可以监控到这么多的一些比如说网络包还有一些系统的一些调用那我们可以去做一些观测那就是可观测性方面的我们可以观测很多的一些数据可以去观测到我们的一个CPU的一个路径那我们通过一些采集到的这些数据比如说通过一些数据可以生成一个火焰图我们可以关注我们的这个系统它在它的一个运行的一个运行的一个情况然后再就是一个安全那我们关注我们可以去做这么多的一些数据包的一个监控拦截之后我们可以去做一些审计上的工作比如说我们可以审计监控我们的一些那些网络的一些网络一些访问还有系统内核的这些方式的一些调用那我们同样的我们还可以去进用一些系统内核的一些方式的使用这是一个它的一个场景的介绍那我们今天呢就主要会关注在网络这一块云原生的一个网络流量那再说这个云原生网络流量之前呢首先介绍一下就是说我们在这个就是我们的一个一个数据包在我们的另一个内核里面它的一个这样的一个路径那最 最 最底下呢就是我们的这样的一个网卡就是我们的一个网络设备当我们的一个网络的一个数据包进入到网络设备之后它首先它的一个数据可能会写到我们的一个网络设备就是这个NIC的它的一个本地的这样的一个对列里面拿到对列里面它可能就会去触发一个类似于CPU的有中断然后由它的这个NIC的一些Driver把的这个数据写入到它的一个Buffer里面然后呢同时它会去申请一个内存把申请一个内存这个内存里面会保存这样的一个SKSK Buffer可以叫它SKB这样的一个数据那它会在这个内存里面创建出这样的一个SKB出来然后再把数据这个数据再交由我们的这个内核网络协议站就是我们的NICDriver的上一层那在NIC上一层的这个网络协议站它会去做一些比如说做一些IP包的一些处理做一些检查做一些路由还有我们TCCPTCCP的头的一些检查首先它会去做一个就是类似一个解包的过程它在NIC可是说它去解了一个把它去解了一个把我们的这个包那我们这个网络包其实就类似于一个俄罗斯套瓦一样最里面呢其实就是我们的一个一些应用层的协议那在外面再包了一层TCCP的这种协议再往外呢就是IP包然后再是以太包那我们这个数据从网络传过去它是从外层一层的网上去解包的这样的一个过程那在这个网络协议站它会从我们的IP包解到TCCP包再从TCCP包我们的这个上层的这个应用层的这个网络协议然后呢都经过我们的一个网络协议站的处理之后呢那这个SK的这个buffer就是说我解除我们的TCCP包之后我们就可以通过端口找到我们的应用它监听在哪一个它使用的是哪一个这个网络套接字就是socket然后这个SKbuffer呢就会写到这个socket的这个对列里面然后再由我们的应用层然后这个地方呢它还会做一个数据的一个复制就是说把我们的一个网络的数据从内核从这个内核空间复制复制到我们的这个用户空间就是这样的一个很复杂的一个过程那这里呢还只是我们的一个一个网络接口的一个处理然后呢在我们的运员说的这个容器网络里面在容器网络里面呢其实我们有很多的这样的一些网卡比如说它有一些我们的那些这些的讯你的网络接口比如说这里呢我这个图然是展示的在我们一个节点上我们有两个pod这两个pod它怎么去进行了一个网络的一个传输那最右边呢是我们的这个客户端客的这样的一个pod左边是我们的一个服务团是hdbhdb的这样一个pod它那肯定是由客去访问hdb那在我们的这个pod里面呢每个pod它都有自己的一个容器的容器的这个命名空间首先我客发出来的请求之后去进入到它自己的容器的这个NIC里面就我们前面那个图里面的那个NIC的那里然后然后进入到再通过再通过这个虚拟的这个一个列录虚拟的列录它进入到我们的就是在我们主机的这个内核网络空间网络这个命名空间去这个VETH这里然后我们所有的这些pod都通过一个叫像我们的一个网桥CNI0比如说这个CNI0它就是一个网桥它会连接到我们的所有的pod它的这个VETH的这个网络接口上面那它可以去做这样的一个通过这样的一个进行我们的一个网络的传输我们可以看到在这个地方它其实了经过了两三个的这样的一个网络接口这还只是我们在同节点上去做去做网络的一个传输那假如说我们一个跨节点我们可能还会去到我们的下面的我们主机的这个网络接口通过我们的通过我们的这个物理的网络去进行一个数据的一个传输那这是这个容器网络的它的一个情况这里就介绍一下就是说我们在同一个pod里面就比如说我们在用浮网格的时候我们会在浮网格里面去注入一个塞卡注入一个塞卡容器那我们的塞卡跟我们的业务容器之间它怎么去去进行这个网络的一个传输那我肯定是我们的一般的我们都会使用这个IPTables把我们的流量截持到我们的塞卡这边那它这个流量就是我们从从我们的应用这边容器出来了之后它会进入就是我们的一个比如说HTB的协议它经过我们的网络协议站之后它进行重重的一个封包封包的之后再通过到了我们内核的网络接口就是我们容器的网络接口比如说Lubac回还接口然后再经过我们的网络协议站再解包然后再去到我们的塞卡里面那它就没有出没有出这个容器了就完全经过在这个容器的然后经过这个网络协议站的这样一个处理这个是同pod一个pod里面容器两个容器去进行交互然后这个是一个截点上两个pod一个同一个截点上的两个pod它同样也会出了我们的应用发了我们的一个网络包之后它要经过socky然后经过网络协议站的封包然后去到网络接口然后去到网络接口之后就比如说我们的截点上的CMI0的网桥然后再进入到我们再通过我们的路由本地的路由进行寻找找到我们同截点上的pod之后再通过网络协议站的截包然后层层的截包之后就解除我们的比如说我们的七层的htp的包然后写到我们应用的它socky的堆裂里面完成这样的一个交互的过程整个流程会比较复杂ok然后夸截点就比上面会多一点就是它会多一个物理网络的一个传输我们就是一个夸截点的这样的一个传输其实我们可以看到基本上都会经过socky它然后经过网络的内核协议站然后再经过我们的一个网络接口这是这样的一个传输的一个流程我们可以看到前面几个图大家都会发现其实我们的数据都是从一个socky写到另一个socky那我们所有的过程整个所有的过程不管是你在同一个同一个pod里面还是在同一个截点或者是夸截点我们整个一个过程其实都是一个socky的它的一个寻止的一个过程我要给哪一个应用发网络发送数据其实我要找到它的socky把我这一边的数据写到它那边的一个socky里面其实就是以一个socky的一个寻止过程可能就是说你中间的过程经过了内核的处理经过了网络协议站或者甚至是经过了这些物理的网络或者是可能是我们的一个内部网络或者是一个外部网络整个不管是经过什么样的流程其实最终我们要找到服务端的它的socky把数据写过去那整个流程既然这么复杂我们能不能通过什么手段可以快速的去缩短这个路径跳过中间的整个的这样的一套群纸的这样的一个流程那socky的就是说这里会介绍一下socky就是我们socky的一个客户端去访问服务端的时候它是这样的一个流程首先是我们服务端它会去建一个这样网络掏接字然后发起一个绑定的一个动作绑定到某一个TCP的端口上面然后它再去accept这个数据它等到网络的数据的传输那同样的客户端它也会去创建一个socky的套接字然后连接到某一个网某一个地址然后创建连接之后然后就是发送数据发送完了然后再去做一个动开连接的这样的一个操作那我们可以看一下这个图呢跟前面一个图是比较类似的指示说我们可以看一下这个既然EPF它可以监控可以做这么多的一个动作可以做这么多的这个event action这样的一个出发那我们可以看到它可以在哪个地方去用就比如说它可以在我们的NIC的这个物理网卡里面去用也可以在这个NIC的它的一个driver这一层或者是我们的这个网络网络协战内核网络协战的这个层网络网络协战我们会有进出就是一个traffic control的一个ingress和egress的这样的一个这样的一个这个出发点然后呢我们可以有一些socket我们可以监控socket的上一幅图的那些比如说assetband或者是sendsend message这样的一些操作我们都可以使用EPF去监控那我们使用EPF去监控之后呢使用EPF去我们监控到这些点我们去互可到这些点上之后呢执行操作的时候我们可以去互可执行我们的这些EPF的程序那除了这些内核那我们可以也可以在这个用户空间我们的用户程序这边也可以去做一些这个事件的一些监控那我们可以看到就是说我们可以使用我们的EPF程序缩短我们这个数据的传输的一个流程我们就可以bypass定要这个内核的一些网络协战的一些处理那就变成了就是说当我当我做做了一次寻止之后我可以记录到同节点的这个应用它的这个socket它的一个地址那我的数据我做数据传输的时候呢我直接从一个socket写到另一个socket里面那我整个的流程就会被缩短了嘛那这样可以去做有一些这个效率上的一些提升就是说我们是可以使用使用EPF去实现一个这样的一个网络的一个加速然后在应用层面在应用层面就是说很多的一些产品就比如说像服务网格的产品我们可能会比较早期我们使用ip-tables进行一个流量的拦截那我们可以看一下就是说我们这边我们有一个服务网格的产品叫flow mesh service mesh就是FSM我们可以使用EPF进行一个流量的拦截那这个就是说这就是一个pod它的一个创建的一个流程那么创建一个pod之后cublate它会在我们的一个节点上面去调用这些ci然后去然后调用ci去创建我们的这个网络的这些容器的一个网络命运空间然后在创建的过程中我们可以看到就是说我们创建了一个网络命运空间之后我们会发一个请求到一个interceptor这样的一个interceptor这样的一个组建发一个请求然后这个interceptor它是一个它是一个demonset这样的一个类型然后它会在我们的节点上面去加载去load这些EPF的程序把这些程序加载到我们的pod它的一个网络命运空间里面然后呢它这些程序这些PPF的程序它会监控我们的各种的网络事件还有我们的一些内核的一些网络内核的这些方法调用然后去实现我们的网络协战的这样的一个bypass的这样的一个功能实现了这个功能之后其实这个地方我们就不需要就不需要用到这个IPTables去做流量拦截了完全通过EPF去进行拦截就可以了这个地方应该有一幅图我可能我当时忘加了就是它怎么一个拦截的一个流程另外一个应用呢就是像silium我们知道它有silium就是它有实现了实现了这些CNI然后也可以是加增强了我们这些COVID-19的一些网络策略比如说我们可以控制一些流量从一个pod到另一个pod它的一个流量它的是否能就是一个黑白名单的这样的一个效果就是我的一个pod能否访问另外一个pod那我们这个做网络控制的时候我们可以做四层的网络控制比如说我们可以控制它是否能访问哪个端口或者是能访问哪个IP那就是完全由EPF它可以去做去做这样的一个实现然后呢甚至七层的策略七层的策略可能就会比较复杂一些比如说我们七层的HTP的协议比如说我们根据我可以控制它可以访问哪些pass但是哪些pass我是它禁止访问的它这个silium它这个在处理七层的网络策略的这个过程中它就是它是通过把EPF的把我们的使用BPF程序把我们这个网络流量把它定向到重定向到这个一个网络代理里面然后silium它呢就有实现了一些它是使用Avoid去做这个网络代理去实现了一些Avoid的一些filter然后再使用这个filter去这个BPF的map里面去读一些我们写的一些策略可能一些策略会写会它会去判断我们的这些流量是否是否需要去执行七层的一些策略假如需要执行七层的策略的话这个流量呢它就会进到Palsy里面进到Palsy里面它会去执行我们的策略最后然后最终给出一个结果就是说你这个请求我是要拒绝呢还是要放心这个silium它其实在七层上面它是使用也是使用了这样的一个用户空间的这样的一个网络代理去做去做了一个网络策略的一个执行那这里讲到是就到了我们这个跨集群的一个流量调度那跨集群的流量到底首先就是说我们跨集群那我们去进行跨集群的网络调度的时候我首先我要知道我跨我这个服务在其他集群的这个访问的地址是什么在FSC里面它会有这个多级群的一个服务注册发现的这样的一个流程实际这里我们会有这个有一个组件一个组件叫FSM Controller还有一个FSM BridgeController呢它就是类似于一个控制面首先它进行我们看它的第一个操作它会去Watch我们这边会有集群分为两种集群一个是控制面的集群还有我们的数据面的集群成员集群就是说首先我们这个控制面集群的FMS Controller它会去WatchWatch我们的这个API Server那因为其他的我们的成员集群它是首先要做一个集群这个注册把这个集群注册到注册到我们的控制面集群之后那我们就会形成一个集群的联邦那我们这些服务就可以那我们在这个成员集群上面我们去运行一些服务的时候我们可以把这个服务注册到这个控制面集群然后我们然后我们可以看到其实是这个FSM Controller它就会去Watch各个他们这个API Server去检查你是否有多集群的服务去进行注册那注册了之后一旦发现这个多集群的服务之后呢它就会把这个多集群的服务的一些访问信息比如说它的这个网关的地址然后它的一些端口啊等等的这些信息把它推送到所有的成员集群也就是说我们的所有的成员集群都可以拿到其他集群的这个服务的访问信息到我们的所有的这些集群拿到这些其他集群的这些实力的信息之后比如说像这个AMPOID这样的一些信息之后呢它会然后各个成员集群上面的这个FSM Controller它会把这些数据写入到我们这个FSM的Bridge里面去FSM Bridge它会去执行我们这些流量的一个处理的流程Bridge的这个介绍会在这个下一页去介绍这里呢就是一个Ingress的一个组建物这里为什么会需要Ingress呢就是说我们的一个集群假如说他要提供对其他集群提供这个服务的时候呢我们这里呢就是说为了去避免我们在网络价购上的一些限制就是说我们引入了这是一个七层的这样的一个网络入口就是说我们不需要在二层 三层把我们的这个网络去打通也就是说我不需要是我不需要这个IP地址是暴露的那我完全通过这个Ingress去进行去进行一个访问去进行一个暴露这里呢就是一个FSNBridge它的一个过程我们可以看到中间Bridge这里呢它其实里面是有两个组建一个是Bridge还有我们一个Poxy这个Poxy呢其实它也是提供了在用户空间去提供了一个流量代理这样的一个角色那我们可以看到我们的一个多机群的服务当我们进行服务访问的时候那比如说我们使用这个服务的它的一个ServiceService地址它的FQDN去访问的时候它首先需要做一个DNS去做第一个DNS的解析比如说它这个DNS的解析的这个请求去发送到这个CoreDNS那但是呢我们这里呢我们是通过Bridge加载了一个BPF的程序它会对我们的DNS请求去进行一个拦截我会去检查你这个请求请求的服务它是它是多机群的服务还是只是本机群的一个服务假如说多机群它是多机群的服务之后呢我们会给它返回一个给它返回一个这个IP地址这个IP地址就是我们Poxy的这个IP地址通过这种方式我们把多机群的这种访问的流量把它截持到Poxy里面然后由Poxy去把我们的把你这个请求路由到其他的机群上面假如说是你要访问的服务它是我们本机机群就可以去完成它就会去这个IP地址它就会放行你这个流量把你这个DNS解析的这个请求放行到CoreDNS然后CoreDNS其实它返回的就是我们本地的一个Service的CoreDNS IP那下面的这条线绿色的这个它就是一个本机群的一个流量访问的一个流程就是我们通过这种方式就是我们通过DNS拦截DNS解析这个请求然后去修改你的DNS的一个解析的一个结果如果是DNS如果这个请求是如果这个请求是多机群的服务它就是我们会把它解释到这里这里会有一个有一个有一个比较特殊的地方就是说我们的这个Poxy它其实是绑定在绑定在我们的那个容器的容器的那个Bridge那个接口上面也就是它使用我们那个Bridge的IP它会绑定在那个Bridge IP因为在同一个节点上的所有的Node它所有的流量都会经过这个Bridge所以说我们会把它把这个代理它是绑定在那个那个接口上面的就是说我们所有的流量都可以去都可以走到我们那个Poxy这里那这个呢就是我们的一个流量流量调度的这样的一个过程OK我们可以看一下就是说我们可以看看就是说我们使用了这个EPF之后我们可以去做不管是网络可观测还有我们的一些安全上面我们可以通过原本在用户空间去解决的一些事情我们可以通过更高效的更高效的方式在我们的内核空间就可以去完成因为内核空间我们可以观测的数据会更多可以监控的一些系统调用会更多更直接那这就是EPF它去实现这些呢就是说它不我们去使用这些功能我们不需要把这些功能编移到内核里面也不需要使用一些挂载一些那个模块把这个模块挂载在内核里面它完全就是我们就加载一个可以动态的实时的把这个程序加载到内核里面去这就是一个可编程的过程那EPF它实现了一个内核的一个可编程再往上层去看就是我们在整个这个过程中那我们这个流量流量在内核里面去处理做了处理然后在我们的这个我们还需要去处理一些七层流量的时候一些七层的一些复杂的网络策略比如说一些基于一些请求Header的一些挥度啊Header基于Header的一些防控制啊等等那这些不可避免的我们还需要借助借助一个七层的代理去做去做去做这些网络的这个数据的一些检查那但是呢这些功能就是我们在使用网络代理的时候我们不可避免的我们可能需要引入一些新的功能比如说我今天我是基于Header请求这个Header去做挥度但是有一些遇到我可能之前就遇到一些企业他会使用他会甚至去使用Body里面的这些内容去做挥度当然这些像这种请求的时候我们其实我们的这些现在市面上的这些代理他根本就没办法去做一个实现我们可能就需要去进行一个扩展但是扩展的时候我们假如说我们要去写这些代码不管是CIAJIA还是写这些够的代码就跟我们在内核里面去进行扩展一样整个流程是非常非常长的而且而且他也不是一个动态的过程所以说我们怎么去实现我们这个代理的可编程就是说当我需要为我们的代理增加一个新的功能的时候我只需要把一个一个程序扔给这个代理他就可以去做一个热加载我们可以做一个动态的加载实现一个代理的可编程就是说分我们就可以通过EPF在内核这边去实现一个内核的一个可编程然后代理我们可以在我们的这个用工节里面实现我们这个网络代理的一个可编程我们这边会有另外一个产品就是这个拍皮拍皮它是一个可编程的代理就是说我的拍皮你想让它怎么去执行网络流量我完全只扔给它这样的一个程序就可以了它可以去做一个实实的一个加载我不需要执行什么编译重启等等这些操作都是不需要的就说像EPF一样我直接去加载一个程序就可以动态的去增加我们一个功能我们就可以像内核一样去实现我们代理的一个可编程那同样它有为了就是说我们在使用上的一些减变使用上的一些我可能不会提供太多的一些网络的调用的这些接口它像EPF提供这些Helper的方式一样也提供了一些网络编程的一些APIOK我今天讲的内容可能就会比较快一些这边这边是我们的一个公众号Folomance公众号在上面都会有一些技术上的一些分享上面是没有任何商业化的一些东西的都是一些技术上的然后右边是我们Folomance的一个网站还有我们GaHub的一些仓库不管是像EPF的多机群我们的服务网格还有拍皮的可编程代理这通通这些我们都是都是全都是开源的同时我们也没有商业化的版本只有一个开源的一个版本大家都可以在上面获取到这些项目的一些原码然后最后面是一个Folomance的Select Channel大家也有兴趣也可以加入这个Select Channel上面OK我这边的分享就是这些谢谢张老师的分享大家有什么问题想要提问的吗和传统价格有点不一样所以我的问题有点多第一个是EPF它对内核版本和内核是有要求的对你们在用EPF做流量调度的时候有考虑过这个事情吗我们是有考虑过这个事情的因为在看到下面我们这边使用EPF做实现我们对和内核的版本要求确实会有点有点高这样的一个版本那做这个多级群调度的时候其实其实我们最终我们的调度其实都是完全依赖一个Poxy去做一个调度那假如说我们对内核我们内核没办法达到这么高的版本我们可以通过其他的一些方式比如说我们可以通过浮网格其实我今天就没有介绍我们另外一个跨级群的流量调度我们是通过浮网格去做了一个实现其实你可以把这个跨级群的浮网格的信息写到Dimset这种的Poxy里面那你也可以写到浮网格的这个代理里面去我们可以根据我们的一个使用场景比如说我们内核版本比较低那我们可以使用浮网格这样的一个方案第二个是我看到那个流量下发的时候这个扛出来的面板往那个业务集群转发的时候我想问一下这个转发我们是不是所有跨级群都要用英文对现在是我们所有的跨级群全都是英文那个管理集群往业务集群转发的时候也用英文哪个管理就你那个管理面板多级群调度不需要就说其实我们的这个管理管理控制面控制面的这个集群它其实只是做一些控制面控制上的一些操作我这边只是需要我这边是需要去访问到你的这个APS over对我需要去监控你的这个集群上面一些多级群服务的一些创建然后呢同样同时我要把其他集群的这些服务的一些信息同步到我们的所有的成员集群上面比如说流量入口不是从这个口中的面板过来的是吧流量入口流量入口是其实就是每一个这个集群上面的这个我可以看到它有一个Ingress好这个其实我想问的一个点是这个就是涉及到Fall Night的场景的话EPVF这边是如何追踪的Fall Night就是原地址和木理地址全都变了的情况下EPVF是怎么追踪的它里面它是用了那个Connection的Tracking就是一个链接的链接的这个跟踪它会就我在创建链接的时候就我在创建链接的时候你它它会可以给你做这个DAT或者SNAT但是我会记录原始的这个链接的它这个信息然后当我说包里面那个包里面的有一个自断是吧不是自断它是有一个EPVF的Map你这边自己记录的是吗对它里面自己记录它通过这个Map去记录原始的这个链接去记录这个链接的这些信息就比如说我在发我的数据包因为我发出去了之后它的这个木理地址是改变了吗然后这个可能是说原始的这些原地址原动口可能也会发生改变那我会把原来的这些信息记录到这个记录到这个Map里面当我的这个有响应回来之后有响应回来之后呢我在从这个Condition的Tracking的这个Map里面拿到这个原始的信息然后再做一次这样也就是说我们这个只是把这个多流量的不是多集群这种流量规则下发到每个集群其实就是通过DS接试做的对可以这样理解吗对 可以这么理解就相当于就相当于我们在这个浮网格里面做了一样就说我把流量截止到这个塞卡里面只是说我们这个塞卡现在是一个一个DemiSet就是我的一个Node-Level的这样一个塞卡因为我看到这个虽然说是这个比浮网格就那种流量那个网络的链路短了一些但我看了一下因为要实现这个功能其实你还是要实现浮网ISTO那些相关的云谋为那些能力的就是有没有对比过这两边的一个性能确实是有有这个很大的一个提升是吗这个就没有我们这边就还没有去测那我们现在是这样的一个探索时间的这样的过程我们会我们再有安排去做但是业界是有做过这样的一个测试就是我们做了一个内核协议站的这个bypass之后其实它的性能会有提升的因为我可以其实我虽然就是说跳过了内核协议站其实我们还少了这个IPTables我不需要IPTables去做这些处理了处理它是一个处理的过程但它也会耗时然后比如说我们的这个cube proxy就是我们去某些pod上线cube proxy可能去做一些IPTables的刷新这些统终都需要耗时最后一个疑问就是我看这边也有那个流量调度的规则我想问一下这个规则和eSto的那边创意规则的差别大吗就是往我们EPBF里面去查这个我们自定义的流量调度规则的时候这个和云元生原来的一个使用习惯差别大吗还是说这个规则完全就是不太一样很不一样的一个这样的一个规则调度的规则你是指就是你那个你这边不也有一个这个上层的一个流量调度调流的一个方法的一个能力然后你在这层实现的时候我怎么去创建一个规则我创建这个规则它的一个压力的一个内容和我原来用eSto的情况下我就创建的情况下这两个差别大吗差别就是说这个可以怎么说就是说在Crobinatis它是有一个Multiple Cluster的一个Service这样的一个API就是说它这个API的一个最初中就是什么我去使用多级群的服务的时候就像使用本地服务一样就是说你使用本地服务可能就是使用Service Name加上Name Space这样的一个FQDemo去访问了那在使用多级群的时候它其实也是这样你不需要去修改它的访问地址所有的这些流量所有的这些处理那我是调到本级群的Colors IP或者Port IP还是去到其他集群的Ingress地址就完全就是由由这个我们的代理去实现的就是说我不需要去写任何的这样的一些压抹不需要写任何的这种CRD就说我只需要创建一个多级群的服务就可以了这个就是完全是在多级群服务这边去创建的那这个创建的时候它是一面创建吗还是后端用压抹去付呢就是我的其实核心点就是说因为我们这边也是有细力度的流量调度能力的嘛这样的流量调度能力肯定是需要我们去配这个规则的我们配这个规则的使用的方法跟我们原来用Eastle用服务网格的情况下差别大不大因为这个是要注入到那个我理解是要注入到EPBF里面的这个规则像这种流量的规则其实是在我们这个代理里面去做这个实现EPBF只是做一个后科是吧在后科先去执行我们那个方法对比如说他去做DNS的节驰做DNAT这样的一些操作做Net的一些操作现在的流量调度都是基于DNS解析做的是吧流量节驰是通过DNS是做流量的节驰节驰节驰到PoCy里面然后由PoCy去做比如说做复载均衡做这些的一些操作对就是PoCy这边它应该有一个它能去识别的一个规则文件定义了它现在要转发的流量以什么样的力度或者以什么样的鞋牛头去做区分去转就这个规则是在哪个地方去创建其实目前我们这个地方只是去实现了一个多机群的互联互通只是能转过去还没有能够使力度对我要保证你的数据你出去闯过去然后你出去闯过去之后或者传出之前我是怎么去做这个细路的调整可能是我们去使用浮光阁或者是使用其他的一些比如说大家没用浮光阁可能会使用SDK就目前在我们这个代理里面目前没有去加这个很弃利度的一些操作比如说像这种鞋流啊超时啊等等我们目前是实现了实现了首先我们是多机群的跨机群的调度我们是实现了它的一个跨机群的一个互通但是呢就为什么很容易去实现呢就是说因为这个代理是一个可编程的代理就像我要实现一个功能的时候我直接去给它加载一个程序就可以了不需要编译不需要重启就像EVPF一样所以说那个功能实现也是非常简单的就说因为它是一个服务网格的代理可以去共用这些流量处理的一个逻辑了解对我不需要去编译不需要重启直接做一个热加带就可以了这就是一个可编程的它的一个优势吧这个应用层的那个编程热加载是靠我们的哪个程序做的这个是吧对就是我们这边有一个开源的开源的一个可编程的代理好的我的问题问完了谢谢老师后续会送给你一份那个礼物然后下面的话还有什么问题可以在线下和这个线下是吧别线下因为我们会不会还有几个问题我的问题是那个如果多机群的话会不会有这种IP冲突的话这种问题怎么解决我问你刚才你说的不单单是气层的那个表发吗比如说你刚才看我们记错的话有个三层其实我们这边的实现就是说不会有IP冲突其实你说的IP冲突其实就是我们那个PODIP它可能会冲突对不对但是我们这边这个地方为什么会介绍了这个Ingress其实当你去创建一个多机群的服务的时候就是我们的一个控制它会自动在Ingress上面给你创建一个入口就是说我们的跨机群的这个互通其实是通过Ingress去实现的就不需要你的网络架构去做这个在网络层不需要在网络层去打通不需要说我的PODIP是对外的就是我不需要不需要一个这样的一个你刚才提到的是明白您说的意思是你刚才提到的是控制层面您不说还有一个不是7层的那个打通吗控制层面是指对这个层控制层面其实就是说我是我的这个控制面的集群要去访问成员集群的APS Server它是打通这个我去访问APS Server的这个网络需要打通这个网络就不需要我的PODIP去对外的一些暴露APS Server层面的对好还有问题另外小问题就是一个EBPF在不同的另一个版本的话它就变换很大你们怎么处理这个问题其实这个不需要我们去处理因为EBPF它本身它为什么去提供Helper的方式提供Helper的方式一个是我可以去限制你去使用哪些内核的使用内核的方法同时它也去抽象了内核的访问就是说我们去访问的时候完全通过Helper的方式去访问当我内核有变化的时候当我的内核版本发生变化其实你的Helper的方式不变好谢谢