Linux 内核:eBPF优势和eBPF潜力总结

嵌入式技术

1368人已加入

描述

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。  

Linux

图 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 可观察性工具。  

Linux

图 2. Linux bcc/BPF 跟踪工具  

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

Linux

图 3. eBPF 堆栈

  2 为什么是 eBPF?

云原生架构是基于 eBPF 应用程序的关键驱动因素之一,因为越来越多的内核子系统可以使用 eBPF 进行扩展。   如前所述,典型的用例是安全性、网络和可观察性。安全性和网络之间的交集导致了“网络安全”应用;安全性和可观察性之间的重叠产生了“实时威胁检测和响应”应用程序;网络和可观察性结合起来就是关于“网络可观察性”的应用;“智能应用程序沙箱”是安全性、网络和可观察性相交的结果,如图 4 所示。  

Linux

图 4. eBPF 高级用例  

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

Linux

图 5. eBPF 优势示例  

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

Linux

图 6. 在 Kubernetes

集群中使用 eBPF 的负载平衡示例   表 1 概述了 eBPF 的十大优势,以及eBPF该如何发展以支持许多其他用例。  

Linux

表 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 代理的数据经过处理,然后使用特定于相应数据源的转换规则转换为字节。如果用户使用的是基于使用的定价模型,则需要为超出每月免费数量的字节数付费。  

Linux

图 7. eBPF 监控、可观察性和安全工具的收费和计费模型示例   另一种可能性是根据资源收费,即部署的控制器和代理(守护程序集)的数量,如图 1 所示,以及支持类型(服务)。    

5 总结

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

  尽管存在一些挑战,比如eBPF 开发并不容易,节奏快且实现细节可能因内核版本而不同,并且没有简单的打包/部署解决方案。但eBPF技术正在内核领域引发一波重大创新浪潮,为云原生环境带来直接的好处,尤其是由于其动态可编程性、可靠性以及以最小的中断获得出色的工作负载可见性的能力。   可以检查数据包这一特性提供了极其高效的可观察性工具,这些工具可以映射到其他方面,例如 Kubernetes 元数据,并从提取的信息中获得深入的安全取证。   我们可以使用丢弃或修改网络策略数据包的能力,并使用 eBPF 进行加密以确保安全。此外,由于可以发送数据包并更改数据包的目的地,eBPF 允许创建强大的网络功能,例如负载平衡、路由和服务网格。

eBPF 支持下一代服务网格,不需要使用 sidecar 检测 pod ,并可以在不更改任何应用程序或配置的情况下实现高性能。   *本文系SDNLAB编译自CyberSecurity-MAGAZINE

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分