1. 介绍
仅仅数年,eBPF 已一跃成为了现代基础设施领域中最热门的技术之一。就我而言,自从在 DockerCon 17 的黑带会议上听到 Thomas Graf 的演讲以来,我就一直对 eBPF 带来的可能性感到兴奋。在云原生计算基金会(CNCF),技术监督委员会的同事曾将 eBPF 预测为 2021 年将起飞的技术的关注领域之一。超过 2500 人报名参加了当年的 eBPF 峰会虚拟会议,与此同时世界上几个最先进的软件公司共同创建了eBPF基金会。显而易见,人们对 eBPF 技术抱有很大的兴趣。
在简短的报告中,我希望能能够为解释为何 eBPF 技术让人感到振奋,以及其为现代计算环境中的工具提供的超强能力。在此,你将会了解到 eBPF 是什么以及其为何拥有如此强大的能力。为了讲解更加具体,我提供了部分代码例子给说明(当然,你可以跳过这些样例代码)。你还将了解在构建支持 eBPF 工具时所涉及的内容,以及为什么 eBPF 会在在如此短的时间内变得如此流行。
由于报告简短,不能带提供相关的所有细节,但如果你想更深入地研究,我也提供了一些更加深入学习的信息。
扩展的伯克利数据包过滤
eBPF 为 Extended Berkeley Packet Filter 的缩写。从字面意思上,你可以了解到其主要目的为网络报文过滤,原始论文为伯克利实验室所编写(Lawrence Berkeley National Laboratory)。但就我看来,当前该名字已经不能表达 eBPF 说代表的真正力量,"扩展" 版本功能已经远远超出了网络报文的过滤。如今,eBPF 已被当做技术统称,所代表的已经远超字面代表的含义。
那么,既然不再仅仅为网络报文过滤,eBPF 到底代表了什么呢?eBPF 是一个框架,允许用户在操作系统的内核中加载和运行自定义程序,可用于扩展甚至修改内核行为。
当一个 eBPF 程序被加载到内核中时,由验证器(verifier)确保其运行是安全的,否则,验证器就会拒绝加载。验证通过后,一旦 eBPF 程序被加载至内核,eBPF 程序就需要附加到事件之上,因此如事件发生,eBPF 程序就被触发运行。
eBPF 最初是为 Linux 开发的,因此该报告中将重点关注在 Linux 操作系统;但值得注意的是,截至本文写作时,微软正在开发一个 Windows 的 eBPF 实现。
现在,广泛使用的 Linux 内核都支持 "扩展" 部分,而术语 eBPF 和 BPF 现在基本上可等同使用。
基于 eBPF 工具集
正如你在本报告中所看到的,动态地改变内核行为的能力非常有用的。传统上,如要观察应用程序表现,我们就得在程序中添加代码产生日志和跟踪信息。而 eBPF 则允许我们在对应用透明的前提下,在内核中收集应用程序特定的运行信息。我们还可在可观察性基础上创建 eBPF 安全工具,以便在内核中检测甚至防止恶意活动。我们还可以用 eBPF 创建强大的、高性能的网络功能,在内核内处理网络数据包,从而避免将数据包转换到用户空间的昂贵成本。
从内核的角度观察应用程序并非是全新的概念--它建立一些 Linux 早期功能之上,比如perf,Perf 也可以对应用透明的方式,在内核中收集程序行为和性能信息。但是这些工具定义了收集数据种类以及数据的格式。使用 eBPF,我们可拥有有更多的灵活性,通过完全自定义的程序,建立各式各样的定制化工具。
eBPF 可编程性带来了令人难以置信的强大,但它也很复杂。对我们大多数人来说,我们主要是使用别人创造的 eBPF 工具,而不是自己进行工具编写。有越来越多的项目和供应商在 eBPF 平台上创建了新一代的可用于观测、安全性、网络等工具。
我将在本报告后面将讨论这些更高级别的工具,但如果你熟悉 Linux 命令行,并且迫不及待地想运行 eBPF 程序,BCC 项目 会是一个很好的选择。 BCC 项目包括数量众多的跟踪工具集合;在这些工具中,我们很容易对 eBPF 工具可检测的广大范围进行了解,这包括文件操作、内存使用、CPU 统计,甚至观察系统中任何地方输入的 bash 命令。
在下一章,我们将介绍为何需要改变内核的行为,以及为什么 eBPF 与编写内核代码相比,具有更低的门槛。