当前位置: 首页 > 科技观察

eBPF对Kubernetes可观察性的重要性

时间:2023-03-13 12:41:49 科技观察

在Linux内核中工作是实现安全、网络和可观察性功能的理想选择。然而,这并非没有挑战。无论是修改内核源代码还是添加模块,开发人员传统上都发现自己在难以调试的复杂基础架构和抽象层上苦苦挣扎。扩展BPF[2](eBPF)解决了这两个问题。ExtendedBerkeleyPacketFilter(eBPF)是一种内核技术(自Linux4.x起),它允许程序在不更改内核源代码或添加额外模块的情况下运行。您可以将其视为Linux内核中的轻量级沙盒虚拟机(VM),程序员可以在其中运行BPF字节码以利用特定的内核资源。使用eBPF无需更改内核源代码,并简化了软件利用现有层的能力。因此,它是一项强大的技术,有可能从根本上改变网络、可观察性和安全性等服务的交付方式。下面详细介绍了它是什么、它是如何工作的以及何时考虑实施它。eBPF的工作原理eBPF程序是事件驱动的并附加到代码路径。代码路径包含特定的触发器(称为挂钩),这些触发器在传递时执行附加的eBPF程序。挂钩的一些示例包括网络事件、系统调用、函数条目和内核跟踪点。触发时,代码首先被编译为BPF字节码。然后在运行之前验证字节码以确保它不会创建循环。此步骤可防止程序意外或故意损坏Linux内核。程序在钩子上被触发后,它会进行帮助程序调用。这些helper调用是为eBPF配备许多访问内存功能的函数。Helper调用需要由内核预先定义,但存在的函数列表在不断增长[3]。eBPF最初是作为一种在过滤网络数据包时提高可观察性和安全性的方法而开发的。然而,随着时间的推移,它成为一种使用户提供的代码实现更安全、更方便和更高效的方法。eBPF的优势eBPF通常用于跟踪[4]用户空间进程,其优势在这里显而易见。这是确保:速度和性能的安全有用的方法。eBPF可以将数据包处理从内核空间卸载到用户空间。同样,eBPF是一种即时(JIT)编译器。编译字节码时,将调用eBPF,而不是为每个方法调用字节码的新解释。低侵入性。当用作调试器时,eBPF不需要停止程序来观察其状态。安全。程序被有效地沙盒化,这意味着内核源代码保持受保护和不变。验证步骤确保资源不会被运行无限循环的程序阻塞。方便的。创建钩子内核函数的代码比构建和维护内核模块的工作量少。统一跟踪。eBPF为您提供了一个单一、强大且可访问的框架来跟踪流程。这增加了可见性和安全性。可编程性。使用eBPF有助于在不添加额外层的情况下增加环境的功能丰富度。此外,由于代码直接在内核中运行,因此数据可以存储在eBPF事件之间,而不是像其他跟踪器那样被转储。表达能力。eBPF具有表现力,能够执行通常只有在高级语言中才能找到的功能。eBPF的最佳实践由于eBPF是一项新技术,因此许多事情仍未探索。随着技术的发展,围绕eBPF的最佳实践仍在不断发展。虽然不存在确定的最佳实践集,但您可以采取一些措施来确保有效、高效的计划。如果您正在为您的生态系统使用eBPF,我们建议您:使用LLVMClang[5]将C编译为字节码。当eBPF刚出现时,程序需要手工编写和组装。然后开发人员使用内核的汇编程序生成字节码。幸运的是,这不再是必需的。Clang为C语言提供了前端基础设施和工具。编写BPF程序时使用BCC工具包。BPF编译器集合[6](BCC)是一个工具包,可帮助您创建高效的内核跟踪和操作程序。它特别适合与性能分析和网络流量控制相关的任务。eBPF的缺点尽管eBPF功能强大,但它并不是适用于每个项目或生态系统的灵丹妙药。eBPF确实有一些明显的缺点,在某些情况下使用起来会令人沮丧。一些开发人员可能会发现eBPF不适合,原因如下:它仅限于Linux和最近的内核。eBPF是在Linux内核中开发的,完全面向Linux内核。这使得它比其他追踪器更难携带。此外,您需要一个相当新的内核。如果您运行的是低于v4.13的版本,您将无法使用它。沙盒程序是有限的。eBPF通过限制程序可以访问的资源来提高安全性。但是,功能也可能通过限制程序可以访问的操作系统部分而受到限制。eBPF的常见用途eBPF在云原生应用程序中迅速获得关注[7]。因此,eBPF最常用于两种情况:需要使用内核跟踪的可观察性。在这种情况下,eBPF更快更准确。这里不涉及上下文切换[8],并且eBPF程序是基于事件的,所以没有特定的触发器什么都不会运行——你不会错过任何事件。传统的安全监控不起作用。eBPF广泛用于分布式和基于容器的环境,包括Kubernetes[9]。在这些环境中,eBPF可以缩小可见性差距,因为它提供了对HTTP流量的可见性。您可能还会发现eBPF部署用于其他安全措施,包括:防火墙设备驱动程序网络性能监控NewRelic和eBPFPixie[10](之前被NewRelic收购)是一个开源的kubernetes-native-in-cluster可观察性平台,提供即时无需手动检测即可了解Kubernetes工作负载。eBPF提供了Pixie平台背后的大部分魔法。如前所述,eBPF允许在触发事件时运行受限代码。此事件可以是内核空间(kprobes)或用户空间(uprobes)中的函数调用。Pixie同时使用uprobes和kprobes来支持跨服务和应用程序的可观察性。Pixie利用eBPF自动获取遥测数据,其边缘机制将此数据与Kubernetes元数据连接起来,在保持数据局部性的同时提供可见性。这种可见性补充了NewRelic强大的Kubernetes可观察性解决方案。从5月下旬开始,您将能够将Pixie生成的遥测数据发送到NewRelicOne,以实现可扩展的保留、强大的可视化、高级关联和智能警报。eBPF是EffectiveObservabilityeBPF是一种新技术,可以提高Linux内核中的可观察性、网络和安全性。它消除了更改内核源代码或添加模块的需要,因此您可以创建更丰富的基础架构来支持您的系统,而不会使其过于复杂。总结我们了解了什么是eBPF,它是如何工作的,以及为什么它在分布式环境中如此有用。通过从内核级别进行监控,解决了与云中的可观察性相关的许多挑战。您可以在数据中享受更深入的可见性、更多上下文和更准确的信息。