mirror of https://github.com/istio/istio.io.git
29 lines
33 KiB
HTML
29 lines
33 KiB
HTML
<!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>© 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> |