什么是 eBPF ? Link to heading
eBPF 是一项革命性的技术,起源于 Linux 内核,它可以在特权上下文中(如操作系统内核)运行沙盒程序。它用于安全有效地扩展内核的功能,而无需通过更改内核源代码或加载内核模块的方式来实现。
从历史上看,由于内核具有监督和控制整个系统的特权,操作系统一直是实现可观测性、安全性和网络功能的理想场所。同时,由于操作系统内核的核心地位和对稳定性和安全性的高要求,操作系统内核很难快速迭代发展。因此在传统意义上,与在操作系统本身之外实现的功能相比,操作系统级别的创新速度要慢一些。
eBPF 从根本上改变了这个方式。通过允许在操作系统中运行沙盒程序的方式,应用程序开发人员可以运行 eBPF 程序,以便在运行时向操作系统添加额外的功能。然后在 JIT 编译器和验证引擎的帮助下,操作系统确保它像本地编译的程序一样具备安全性和执行效率。这引发了一股基于 eBPF 的项目热潮,它们涵盖了广泛的用例,包括下一代网络实现、可观测性和安全功能等领域。
如今,eBPF 被广泛用于驱动各种用例:在现代数据中心和云原生环境中提供高性能网络和负载均衡,以低开销提取细粒度的安全可观测性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排查、预防性的安全策略执行(包括应用层和容器运行时)提供洞察,等等。可能性是无限的,eBPF 开启的创新才刚刚开始。
eBPF 和 BPF 分别代表什么 ? Link to heading
BPF 最初代表伯克利包过滤器 (Berkeley Packet Filter),但是现在 eBPF(extended BPF) 可以做的不仅仅是包过滤,这个缩写不再有意义了。eBPF 现在被认为是一个独立的术语,不代表任何东西。在 Linux 源代码中,术语 BPF 持续存在,在工具和文档中,术语 BPF 和 eBPF 通常可以互换使用。最初的 BPF 有时被称为 cBPF(classic BPF),用以区别于 eBPF。
为什么使用 eBPF ? Link to heading
可编程性的力量 Link to heading
让我们从一个类比开始。你还记得 GeoCities 吗? 20 年前,网页几乎完全由静态标记语言(HTML)编写。网页基本上是一个文档,有一个应用程序(浏览器)可以显示它。看看今天的网页,网页已经成为成熟的应用程序,基于 web 的技术已经取代了绝大多数用需要编译的语言所编写的应用程序。是什么促成了这种演进 ?
简短的回答是通过引入 JavaScript 实现可编程性。它开启了一场巨大的革命,导致浏览器几乎演变成一个独立的操作系统。
为什么会发生这个演进 ?程序员不再受制于运行特定浏览器版本的用户。提升必要构建模块的可用性,将底层浏览器的创新速度与运行在其上的应用程序解耦开来,而不是去说服标准机构需要一个新的 HTML 标签。这当然有点过于简化这个过程中的变化了,因为 HTML 确实随着时间的推移而一直发展,并对这个演进的成功做出了贡献,但 HTML 本身的发展还不足够满足需求。
在将这个示例应用于 eBPF 之前,让我们先看一下在引入 JavaScript 过程中的几个关键方面:
- 安全:不受信任的代码在用户的浏览器中运行。这个问题通过沙箱 JavaScript 程序和抽象对浏览器数据的访问来解决。
- 持续交付:程序逻辑的演进必须能够在不需要不断发布新浏览器版本的情况下实现。通过提供适当的底层构建模块来构建任意逻辑,解决了这个问题。
- 性能:必须以最小的开销提供可编程性。这个问题通过引入即时(JIT)编译器得到了解决。由于同样的原因,上述所有方面都可以在 eBPF 中找到完全对应的内容。
eBPF 对 Linux 内核的影响 Link to heading
现在让我们回到 eBPF。为了理解 eBPF 对 Linux 内核的可编程性的影响,有必要对 Linux 内核的体系结构及其与应用程序和硬件的交互方式有一个高层次的了解。
Linux 内核的主要目的是对硬件或虚拟硬件进行抽象,并提供一致的 API(系统调用),允许应用程序运行和共享资源。为了实现这一点,内核维护了一组广泛的子系统和层来分配这些职责。每个子系统通常允许某种级别的配置,以满足用户的不同需求。如果无法配置所需的行为,则需要更改内核,从历史上看,只剩下两个选项:
-
原生支持
- 更改内核源代码并使 Linux 内核社区相信改动是有必要的。
- 等待几年后,新的内核才会成为一个通用版本。
-
内核模块
- 编写一个内核模块
- 定期修复它,因为每个内核版本都可能破坏它
- 由于缺乏安全边界,有可能损坏 Linux 内核
有了 eBPF,就有了一个新的选项,它允许重新编程 Linux 内核的行为,而不需要更改内核源代码或加载内核模块。在许多方面,这与 JavaScript 和其他脚本语言解锁系统演进的方式非常相像,对这些系统进行改动的原有方式已经变得困难或昂贵。
文章内容节选自 ebpf.io