istio.io/archive/v1.20/zh/blog/2022/merbridge/index.html

29 lines
33 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=zh itemscope itemtype=https://schema.org/WebPage><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=theme-color content="#466BB0"><meta name=title content="Merbridge - 使用 eBPF 实现网络加速"><meta name=description content="用 eBPF 代替 iptables 规则可以将应用发出的包直接转发到对端的 socket从而缩短 sidecar 和服务之间的数据路径。"><meta name=author content="Kebe Liu (DaoCloud), Xiaopeng Han (DaoCloud), Hui Li (DaoCloud)"><meta name=keywords content="microservices,services,mesh,Istio,ebpf,iptables,sidecar"><meta property="og:title" content="Merbridge - 使用 eBPF 实现网络加速"><meta property="og:type" content="website"><meta property="og:description" content="用 eBPF 代替 iptables 规则可以将应用发出的包直接转发到对端的 socket从而缩短 sidecar 和服务之间的数据路径。"><meta property="og:url" content="/v1.20/zh/blog/2022/merbridge/"><meta property="og:image" content="https://raw.githubusercontent.com/istio/istio.io/master/static/img/istio-social.png"><meta property="og:image:alt" content="The Istio sailboat logo"><meta property="og:image:width" content="4096"><meta property="og:image:height" content="2048"><meta property="og:site_name" content="Istio"><meta name=twitter:card content="summary_large_image"><meta name=twitter:site content="@IstioMesh"><title>Istioldie 1.20 / Merbridge - 使用 eBPF 实现网络加速</title>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-98480406-2"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","UA-98480406-2")</script><link rel=alternate type=application/rss+xml title="Istio Blog" href=/v1.20/blog/feed.xml><link rel=alternate type=application/rss+xml title="Istio News" href=/v1.20/news/feed.xml><link rel=alternate type=application/rss+xml title="Istio Blog and News" href=/v1.20/feed.xml><link rel="shortcut icon" href=/v1.20/favicons/favicon.ico><link rel=apple-touch-icon href=/v1.20/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/v1.20/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/v1.20/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/v1.20/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/v1.20/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/v1.20/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/v1.20/favicons/android-96x96.png sizes=96xW96><link rel=icon type=image/png href=/v1.20/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/v1.20/favicons/android-192x192.png sizes=192x192><link rel=icon type=image/svg+xml href=/v1.20/favicons/favicon.svg><link rel=icon type=image/png href=/v1.20/favicons/favicon.png><link rel=mask-icon href=/v1.20/favicons/safari-pinned-tab.svg color=#466BB0><link rel=manifest href=/v1.20/manifest.json><meta name=apple-mobile-web-app-title content="Istio"><meta name=application-name content="Istio"><meta name=msapplication-config content="/browserconfig.xml"><meta name=msapplication-TileColor content="#466BB0"><meta name=theme-color content="#466BB0"><link rel=stylesheet href=/v1.20/css/all.css><link rel=preconnect href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600&display=swap"><script src=/v1.20/js/themes_init.min.js></script></head><body class="language-unknown archive-site"><script>const branchName="release-1.20",docTitle="Merbridge - 使用 eBPF 实现网络加速",iconFile="/v1.20//img/icons.svg",buttonCopy="复制到剪切板",buttonPrint="打印",buttonDownload="下载"</script><script src="https://www.google.com/cse/brand?form=search-form" defer></script><script src=/v1.20/js/all.min.js data-manual defer></script><header class=main-navigation><nav class="main-navigation-wrapper container-l"><div class=main-navigation-header><a id=brand href=/v1.20/zh/ aria-label=logotype><span class=logo><svg xmlns="http://www.w3.org/2000/svg" width="128" height="60" viewBox="0 0 128 60"><path d="M58.434 48.823A.441.441.0 0158.3 48.497V22.583a.444.444.0 01.134-.326.446.446.0 01.327-.134h3.527a.447.447.0 01.325.134.447.447.0 01.134.326v25.914a.443.443.0 01-.134.326.444.444.0 01-.325.134h-3.527a.444.444.0 01-.327-.134z"/><path d="m70.969 48.477a6.556 6.556.0 01-2.818-1.955 4.338 4.338.0 01-1-2.78v-.345a.443.443.0 01.134-.326.444.444.0 01.326-.135h3.374a.444.444.0 01.326.135.445.445.0 01.134.326v.077a2.014 2.014.0 001.054 1.667 4.672 4.672.0 002.664.709 4.446 4.446.0 002.492-.633 1.862 1.862.0 00.958-1.591 1.426 1.426.0 00-.786-1.322 12.7 12.7.0 00-2.549-.939l-1.457-.46a21.526 21.526.0 01-3.3-1.227 6.57 6.57.0 01-2.262-1.783 4.435 4.435.0 01-.92-2.894 5.081 5.081.0 012.109-4.275 8.993 8.993.0 015.558-1.591 10.445 10.445.0 014.1.748 6.3 6.3.0 012.722 2.07 5 5 0 01.958 3.009.441.441.0 01-.134.326.441.441.0 01-.325.134h-3.258a.441.441.0 01-.326-.134.443.443.0 01-.134-.326 1.974 1.974.0 00-.978-1.667 4.647 4.647.0 00-2.665-.671 4.741 4.741.0 00-2.435.556 1.724 1.724.0 00-.938 1.553 1.512 1.512.0 00.9 1.4 15.875 15.875.0 003.01 1.055l.843.229a27.368 27.368.0 013.412 1.246 6.67 6.67.0 012.338 1.763 4.387 4.387.0 01.958 2.933 4.988 4.988.0 01-2.146 4.275 9.543 9.543.0 01-5.712 1.552 11.626 11.626.0 01-4.227-.709z"/><path d="m97.039 32.837a.443.443.0 01-.326.135h-3.911a.169.169.0 00-.191.192v9.239a2.951 2.951.0 00.632 2.108 2.7 2.7.0 002.013.652h1.15a.444.444.0 01.325.134.441.441.0 01.134.326v2.875a.471.471.0 01-.459.5l-1.994.039a8 8 0 01-4.524-1.035q-1.495-1.035-1.533-3.91V33.166A.17.17.0 0088.164 32.974H85.978A.441.441.0 0185.652 32.839.441.441.0 0185.518 32.513V29.83a.441.441.0 01.134-.326.444.444.0 01.326-.135h2.186a.169.169.0 00.191-.192v-4.485a.438.438.0 01.134-.326.44.44.0 01.325-.134h3.336a.443.443.0 01.325.134.442.442.0 01.135.326v4.485a.169.169.0 00.191.192h3.911a.446.446.0 01.326.135.446.446.0 01.134.326v2.683a.446.446.0 01-.133.324z"/><path d="m101.694 25.917a2.645 2.645.0 01-.767-1.955 2.65 2.65.0 01.767-1.955 2.65 2.65.0 011.955-.767 2.65 2.65.0 011.955.767 2.652 2.652.0 01.767 1.955 2.647 2.647.0 01-.767 1.955 2.646 2.646.0 01-1.955.767 2.645 2.645.0 01-1.955-.767zm-.211 22.906a.441.441.0 01-.134-.326V29.79a.444.444.0 01.134-.326.446.446.0 01.326-.134h3.527a.446.446.0 01.326.134.445.445.0 01.134.326v18.707a.443.443.0 01-.134.326.443.443.0 01-.326.134h-3.527a.443.443.0 01-.326-.134z"/><path d="m114.019 47.734a8.1 8.1.0 01-3.047-4.255 14.439 14.439.0 01-.652-4.37 14.3 14.3.0 01.614-4.371A7.869 7.869.0 01114 30.56a9.072 9.072.0 015.252-1.5 8.543 8.543.0 015.041 1.5 7.985 7.985.0 013.009 4.14 12.439 12.439.0 01.69 4.37 13.793 13.793.0 01-.651 4.37 8.255 8.255.0 01-3.028 4.275 8.475 8.475.0 01-5.1 1.553 8.754 8.754.0 01-5.194-1.534zm7.629-3.1a4.536 4.536.0 001.476-2.262 11.335 11.335.0 00.383-3.221 10.618 10.618.0 00-.383-3.22 4.169 4.169.0 00-1.457-2.243 4.066 4.066.0 00-2.531-.785 3.942 3.942.0 00-2.453.785 4.376 4.376.0 00-1.5 2.243 11.839 11.839.0 00-.383 3.22 11.84 11.84.0 00.383 3.221 4.222 4.222.0 001.476 2.262 4.075 4.075.0 002.549.8 3.8 3.8.0 002.44-.809z"/><path d="m15.105 32.057v15.565a.059.059.0 01-.049.059L.069 50.25A.06.06.0 01.005 50.167l14.987-33.47a.06.06.0 01.114.025z"/><path d="m17.631 23.087v24.6a.06.06.0 00.053.059l22.449 2.507a.06.06.0 00.061-.084L17.745.032a.06.06.0 00-.114.024z"/><path d="m39.961 52.548-24.833 7.45a.062.062.0 01-.043.0L.079 52.548a.059.059.0 01.026-.113h39.839a.06.06.0 01.017.113z"/></svg></span>
</a><button id=hamburger class=main-navigation-toggle aria-label="Open navigation">
<svg class="icon menu-hamburger"><use xlink:href="/v1.20/img/icons.svg#menu-hamburger"/></svg>
</button>
<button id=menu-close class=main-navigation-toggle aria-label="Close navigation"><svg class="icon menu-close"><use xlink:href="/v1.20/img/icons.svg#menu-close"/></svg></button></div><div id=header-links class=main-navigation-links-wrapper><ul class=main-navigation-links><li class=main-navigation-links-item><a class="main-navigation-links-link has-dropdown"><span>关于</span><svg class="icon dropdown-arrow"><use xlink:href="/v1.20/img/icons.svg#dropdown-arrow"/></svg></a><ul class=main-navigation-links-dropdown><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/service-mesh class=main-navigation-links-link>服务网格</a></li><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/solutions class=main-navigation-links-link>解决方案</a></li><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/case-studies class=main-navigation-links-link>案例学习</a></li><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/ecosystem class=main-navigation-links-link>生态系统</a></li><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/deployment class=main-navigation-links-link>部署</a></li><li class=main-navigation-links-dropdown-item><a href=/v1.20/zh/about/faq class=main-navigation-links-link>FAQ</a></li></ul></li><li class=main-navigation-links-item><a href=/v1.20/zh/blog/ class=main-navigation-links-link><span>博客</span></a></li><li class=main-navigation-links-item><a href=/v1.20/zh/news/ class=main-navigation-links-link><span>新闻</span></a></li><li class=main-navigation-links-item><a href=/v1.20/zh/get-involved/ class=main-navigation-links-link><span>加入我们</span></a></li><li class=main-navigation-links-item><a href=/v1.20/zh/docs/ class=main-navigation-links-link><span>文档</span></a></li></ul><div class=main-navigation-footer><button id=search-show class=search-show title='搜索 istio.io' aria-label=搜索><svg class="icon magnifier"><use xlink:href="/v1.20/img/icons.svg#magnifier"/></svg></button>
<a href=/v1.20/zh/docs/setup/getting-started class="btn btn--primary" id=try-istio>试用 Istio</a></div></div><form id=search-form class=search name=cse role=search><input type=hidden name=cx value=002184991200833970123:iwwf17ikgf4>
<input type=hidden name=ie value=utf-8>
<input type=hidden name=hl value=zh>
<input type=hidden id=search-page-url value=/zh/search>
<input id=search-textbox class="search-textbox form-control" name=q type=search aria-label='搜索 istio.io' placeholder=搜索>
<button id=search-close title=取消搜索 type=reset aria-label=取消搜索><svg class="icon menu-close"><use xlink:href="/v1.20/img/icons.svg#menu-close"/></svg></button></form></nav></header><div class=banner-container></div><article class=post itemscope itemtype=http://schema.org/BlogPosting><div class=header-content><h1>Merbridge - 使用 eBPF 实现网络加速</h1><p>用 eBPF 代替 iptables 规则可以将应用发出的包直接转发到对端的 socket从而缩短 sidecar 和服务之间的数据路径。</p></div><p class=post-author>Mar 7, 2022 <span>| </span>By Kebe Liu - DaoCloud, Xiaopeng Han - DaoCloud, Hui Li - DaoCloud</p><div><p>Istio 在流量治理、加密、可观察性和策略方面的能力的秘密都在 Envoy 代理中。Istio 使用 Envoy 作为 “sidecar” 来拦截服务流量,并使用 iptables 配置的内核 <code>netfilter</code> 包过滤功能。</p><p>使用 iptables 来执行这种拦截有一些缺点。由于 netfilter 是一种高度通用的数据包过滤工具在到达目的套接字之前需要应用多种路由规则和数据过滤过程。例如从网络层到传输层netfilter 会使用预定义的规则进行多次处理,如 <code>pre_routing</code><code>post_routing</code> 等。当报文变成 TCP 或 UDP 报文,并被转发到用户空间时,还需要执行一些额外的步骤,如报文验证、协议策略处理和目的套接字搜索。当将 sidecar 配置为拦截流量时,原始数据路径可能会变得非常长,因为重复的步骤会执行多次。</p><p>在过去的两年中,<a href=https://ebpf.io/>eBPF</a>已经成为一种技术趋势,许多基于 eBPF 的项目已经发布到社区。像<a href=https://cilium.io/>Cilium</a><a href=http://px.dev>Pixie</a>这样的工具展示了 eBPF 在可观察性和网络数据包处理方面的大量用例。通过 eBPF 的 <code>sockops</code><code>redir</code> 功能,可以通过直接从入口 socket 传输到出口 socket 来有效地处理数据包。在 Istio mesh 中,可以使用 eBPF 来替代 iptables 规则,并通过缩短数据路径来加速数据平面。</p><p>我们开源了 Merbridge 项目,只需要在 Istio 集群执行以下一条命令,即可直接使用 eBPF 代替 iptables 实现网络加速。</p><pre><code class=language-bash data-expandlinks=true data-repo=istio>$ kubectl apply -f https://raw.githubusercontent.com/merbridge/merbridge/main/deploy/all-in-one.yaml
</code></pre><div><aside class="callout warning"><div class=type><svg class="large-icon"><use xlink:href="/v1.20/img/icons.svg#callout-warning"/></svg></div><div class=content>注意: Merbridge 使用的 eBPF 函数需要 Linux 内核版本≥5.7。</div></aside></div><p>使用 Merbridge通讯可以直接从一个 socket 缩短到另一个目标 socket下面是它的工作原理。</p><h2 id=using-ebpf-sockops-for-performance-optimization>利用 eBPF 的 <code>sockops</code> 进行性能优化</h2><p>网络连接本质上是 socket 之间的通讯eBPF 提供了一个 <a href=https://man7.org/linux/man-pages/man7/bpf-helpers.7.html><code>bpf_msg_redirect_hash</code></a>函数,用来将应用发出的包直接转发到对端的 socket可以极大地加速包在内核中的处理流程。</p><p>这里 <code>sock_map</code> 是记录 socket 规则的关键部分,即根据当前的数据包信息,从 <code>sock_map</code> 中挑选一个存在的 socket 连接来转发请求。所以需要先在 <code>sockops</code> 的 hook 处或者其它地方,将 socket 信息保存到 <code>sock_map</code>,并提供一个规则 (一般为四元组) 根据 key 查找到 socket。</p><h2 id=the-merbridge-approach>Merbridge 的实现原理</h2><p>让我们通过一个真实的场景,一步一步地介绍 Merbridge 的详细设计和实现原则。</p><h3 id=sidecar-traffic-interception-based-on-iptables>基于 iptables 的 Istio sidecar 流量拦截 Istio</h3><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:59.21469284357188%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/1.png title="Istio Sidecar Traffic Interception Based on iptables"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/1.png alt="Istio Sidecar Traffic Interception Based on iptables"></a></div><figcaption>Istio Sidecar Traffic Interception Based on iptables</figcaption></figure><p>当外部流量访问应用的端口时,会在 iptables 中被 <code>PREROUTING</code> 拦截,最后转发到 Sidecar 容器的 15006 端口,然后交给 Envoy 来进行处理 (图中 1-4 的红色路径)。</p><p>Envoy 使用 Istio 控制平面下发的策略对流量进行处理。如果允许,流量将被发送到应用程序容器的实际容器端口。</p><p>当应用想要访问其它服务时,会在 iptables 中被 <code>OUTPUT</code> 拦截,然后转发给 Sidecar 容器的 15001 端口由 Envoy 监听 (图中 9-12 的红色路径),与入口流量的处理差不多。</p><p>原本流量可以直接到应用端口,但是通过 iptables 转发到 Sidecar然后又让 Sidecar 发送给应用,这种方式无疑增加了开销。虽然 iptables 在很多情况下是通用的,但是它的通用性决定了它的性能并不总是很理想,因此它不可避免地会在不同的过滤规则下,给整个链路增加延迟。</p><p>如果使用 <code>sockops</code> 将 Sidecar 直接连接到应用的 Socket就可以使流量不经过 iptables加速处理流程明显提高性能。</p><h3 id=processing-outbound-traffic>出口流量处理</h3><p>如上所述,我们希望使用 eBPF 的 <code>sockops</code> 来绕过 iptables 以加速网络请求,同时希望能够完全适配社区版 Istio所以需要先模拟 iptables 所做的操作。</p><p>iptables 本身使用 <code>DNAT</code> 功能做流量转发,想要用 eBPF 模拟 iptables 的能力,就需要使用 eBPF 实现类似 iptables <code>DNAT</code> 的能力。</p><ol><li>修改连接发起时的目的地址,让流量能够发送到新的接口。</li><li>让 Envoy 能识别原始的目的地址,以能够识别流量。</li></ol><p>对于第一点,可以使用 eBPF 的 <code>connect</code> 程序修改 <code>user_ip</code><code>user_port</code> 实现。</p><p>对于第二点,需要用到 <code>ORIGINAL_DST</code> 的概念,这在 Linux 内核中是 <code>netfilter</code> 模块专属的。</p><p>其原理为:应用程序 (包括 Envoy) 在收到连接之后调用 <code>get_sockopts</code> 函数,获取 <code>ORIGINAL_DST</code>。如果经过了 iptables 的 <code>DNAT</code>,那么 iptables 就会给当前的 socket 设置 <code>ORIGINAL_DST</code> 这个值,并把原有的 IP + 端口写入这个值,应用程序就可以根据连接拿到原有的目的地址。</p><p>那么我们就需要通过 eBPF 的 <code>get_sockopt</code> 函数来修改这个调用 (不用 <code>bpf_setsockopt</code> 的原因是目前这个参数并不支持 <code>SO_ORIGINAL_DST</code> 的 optname)。</p><p>参考下图,当一个应用程序发起一个请求时,它会经过以下步骤:</p><ol><li>在应用向外发起连接时,<code>connect</code> 程序会将目标地址修改为 <code>127.x.y.z:15001</code>,并用 <code>cookie_original_dst</code> 保存原始目的地址。</li><li><code>sockops</code> 程序中,将当前 sock 和四元组保存在 <code>sock_pair_map</code> 中。同时,将四元组信息和对应的原始目的地址写入 <code>pair_original_dst</code> 中 (之所以不用 cookie是因为 <code>get_sockopt</code> 函数无法获取当前 cookie)。</li><li>Envoy 收到连接之后会调用 <code>getsockopt</code> 获取当前连接的目的地址,<code>get_sockopt</code> 函数会根据四元组信息从 <code>pair_original_dst</code> 取出原始目的地址并返回,由此完全建立连接。</li><li>在发送数据阶段,<code>redir</code> 程序会根据四元组信息,从 <code>sock_pair_map</code> 中读取 sock然后通过 <code>bpf_msg_redirect_hash</code> 进行直接转发,加速请求。</li></ol><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:70%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/2.png title="Processing Outbound Traffic"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/2.png alt="Processing Outbound Traffic"></a></div><figcaption>Processing Outbound Traffic</figcaption></figure><p>其中,之所以在 <code>connect</code> 时,修改目的地址为 <code>127.x.y.z</code> 而不是 <code>127.0.0.1</code>,是因为在不同的 Pod 中,可能产生冲突的四元组,使用此方式即可巧妙地避开冲突 (每个 Pod 间的目的 IP 不同,不会出现冲突的情况)。</p><h3 id=inbound-traffic-processing>入口流量处理</h3><p>入口流量处理基本和出口流量类似,唯一的区别是需要将目的地址端口改成 15006。</p><p>但是需要注意,由于 eBPF 不像 iptables 能在指定命名空间生效,它是全局的,这就造成如果针对一个本来不是 Istio 管理的 Pod 或者一个外部的 IP 地址,也进行了修改端口的操作,那就会引起严重问题,会让请求无法建立连接。</p><p>所以这里设计了一个小的控制平面 (以 DaemonSet 方式部署) Watch 所有的 Pod类似于 kubelet 那样获取当前节点的 Pod 列表,将已经注入 Sidecar 的 Pod IP 地址写入 <code>local_pod_ips</code> 这个 map。
当处理入站流量时,如果目的地址不在映射中,我们将不会对流量做任何操作。</p><p>当我们在做入口流量处理时,如果目的地址不在这个列表之中,就不做处理,让它走原来的逻辑,这样就可以比较灵活且简单地处理入口流量。</p><p>其他流程和出口流量流程一样</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:70.817843866171%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/3.png title="Processing Inbound Traffic"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/3.png alt="Processing Inbound Traffic"></a></div><figcaption>Processing Inbound Traffic</figcaption></figure><h3 id=same-node-acceleration>同节点加速</h3><p>通过入口流量处理,理论上可以直接加速同节点的 Envoy 到 Envoy 速度。但这个场景存在一个问题Envoy 访问当前 Pod 的应用时会出错。</p><p>在 Istio 中Envoy 访问应用的方式是使用当前 <code>PodIP</code> 加服务端口。经过上述入口流量处理后,我们会发现由于 <code>PodIP</code> 也存在于 <code>local_pod_ips</code> 中,那么这个请求会被转发到 <code>PodIP</code> 的 15006 端口,这显然是不行的,会造成无限递归。</p><p>问题来了: 是否有办法可以用 eBPF 获取当前名称空间中的 IP 地址?答案是肯定的!</p><p>我们设计了一套反馈机制: 在 Envoy 尝试建立连接时,还是会走重定向到 15006 端口,但是在 <code>sockops</code> 阶段会判断源 IP 和目的地址 IP 是否一致。如果一致,代表发送了错误的请求,那么我们会在 <code>sockops</code> 丢弃这个连接,并将当前的 <code>ProcessID</code><code>IP</code> 地址信息写入 <code>process_ip</code> 这个 map让 eBPF 支持进程与 IP 的对应关系。</p><p>当下次发送请求时,直接从 <code>process_ip</code> 表检查目的地址是否与当前 IP 地址一致。</p><div><aside class="callout warning"><div class=type><svg class="large-icon"><use xlink:href="/v1.20/img/icons.svg#callout-warning"/></svg></div><div class=content>Envoy 会在请求失败时重试,且这个错误只会发生一次,后续的连接会非常快。</div></aside></div><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:70.11884550084889%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/4.png title="Same-node acceleration"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/4.png alt="Same-node acceleration"></a></div><figcaption>Same-node acceleration</figcaption></figure><h3 id=connection-relationship>连接关系</h3><p>在使用 Merbridge 应用 eBPF 之前Pod 到 Pod 间的访问如下:</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:60.411311053984576%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/5.png title="iptables's data path"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/5.png alt="iptables's data path"></a></div><figcaption>iptables's data path</figcaption></figure><p>应用 Merbridge 后,出站流量会跳过许多过滤步骤来提高性能:</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:61.20358514724712%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/6.png title="eBPF's data path"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/6.png alt="eBPF's data path"></a></div><figcaption>eBPF's data path</figcaption></figure><p>如果两个pod在同一台机器上通讯将更加高效:</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:55.346650998824906%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/7.png title="eBPF's data path on the same machine"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/7.png alt="eBPF's data path on the same machine"></a></div><figcaption>eBPF's data path on the same machine</figcaption></figure><h2 id=performance-results>性能结果</h2><div><aside class="callout warning"><div class=type><svg class="large-icon"><use xlink:href="/v1.20/img/icons.svg#callout-warning"/></svg></div><div class=content>下面的测试来自我们的开发,尚未在生产用例中验证。</div></aside></div><p>使用 eBPF 代替 iptables 对总体延迟的影响(越低越好):</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:56.84007707129094%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/8.png title="Latency vs Client Connections Graph"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/8.png alt="Latency vs Client Connections Graph"></a></div><figcaption>Latency vs Client Connections Graph</figcaption></figure><p>我们还可以看到使用 eBPF 后的整体 QPS(越高越好)。测试结果由 <code>wrk</code> 测试得出。</p><figure style=width:100%><div class=wrapper-with-intrinsic-ratio style=padding-bottom:59.25233644859813%><a data-skipendnotes=true href=/v1.20/zh/blog/2022/merbridge/9.png title="QPS vs Client Connections Graph"><img class=element-to-stretch src=/v1.20/zh/blog/2022/merbridge/9.png alt="QPS vs Client Connections Graph"></a></div><figcaption>QPS vs Client Connections Graph</figcaption></figure><h2 id=summary>总结</h2><p>我们在这篇文章中介绍了 Merbridge 的核心思想。通过使用 eBPF 代替 iptables可以在服务网格场景下完全无感知地对流量通路进行加速。同时不会对现有的 Istio 做任何修改,原有的逻辑依然畅通。这意味着,如果以后不再使用 eBPF那么可以直接删除掉 DaemonSet改为传统的 iptables 方式后,也不会出现任何问题。</p><p>Merbridge 是一个完全独立的开源项目。它仍处于早期阶段,我们期待有更多的用户和开发者参与进来。如果你能尝试这种新技术来加速你的网格,并给我们一些反馈,我们将不胜感激!</p><h2 id=see-also>另请参阅</h2><ul><li><a href=https://github.com/merbridge/merbridge>Merbridge on GitHub</a></li><li><a href=https://developpaper.com/kubecon-2021-%EF%BD%9C-using-ebpf-instead-of-iptables-to-optimize-the-performance-of-service-grid-data-plane/>使用 eBPF 代替 iptables 优化业务网格数据平面的性能</a> by Liu Xu, Tencent</li><li><a href=https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/>详细阐述了 Istio 中的 Sidecar 注入和透明流量劫持过程</a> by Jimmy Song, Tetrate</li><li><a href=https://01.org/blogs/xuyizhou/2021/accelerate-istio-dataplane-ebpf-part-1>使用 eBPF 加速 Istio 数据平面</a> by Yizhou Xu, Intel</li><li><a href=https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/listener_filters/original_dst_filter>特使的原始目的地过滤器</a></li></ul></div><nav class=pagenav><div class=left><a title="使用代理服务器在具有外部控制平面的网格中支持 istioctl 命令。" href=/v1.20/zh/blog/2022/istioctl-proxy/ class=next-link><svg class="icon left-arrow"><use xlink:href="/v1.20/img/icons.svg#left-arrow"/></svg>为从集群配置 istioctl</a></div><div class=right></div></nav></article><footer class=footer><div class="footer-wrapper container-l"><div class="user-links footer-links"><a class=channel title='Istio 的代码在 GitHub 上开发' href=https://github.com/istio/community aria-label=GitHub><svg class="icon github"><use xlink:href="/v1.20/img/icons.svg#github"/></svg>
</a><a class=channel title='如果您想深入了解 Istio 的技术细节,请查看我们日益完善的设计文档' href=https://groups.google.com/forum/#!forum/istio-team-drive-access aria-label="team drive"><svg class="icon drive"><use xlink:href="/v1.20/img/icons.svg#drive"/></svg>
</a><a class=channel title='在 Slack 上与 Istio 社区交互讨论开发问题(仅限邀请)' href=https://slack.istio.io aria-label=slack><svg class="icon slack"><use xlink:href="/v1.20/img/icons.svg#slack"/></svg>
</a><a class=channel title='Stack Overflow 中列举了针对实际问题以及部署、配置和使用 Istio 的各项回答' href=https://stackoverflow.com/questions/tagged/istio aria-label="Stack Overflow"><svg class="icon stackoverflow"><use xlink:href="/v1.20/img/icons.svg#stackoverflow"/></svg>
</a><a class=channel title='关注我们的 Twitter 来获取最新信息' href=https://twitter.com/IstioMesh aria-label=Twitter><svg class="icon twitter"><use xlink:href="/v1.20/img/icons.svg#twitter"/></svg></a></div><hr class=footer-separator role=separator><div class="info footer-info"><a class=logo href=/v1.20/zh/ aria-label=logotype><svg xmlns="http://www.w3.org/2000/svg" width="128" height="60" viewBox="0 0 128 60"><path d="M58.434 48.823A.441.441.0 0158.3 48.497V22.583a.444.444.0 01.134-.326.446.446.0 01.327-.134h3.527a.447.447.0 01.325.134.447.447.0 01.134.326v25.914a.443.443.0 01-.134.326.444.444.0 01-.325.134h-3.527a.444.444.0 01-.327-.134z"/><path d="m70.969 48.477a6.556 6.556.0 01-2.818-1.955 4.338 4.338.0 01-1-2.78v-.345a.443.443.0 01.134-.326.444.444.0 01.326-.135h3.374a.444.444.0 01.326.135.445.445.0 01.134.326v.077a2.014 2.014.0 001.054 1.667 4.672 4.672.0 002.664.709 4.446 4.446.0 002.492-.633 1.862 1.862.0 00.958-1.591 1.426 1.426.0 00-.786-1.322 12.7 12.7.0 00-2.549-.939l-1.457-.46a21.526 21.526.0 01-3.3-1.227 6.57 6.57.0 01-2.262-1.783 4.435 4.435.0 01-.92-2.894 5.081 5.081.0 012.109-4.275 8.993 8.993.0 015.558-1.591 10.445 10.445.0 014.1.748 6.3 6.3.0 012.722 2.07 5 5 0 01.958 3.009.441.441.0 01-.134.326.441.441.0 01-.325.134h-3.258a.441.441.0 01-.326-.134.443.443.0 01-.134-.326 1.974 1.974.0 00-.978-1.667 4.647 4.647.0 00-2.665-.671 4.741 4.741.0 00-2.435.556 1.724 1.724.0 00-.938 1.553 1.512 1.512.0 00.9 1.4 15.875 15.875.0 003.01 1.055l.843.229a27.368 27.368.0 013.412 1.246 6.67 6.67.0 012.338 1.763 4.387 4.387.0 01.958 2.933 4.988 4.988.0 01-2.146 4.275 9.543 9.543.0 01-5.712 1.552 11.626 11.626.0 01-4.227-.709z"/><path d="m97.039 32.837a.443.443.0 01-.326.135h-3.911a.169.169.0 00-.191.192v9.239a2.951 2.951.0 00.632 2.108 2.7 2.7.0 002.013.652h1.15a.444.444.0 01.325.134.441.441.0 01.134.326v2.875a.471.471.0 01-.459.5l-1.994.039a8 8 0 01-4.524-1.035q-1.495-1.035-1.533-3.91V33.166A.17.17.0 0088.164 32.974H85.978A.441.441.0 0185.652 32.839.441.441.0 0185.518 32.513V29.83a.441.441.0 01.134-.326.444.444.0 01.326-.135h2.186a.169.169.0 00.191-.192v-4.485a.438.438.0 01.134-.326.44.44.0 01.325-.134h3.336a.443.443.0 01.325.134.442.442.0 01.135.326v4.485a.169.169.0 00.191.192h3.911a.446.446.0 01.326.135.446.446.0 01.134.326v2.683a.446.446.0 01-.133.324z"/><path d="m101.694 25.917a2.645 2.645.0 01-.767-1.955 2.65 2.65.0 01.767-1.955 2.65 2.65.0 011.955-.767 2.65 2.65.0 011.955.767 2.652 2.652.0 01.767 1.955 2.647 2.647.0 01-.767 1.955 2.646 2.646.0 01-1.955.767 2.645 2.645.0 01-1.955-.767zm-.211 22.906a.441.441.0 01-.134-.326V29.79a.444.444.0 01.134-.326.446.446.0 01.326-.134h3.527a.446.446.0 01.326.134.445.445.0 01.134.326v18.707a.443.443.0 01-.134.326.443.443.0 01-.326.134h-3.527a.443.443.0 01-.326-.134z"/><path d="m114.019 47.734a8.1 8.1.0 01-3.047-4.255 14.439 14.439.0 01-.652-4.37 14.3 14.3.0 01.614-4.371A7.869 7.869.0 01114 30.56a9.072 9.072.0 015.252-1.5 8.543 8.543.0 015.041 1.5 7.985 7.985.0 013.009 4.14 12.439 12.439.0 01.69 4.37 13.793 13.793.0 01-.651 4.37 8.255 8.255.0 01-3.028 4.275 8.475 8.475.0 01-5.1 1.553 8.754 8.754.0 01-5.194-1.534zm7.629-3.1a4.536 4.536.0 001.476-2.262 11.335 11.335.0 00.383-3.221 10.618 10.618.0 00-.383-3.22 4.169 4.169.0 00-1.457-2.243 4.066 4.066.0 00-2.531-.785 3.942 3.942.0 00-2.453.785 4.376 4.376.0 00-1.5 2.243 11.839 11.839.0 00-.383 3.22 11.84 11.84.0 00.383 3.221 4.222 4.222.0 001.476 2.262 4.075 4.075.0 002.549.8 3.8 3.8.0 002.44-.809z"/><path d="m15.105 32.057v15.565a.059.059.0 01-.049.059L.069 50.25A.06.06.0 01.005 50.167l14.987-33.47a.06.06.0 01.114.025z"/><path d="m17.631 23.087v24.6a.06.06.0 00.053.059l22.449 2.507a.06.06.0 00.061-.084L17.745.032a.06.06.0 00-.114.024z"/><path d="m39.961 52.548-24.833 7.45a.062.062.0 01-.043.0L.079 52.548a.059.059.0 01.026-.113h39.839a.06.06.0 01.017.113z"/></svg></a><div class=footer-languages><a tabindex=-1 lang=en id=switch-lang-en class=footer-languages-item>English
</a><a tabindex=-1 lang=zh id=switch-lang-zh class="footer-languages-item active"><svg class="icon tick"><use xlink:href="/v1.20/img/icons.svg#tick"/></svg>
中文</a></div></div><ul class=footer-policies><li class=footer-policies-item><a class=footer-policies-link href=https://www.linuxfoundation.org/legal/terms>条款
</a>|
<a class=footer-policies-link href=https://www.linuxfoundation.org/legal/privacy-policy>隐私政策
</a>|
<a class=footer-policies-link href=https://www.linuxfoundation.org/legal/trademark-usage>商标
</a>|
<a class=footer-policies-link href=https://github.com/istio/istio.io/edit/release-1.20/content/zh/index>在 GitHub 上编辑此页</a></li></ul><div class=footer-base><span class=footer-base-copyright>&copy; 2024 the Istio Authors.</span>
<span class=footer-base-version>部分内容可能滞后于英文版本,同步工作正在进行中<br>版本
Istio 归档
1.20.3</span><ul class=footer-base-releases><li class=footer-base-releases-item><a tabindex=-1 class=footer-base-releases-link onclick='return navigateToUrlOrRoot("https://istio.io/blog/2022/merbridge/"),!1'>当前版本</a></li><li class=footer-base-releases-item><a tabindex=-1 class=footer-base-releases-link onclick='return navigateToUrlOrRoot("https://preliminary.istio.io/blog/2022/merbridge/"),!1'>下个版本</a></li><li class=footer-base-releases-item><a tabindex=-1 class=footer-base-releases-link href=https://istio.io/archive>旧版本</a></li></ul></div></div></footer><div id=scroll-to-top-container aria-hidden=true><button id=scroll-to-top title=回到顶部 tabindex=-1><svg class="icon top"><use xlink:href="/v1.20/img/icons.svg#top"/></svg></button></div></body></html>