本文是eBPF的介绍。

eBPF是一项革命性的技术,起源于Linux内核,可以在操作系统内核中运行沙盒程序。它被用来安全和有效地拓展内核功能,而无需修改内核源码或加载内核模块
长久以来,由于内核本身具有监控和控制整个计算机对的特权,因此操作系统层面一直是实现可观测性、安全性、网络治理功能的理想场所。但是由于对内核的稳定性和安全性的要求,很难对其进行改进,因此与操作系统其它部分的功能相比,内核的创新和演进一直是比较慢的。
eBPF的出现则是改变了这一切。通过允许在操作系统内运行沙盒程序,应用开发人员可以运行eBPF程序,在运行时向操作系统添加额外的功能。操作系统则会保障其安全和执行效率,就像在即时编译(JIT)编译器和验证引擎的帮助下进行本地编译一样。这项技术的出现带来了一系列基于eBPF的项目,包括下一代网络、可观测性、安全功能在内的多种领域。
今天,eBPF被广泛用于各个领域:在现代数据中心和云原生环境中提供高性能的网络和负载均衡、以资源低开销提取细粒度的安全可观测数据、帮助开发人员跟踪应用程序、为性能故障排查提供支撑等。eBPF释放的创新才刚刚开始。

安全

建立在看到和理解所有系统调用的基础上,并与所有网络操作的数据包和套接字级别的视图相结合,可以为系统安全提供革命性的新方法。虽然系统调用过滤、网络级过滤和进程上下文跟踪等方面通常由完全独立的系统处理,但eBPF允许将所有方面的可见性和控制结合起来,以更好的控制水平创建运行于更多上下文的安全系统。

追踪和分析

将eBPF程序附加到跟踪点以及内核和用户应用程序探测点的能力允许对应用程序和系统本身的运行时行为有前所未有的可见性。通过给应用程序和系统方面的内省能力,这两种观点可以结合起来,允许强大和独特的洞察力来解决系统的性能问题。先进的统计数据结构允许以有效的方式提取有意义的可见性数据,而不需要像类似的系统那样输出大量的采样数据。

网络

可编程性和效率的结合使eBPF成为网络解决方案中所有包处理要求的自然选择。eBPF的可编程性使其能够添加额外的协议分析器,并轻松地编程任何转发逻辑,以满足不断变化的需求,而无需离开Linux内核的数据包处理环境。JIT编译器提供的效率使执行性能接近于原生编译的内核代码。

可观测性与监控

eBPF不依赖于操作系统暴露的静态计数器和仪表,而是实现了自定义指标的收集和内核内聚合,并基于广泛的可能来源生成可见性事件。这扩展了可以实现的可见性深度,并通过只收集所需的可见性数据和在事件源头生成直方图和类似的数据结构,而不是依赖样本的输出,大大降低了整个系统的开销。

基于eBPF的应用

bcc

BCC是一个建立在eBPF基础上的高效内核跟踪和操作程序的工具包,它包括几个有用的命令行工具和例子。BCC简化了用C语言编写eBPF程序的过程,包括一个围绕LLVM的封装器,以及Python和Lua的前端程序。它还提供了一个高层次的库,可以直接集成到应用程序中。

bpftrace

bpftrace是一个用于Linux eBPF的高级跟踪语言。bpftrace使用LLVM作为后端,将脚本编译成eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有的Linux追踪能力和附件点进行交互的库。

cilium

Cilium是一个开源项目,提供由eBPF驱动的网络、安全和可观察性。它是专门为Kubernetes世界带来eBPF的优势而设计的,以解决容器工作负载的新的可扩展性、安全性和可视性要求。

Falco

Falco是一个行为活动监视器,旨在检测应用程序中的异常活动。Falco在eBPF的帮助下对Linux内核层的系统进行审计。它用其他输入流(如容器运行时指标和Kubernetes指标)来丰富收集的数据,并允许持续监控和检测容器、应用程序、主机和网络活动。

Katran

Katran是一个C++库和eBPF程序,用于建立一个高性能的第四层负载平衡转发平面。Katran利用Linux内核中的XDP基础设施,为快速数据包处理提供内核内设施。它的性能与网卡接收队列的数量呈线性扩展,它使用RSS友好封装转发到L7负载均衡器。

eBPF库

eBPF被设计成一个纯Go库,提供加载、编译和调试eBPF程序的工具。它具有最小的外部依赖性,并打算在长期运行的进程中使用。
libbpfgo是一个围绕libbpf的Go封装器。它支持BPF CO-RE,其目标是成为libbpf APIs的完整实现。它使用 CGo 来调用 libbpf 的链接版本。