五分钟入门 eBPF

d4fd28b7214f677d9caa6e0945d8fb36.gif

91691710dc750ac32b6e6512713488d7.png

Gartner 估计,到 2025 年,超过 95% 的数字工作负载将部署在云原生平台上。与此同时,Kubernetes正在成为跨云编排的标准和云原生架构的支柱。在这一转变中,发挥重要作用的技术是eBPF(Berkeley Packet Filter的扩展版本)。

1

什么是eBPF?

操作系统分为用户空间和内核空间,内核是操作系统的核心,它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。

我们编写的应用程序通常在用户空间中运行,每当这些应用程序想要以任何方式与硬件交互时,无论是读取还是写入文件、发送或接收网络数据包、访问内存,都需要只有内核才能拥有的特权访问权限,用户空间的应用程序必须向内核发出请求。内核还负责调度应用程序,以确保多个进程同时运行。

eBPF 使应用程序能在操作系统的内核中运行,并在不更改内核源代码的情况下对内核进行检测。eBPF 程序在内核版本之间是可移植的,并且可以自动更新,从而避免了工作负载中断和节点重启。eBPF 程序可以在加载时进行验证,以防止内核崩溃或其他不稳定性因素。

eBPF 是一个抽象虚拟机 (VM),它有自己的指令集,可在 Linux 和 Windows 内核中运行。eBPF 可以在内核的沙箱执行用户定义的程序,这些沙箱程序由内核中的事件触发,接收指向内核或用户空间内存的指针。

eBPF 项目布局由三个关键组成(参见图 1):

  • eBPF 程序,在内核中运行并对事件做出反应。

  • 用户空间程序,将 eBPF 程序加载到内核并与之交互。

  • BPF Maps (hash maps, arrays, ring / perf buffer),它允许用户空间程序和内核中的 eBPF 程序之间的数据存储和信息共享。

在开发阶段,将eBPF程序字节码注入内核,详见图1。

cd4018816413804214442141dfcc2147.png

图 1. eBPF 项目布局

通常,eBPF 程序是用 C 或 Rust 编写的,并编译为目标文件。这是一个标准的可执行和可链接格式(ELF) 文件,可以使用readelf等工具进行分析。Linux 内核期望 eBPF 程序以字节码的形式加载。像 LLVM这样的编译器套件可以用来将伪 C 代码编译成 eBPF 字节码。

eBPF Maps使 eBPF 能够共享获取的信息并保存状态。因此,eBPF 程序可以利用 eBPF 映射来维护和检索各种格式的数据。eBPF程序和用户空间应用程序都可以通过系统调用访问eBPF映射。

在运行阶段,Go库使用 eBPF 系统调用将 eBPF 程序加载到内核中。然后,内核验证代码,JIT即时编译器编译 eBPF 程序并将其附加到所需的钩子(hook)上。当内核或应用程序通过某个hook点(系统调用、函数进入/退出、内核跟踪点、网络事件等)时,eBPF 程序让自定义代码在内核中运行。

eBPF 程序使用 BPF 映射实现了内核和用户空间之间的可见性。

如图 1 所示,当一个 eBPF 程序被加载到内核中时,它将由一个事件(图中的 TC ingress/egress 和 sockets)触发。一旦事件发生,附加的 eBPF 程序将被执行。

例如,可以使用一组在Linux内核的网络堆栈中支持的eBPF 钩子来运行eBPF程序。可以通过组合以下钩子来创建更高级别的网络结构:

  • Express Data Path (XDP):网络驱动程序是最早可以附加 XDP BPF 钩子的点。当收到一个数据包时,eBPF 程序就会被触发运行。

  • 流量控制入口/出口:与 XDP 一样,通过将eBPF程序与流量控制入口挂钩,将eBPF程序附加到网络接口上。与 XDP 的不同之处在于 eBPF 程序将在网络堆栈对数据包进行初始处理后运行。

  • 套接字操作:另一组钩子点是套接字操作钩子,它将 eBPF 程序附加到特定的 cgroup 并根据 TCP 事件触发它们。

  • 套接字发送/接收:套接字发送/接收钩子在 TCP 套接字执行的每个发送操作上触发并运行附加的 eBPF 程序。

还可以对内核函数使用Kprobes,对用户空间函数使用Uprobes来检测函数调用。可以使用Linux 安全模块(LSM) 钩子(内核 5.7 及更高版本)执行与安全相关的操作。

图 2 展示了一组全面的eBPF 可观察性工具。

f1c592d42c20c32c46a7d1c72d1e0ace.png

图 2. Linux bcc/BPF 跟踪工具

由于事件种类繁多,eBPF 程序可用于高效网络、跟踪和数据分析、可观察性和安全工具,例如,用于威胁防御和入侵检测。参见图 3 中所示的 eBPF 堆栈。

1ea446b67d7ce3822a0989a47c2a84c1.png

图 3. eBPF 堆栈

2

为什么是 eBPF?

云原生架构是基于 eBPF 应用程序的关键驱动因素之一,因为越来越多的内核子系统可以使用 eBPF 进行扩展。

如前所述,典型的用例是安全性、网络和可观察性。安全性和网络之间的交集导致了“网络安全”应用;安全性和可观察性之间的重叠产生了“实时威胁检测和响应”应用程序;网络和可观察性结合起来就是关于“网络可观察性”的应用;“智能应用程序沙箱”是安全性、网络和可观察性相交的结果,如图 4 所示。

6971b25c567a2624f859f9a58202f1cb.png

图 4. eBPF 高级用例

图 5 整合了 eBPF 为云原生环境带来的一些价值。

eBPF 展示了惊人的可编程性,eBPF 验证器确保加载的程序是安全的,并保证它们不会使内核崩溃。eBPF 还提供了出色的策略可见性和执行控制,并允许操作员观察在用户空间中运行的所有程序,这是在同一空间中运行的应用程序几乎无法实现的。

3784e7975d0e0eb65a3c2e4d25e66af9.png

图 5. eBPF 优势示例

此外,用 eBPF 映射替换 iptables 规则允许将数据直接从入站套接字传输到出站套接字,从而实现超快速的服务负载平衡。图 6 展示了如何使用 eBPF 在 Kubernetes 集群中的四个复制 pod 之间实现负载平衡。

47aa5804b7d41b2f8d4a447d68341bda.png

图 6. 在 Kubernetes 集群中使用 eBPF 的负载平衡示例

表 1 概述了 eBPF 的十大优势,以及eBPF该如何发展以支持许多其他用例。

d70608429ddf0f0d541f6d9065c6d40b.png

表 1. eBPF 优势和 eBPF 潜力总结

3

为什么现在使用 eBPF?

eBPF 的市场潜力体现在 2022 年的几项重大公司举措中,包括以下例子:

  • New Relic 收购了下一代机器智能和可观察性Pixie Labs。

  • Datadog 收购了 Seekret,能够利用 Seekret 的 eBPF 专业知识来解锁新功能。

Seekret 使用强大的 eBPF 技术来自动发现和可视化 API 资产、互连和依赖关系,使开发人员和产品负责人能够了解复杂、动态环境中的 API 行为和使用模式。

业界对 eBPF 理解的增加,也间接创造了更多的买家。

eBPF在技术上已经成熟。

事实上,eBPF 已经变得更加通用,特别是 Windows 的 eBPF。此外,还出现了一系列 eBPF 工具链,例如 GCC 和 Aya,一个可以完全用 Rust 编写 eBPF 程序的库。 

4

如何将 eBPF 商业化?

我们可以考虑这样一个市场,其中客户可以通过订阅访问软件,并使用与特定产品(例如网络可观察性、运行时安全性等)和数据源计划相关联的基于产品的定价和计费模型,这取决于服务和支持类型,如图7所示。

用户订阅计划考虑了用户帐户的数量和所需支持的类型。

数据源计划与基于使用的定价模型相关联。报告给 eBPF 代理的数据经过处理,然后使用特定于相应数据源的转换规则转换为字节。如果用户使用的是基于使用的定价模型,则需要为超出每月免费数量的字节数付费。

db90d83459bc25681a042dbaa06a76c9.png

图 7. eBPF 监控、可观察性和安全工具的收费和计费模型示例

另一种可能性是根据资源收费,即部署的控制器和代理(守护程序集)的数量,如图 1 所示,以及支持类型(服务)。  

5

总结

eBPF 之于内核就像 JavaScript 之于 Web 浏览器。

尽管存在一些挑战,比如eBPF 开发并不容易,节奏快且实现细节可能因内核版本而不同,并且没有简单的打包/部署解决方案。但eBPF技术正在内核领域引发一波重大创新浪潮,为云原生环境带来直接的好处,尤其是由于其动态可编程性、可靠性以及以最小的中断获得出色的工作负载可见性的能力。

可以检查数据包这一特性提供了极其高效的可观察性工具,这些工具可以映射到其他方面,例如 Kubernetes 元数据,并从提取的信息中获得深入的安全取证。

我们可以使用丢弃或修改网络策略数据包的能力,并使用 eBPF 进行加密以确保安全。此外,由于可以发送数据包并更改数据包的目的地,eBPF 允许创建强大的网络功能,例如负载平衡、路由和服务网格。

eBPF 支持下一代服务网格,不需要使用 sidecar 检测 pod ,并可以在不更改任何应用程序或配置的情况下实现高性能。

*本文系SDNLAB编译自CyberSecurity-MAGAZINE

本文转载自:「云原生生态圈」,原文:https://url.hi-linux.com/MbL5P,版权归原作者所有。

10T 技术资源大放送!包括但不限于:Linux、虚拟化、容器、云计算、网络、Python、Go 等。在 开源Linux 公众号内回复 10T,即可免费获取!

Linux学习指南
有收获,点个在看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值