《8.基于eBPF的服务网格应用加速器.pptx》由会员分享,可在线阅读,更多相关《8.基于eBPF的服务网格应用加速器.pptx(15页珍藏版)》请在三个皮匠报告上搜索。
1、首届中国首届中国eBPFeBPF研讨会研讨会使用 eBPF 代替 iptables 加速服务务网格主讲讲人:刘齐齐均2022-11-12首届中国首届中国eBPFeBPF研讨会研讨会目录录01Merbridge 项项目介绍绍02Merbridge 部分原理03Merbridge 未来发发展04演示首届中国首届中国eBPFeBPF研讨会研讨会Merbridge 项项目介绍绍01首届中国首届中国eBPFeBPF研讨会研讨会使用 eBPF 优优化数据路径Istio 原有流量转发逻辑转发逻辑使用 Merbridge 之后的转发逻辑转发逻辑首届中国首届中国eBPFeBPF研讨会研讨会主要能力介绍绍 1.使
2、用 eBPF 代替 iptables 的 REDIRECT 能力,实现流量拦截;2.使用 sockmap 加速 app 和 sidecar 之间的通讯;3.通过 cni plugin 实现 eBPF 程序中获取当前 Pod 的 IP 地址;4.同时支持多种网格实现(Istio、Kuma、Linkerd2);首届中国首届中国eBPFeBPF研讨会研讨会部分原理介绍绍02首届中国首届中国eBPFeBPF研讨会研讨会使用 eBPF 拦拦截流量 什么流量需要拦截?App 发出的流量(通过 UID 判断)拦截到哪里?怎么拦截?通过 connect 程序修改发起连接的目的地址为 127.0.0.1:150
3、01 如何获取原地址?通过 get_sockopt 程序返回原始目的地址。首届中国首届中国eBPFeBPF研讨会研讨会解决四元组组冲突 Q:eBPF 是内核级别的,但是在网格场景中确实共享内核,在流量转发的路径中可能存在四元组冲突。如果要解决四元组冲突,那么需要能够打破其中任何一个变量(sip,sport,dip,dport)1.Solution 1:修改 dip,将其从 127.0.0.1 修改为 127.128.x.y,其中 x,y 随着每次连接的建立而增加,这样可以保证不出现重复的四元组。2.Solution 2:修改 sip,将 127.0.0.1 改为 Pod IP,这样也可以避免冲
4、突。3.引入 socket cookie,为每个连接加上唯一标志,这样也可以避免冲突。有什么问题?对于 Solution 1,Merbridge 早期就采用这个方案,但是其没法在 ipv6 下很好的工作。对于 Solution 2,有个困难,就是 eBPF 没法直接获取当前 Pod 的 IP 地址信息。对于 Solution 3,其对内核版本要求较高,需要 5.15 及以上版本才支持。首届中国首届中国eBPFeBPF研讨会研讨会在 eBPF 中获获取当前 Pod IP 方案 我们通过 CNI,在 Pod 创建的时候在当前 Pod 的 NetNS 里面监听一个特殊的端口 39807,将 Key
5、使用setsockopt写入这个端口 socket 的 mark。在 eBPF 中,我们通过bpf_sk_lookup_tcp取得端口 39807 的 Mark 信息,然后从mark_pod_ips_map中即可取得当前 NetNS(也是当期 Pod)的 IP。有了当前 Pod IP 之后,我们可以根据这个 Pod 的配置,确认流量处理路径(比如excludeOutboundPorts)。https:/merbridge.io/zh/blog/2022/05/18/cni-mode/首届中国首届中国eBPFeBPF研讨会研讨会Merbridge 未来发发展03首届中国首届中国eBPFeBPF研讨会研讨会RoadMap 1.节点之间加速 2.双栈支持 3.Ambient mesh 模式支持 4.更低的版本要求、更好的性能 5.首届中国首届中国eBPFeBPF研讨会研讨会Demo04首届中国首届中国eBPFeBPF研讨会研讨会Demo 视频视频首届中国首届中国eBPFeBPF研讨会研讨会社区信息 网址:https:/merbridge.io/zh/项目地址:https:/ Slack 交流:https:/ 首届中国首届中国eBPFeBPF研讨会研讨会Thanks!2024-5-