![null c73019831082a7cbc997f37b11cafec1.jpeg](https://img-blog.csdnimg.cn/img_convert/c73019831082a7cbc997f37b11cafec1.jpeg)
本次大会由西安邮电大学主办,主题为“发挥 eBPF 技术力量,提升计算机系统可观测性和性能”,旨在探讨和分享 eBPF 技术的最新发展和应用。会议不仅提供 30 余场精彩报告,还特别准备了丰富的现场互动环节,确保每位参会者都能获得最前沿的技术信息和实际应用知识。
Flomesh 应邀参加了本次大会,架构师张晓辉参会并做了题为“Pipy 与 eBPF:重塑系统级编程的新范式”的分享。
在本次技术分享中,重点探讨 Pipy 与 eBPF 结合创造的全新编程模式及其在网络场景中的潜力。Pipy,作为一个高性能且低资源的可编程引擎,与 eBPF 的结合超越了传统的网络流量处理和系统监控领域,开辟了新的应用可能性。我们将重点介绍这种创新模式如何实现更灵活、更高效的编程和运维实践,特别是通过网络动态更新 BPF 程序来增强能力。
eBPF 的工作场景
可观测
eBPF 强大的观测能力允许它收集系统运行时的各种指标,如 CPU 使用率、内存使用、网络 I/O、系统调用等,而且这种监控对系统的性能影响极小。这使得 eBPF 非常适合实时监控和性能分析。开发者可以利用 eBPF 实现精细的性能跟踪和故障诊断,帮助提高应用和服务的性能和稳定性。
安全
在安全领域,eBPF 允许开发人员创建更细粒度和高度定制的安全策略,无需更改内核代码或加载内核模块。它能够监控和控制系统调用、文件访问、网络访问等,从而有效防范恶意软件和其他安全威胁。
网络
eBPF 在网络技术领域的应用确实表现出上升趋势。它可以在内核级别进行包过滤、路由决策、负载均衡等操作,这些都是通过编写安全、高效的代码直接在内核中运行来完成的。例如,使用 eBPF 可以创建动态的网络流量监控工具,或者实现更复杂的网络功能,如 DDoS 防护策略、精细的流量管理和网络性能优化等。此外,eBPF 也支持构建高性能的网络功能虚拟化(NFV)解决方案,这对现代数据中心尤为重要。
eBPF 以接近零的性能开销提供这些场景的解决方案,在云计算和大数据环境中变得尤为重要。随着技术的成熟和社区的活跃,我们可以预见 eBPF 在未来将在网络领域发挥更加重要的角色。
网络也是这次分享的重点场景。
![null 8ec798c46c92744b811b4557fc16aad3.jpeg](https://img-blog.csdnimg.cn/img_convert/8ec798c46c92744b811b4557fc16aad3.jpeg)
eBPF 数据路径
eBPF 在 Linux 数据路径方面的应用,特别是在网络数据处理和性能优化上具有重要意义。在 Linux 数据路径中,eBPF 允许用户在内核中运行的代码对数据包进行高度定制的处理,这也在很多方面都非常有用,比如网络监控、安全、和性能增强。
eBPF 允许在网络堆栈的多个点插入钩子,以便在数据包到达网络接口、通过路由决策、甚至在达到用户空间应用程序之前进行处理。开发者可以编写自定义的数据包处理逻辑,如过滤、重定向、或修改数据包。
![null 7782554027f4e8076e7c38a3aea18c88.jpeg](https://img-blog.csdnimg.cn/img_convert/7782554027f4e8076e7c38a3aea18c88.jpeg)
eBPF 网络示例
说起 eBPF 在网络方面的应用,就不得不说近几年 CNCF 中比较火热的 Cilium。Cilium 是基于 eBPF 技术的一个非常流行的开源项目,它在近年来尤其在容器和 Kubernetes 环境中得到了广泛的应用。Cilium 利用 eBPF 提供网络安全、可见性和网络流量管理的高级功能。
虽然 eBPF 提供了在 L3/L4 层级上处理数据包的强大能力和性能优势,但在 L7 —— 即应用层的处理上,情况则复杂得多。eBPF 在 L3/4 层处理方面的优势主要源自其能够在内核空间直接操作和分析数据包,这样可以极大减少上下文切换和数据包的复制。
到了 L7,流量处理变得更为复杂。在这一层,流量不仅仅包括简单的网络包,还包括对具体应用数据的理解和处理。就拿应用广泛的应用层协议 HTTP 来说,如 HTTP 请求的头部解析、WebSocket 支持等。这些功能通常需要更多的资源和复杂的逻辑,因此用 eBPF 直接实现这些高级功能会面临性能和复杂性的挑战。
Cilium 尝试通过引入 per-node sidecar 代理,并通过多个组件(Agent、Proxy、BPF Map、BPF 程序)的协作在来解决该问题。该方案涉及多技术栈、多个组件和多层协作,这不仅增加了系统的复杂性,也要求运维团队必须具备跨层次的知识,以有效地管理和故障排查;同时也对功能的扩展带来了成本。
是否有更加简洁的设计,来降低解决方案的复杂度呢?有,接下来就有请今天的另一个主角 Pipy。
![null 350532133672a90a483bfec7e3de9c78.jpeg](https://img-blog.csdnimg.cn/img_convert/350532133672a90a483bfec7e3de9c78.jpeg)
Pipy 是什么?
Pipy[1] 是一个开源的可编程应用引擎,它使用 C++ 开发。它支持通过 JS 编程的方式来实现网络流量的处理,以及复杂的应用逻辑,这些功能都可以通过编写 JS 文件来实现。
![null 3304160743bcefc2128e6ff75bba2ca7.jpeg](https://img-blog.csdnimg.cn/img_convert/3304160743bcefc2128e6ff75bba2ca7.jpeg)
Pipy 架构
Pipy 是一个单一的可执行文件,无需其他依赖。其分层架构非常简单,底层依赖非常少;中层 API 层是核心层,封装了网络流处理、BPF、NetLink,以及可编程的核心 Pipeline API;上层是一个自研的 JS 引擎,可以处理 PipyJS(标准 JavaScript 的定制版本) 的脚本。
![null 62bd959c96876c6b6ccfd4116a493818.jpeg](https://img-blog.csdnimg.cn/img_convert/62bd959c96876c6b6ccfd4116a493818.jpeg)
我们可以使用 JS 语法和 Pipy 提供的 API 来编写个简单 HTTP 负载均衡器,这些 JS 代码就是我们上面说的 PipyJS 脚本。
可以看到其使用了 JS 的语法,以及 Pipy 提供的 API,比如流处理、网络 API。
![null 031335ab5496e7e2142a91b668210012.jpeg](https://img-blog.csdnimg.cn/img_convert/031335ab5496e7e2142a91b668210012.jpeg)
Pipy Repo
Pipy 有多种运行方式,比如上面直接加载 JS 脚本文件。它还可以从网络加载文件(不限于 JS 文件,还可以有静态资源、证书密钥、甚至是编译好的 BPF .o
文件),一种类似 GitOps 的模型。
这种模型依赖运行于 Repo 模式的 Pipy,其提供了 Admin API 对其中的文件进行管理,通过通过网络向其他节点实时同步文件,节点收到更新后可以进行热加载而无需重启。
![null 16d97208ecbff271e97311693bcd3dc3.jpeg](https://img-blog.csdnimg.cn/img_convert/16d97208ecbff271e97311693bcd3dc3.jpeg)
Pipy BPF API
Pipy 的 BPF API 提供了 BPF 程序、Map 的相关操作。比如通过 Pipy BPF API,可以实现 BPF 程序的加载、挂载、分离等操作,还有 Map 的更新操作。
![null 344b27c13bb33e60ce63012cb96db974.jpeg](https://img-blog.csdnimg.cn/img_convert/344b27c13bb33e60ce63012cb96db974.jpeg)
Pipy 和 eBPF 实现透明代理
让我们通过一个简单的例子来看 Pipy BPF API 的使用,这个例子我们之前在 Flomesh 公众号上分享过:使用 Pipy 和 eBPF 实现的透明代理。
通过 JS 编程,我们可以使用 BPF API 来对 BPF 程序和 Map 进行操作。在同一个进程,甚至是同一个 JS 脚本文件[2] 中,我们还实现了一个 Pipy 代理。
在同一个技术栈、进程中,我们实现对 BPF 程序的操作,以及应用层的网络处理。
![null 8f86b571fa782878bfcc8abacbde4d92.jpeg](https://img-blog.csdnimg.cn/img_convert/8f86b571fa782878bfcc8abacbde4d92.jpeg)
![null 70f74a0f839bc6e040fa50489a37e5ae.jpeg](https://img-blog.csdnimg.cn/img_convert/70f74a0f839bc6e040fa50489a37e5ae.jpeg)
![null 20013e2e8d76c0ec10a64de3eee1c82f.jpeg](https://img-blog.csdnimg.cn/img_convert/20013e2e8d76c0ec10a64de3eee1c82f.jpeg)
在我们的 GitHub 仓库[3] 中,还提供了更多的 Pipy 与 eBPF 的示例,有兴趣的同学可以下载浏览。
![null faebce91a0a8e5521c0deef1ab686637.jpeg](https://img-blog.csdnimg.cn/img_convert/faebce91a0a8e5521c0deef1ab686637.jpeg)
这里多提一下 Pipy NetLink API,通过其可以将 XDP 类型的 BPF 程序挂载到网络设备上。
![null 7c9b547a1091f030604c1c6b66385834.jpeg](https://img-blog.csdnimg.cn/img_convert/7c9b547a1091f030604c1c6b66385834.jpeg)
eBPF 与 Pipy 的相同点
最后我们来看看 eBPF 和 Pipy 最基本的介绍作为总结。
eBPF 和 Pipy 都强调了动态可编程性作为其核心特性,这让它们在各自的领域内非常有用且灵活。二者都是基于稳定的微核心(eBPF 之于 Linux kernel,PipyJS 之于 Pipy),提供可编程的能力。
这里将 Linux kernel 比作微核心,这里的“微”是相对的,相对于直接在 kernel 中扩展实现自定义可观测、安全、网络功能使其膨胀。
反而,这次大会上大家也预测未来的 kernel 会不会更加轻量级,因为其部分功能不是所有应用场景都必须的,反而可以通过 eBPF 来提供。
![null edb7a11137bcf094ccfc57142a90808c.jpeg](https://img-blog.csdnimg.cn/img_convert/edb7a11137bcf094ccfc57142a90808c.jpeg)
更多:Pipy Inside
随着云计算的兴起,企业的网络基础设施迅速发展和演变。无论是公有云、私有云还是边缘计算,都为企业带来了前所未有的机会和挑战。流量管理技术,如 CDN、隧道、WAF 等,也不断适应新的需求和环境。涉及的网络基础设施可达十几种,有兴趣的可以看下我们之前发表的“你应该知晓的十几种企业流量管理设施”
Pipy 凭借其强大的网络编程能力,实现这些基础设施的功能,提供一站式的流量管理。通过 “Pipy 与 eBPF 重塑系统级编程的新范式”,Pipy 可以将 eBPF 的应用扩展这些基础设施。比如在服务网格中,使用 eBPF 进行容器内的流量拦截。
不只是 Pipy Inside,会是 Pipy & eBPF Inside !
![null 325aa24acc39299b1e84b8d48b3d282a.jpeg](https://img-blog.csdnimg.cn/img_convert/325aa24acc39299b1e84b8d48b3d282a.jpeg)
关于 Flomesh
Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。
Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持使用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、macOS、Windows、OpenWrt 等多种核心的操作系统。
Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。
加入 Flomesh 社区
添加小 P 成为好友,参与社区互动,享受丰富互动并获取独家周边礼品!
![null c3e44c950b35854a4ec8be35db8ae6e5.jpeg](https://img-blog.csdnimg.cn/img_convert/c3e44c950b35854a4ec8be35db8ae6e5.jpeg)
引用链接
[1]
Pipy: https://github.com/flomesh-io/pipy[2]
JS 脚本文件: https://github.com/flomesh-io/pipy/blob/main/samples/bpf/transparent-proxy/main.js[3]
GitHub 仓库: https://github.com/flomesh-io/pipy/tree/main/samples/bpf