关于运维:使用-eBPF-增强监控和可观测性

55次阅读

共计 2875 个字符,预计需要花费 8 分钟才能阅读完成。

【文章起源】https://securityboulevard.com…

将代码注入 Linux 内核的能力开拓了一个全新的可能性世界。您能够轻松改良很多货色——安全性、网络、可观测性等等。BPF(伯克利包过滤器)使您可能编写能够从外部利用 Linux 内核性能的程序。BPF 传统上用于在将原始网络数据包发送到用户空间之前对其进行过滤,以进步零碎的整体安全性。

eBPF 是 BPF 的扩大版本,具备一系列平安实现,以避免 BPF 程序毁坏内核。在本指南中,您将理解如何应用 eBPF 在基于 Kubernetes 的基础架构中实现加强的可观测性。

什么是 eBPF?

eBPF 代表扩大 BPF。顾名思义,它是建设在 Linux 规范 BPF 可观测性零碎之上的扩大版本。eBPF 程序通过触发器(或挂钩)附加到 Linux 代码门路。这里的次要指标之一是不对内核源代码进行任何更改以缩小对其造成任何侵害的机会。

您能够将其视为 Linux 内核中的虚拟机或沙箱,使您可能拜访特定的内核资源,同时限度本人对内核自身进行更改。每当逾越用户空间边界时,eBPF 也会特地留神安全性和稳健性。

eBPF 能够通过多种形式强制执行平安结构。这里有一些例子:

如果内核内验证程序检测到有效的指针勾销援用或达到最大堆栈大小限度,它将不会加载 eBPF 程序。

不容许应用循环,除非具备预约义的动态下限

在生成的字节码中只容许调用一小部分 eBPF 辅助函数。

有了所有这些限度,人们可能会发现这些程序受到限制。然而,保障不弄乱内核通常胜过这些限度。

eBPF 如何用于帮忙监控?

eBPF 程序间接在 Linux 内核中运行。这使他们能够轻松地跟踪操作系统子系统的简直任何方面,包含 CPU 调度程序、网络、零碎调用等。您能够通过 eBPF 程序查看和跟踪操作系统中产生的简直所有事件。这使其成为在基于 Linux 的部署中设置全局和积重难返的监控的可行竞争者。

此外,eBPF 程序不依赖于任何内部模块或依赖项。因而,此类程序增加到 Linux 程序的规范工作负载的性能开销能够忽略不计。在其上运行监控零碎简直不会给您部署的工作负载减少额定的负载。

另一个须要思考的方面是容器优化操作系统的衰亡。此类操作系统,包含 Google Cloud Platform 的 Container-Optimized OS,为 K8s 应用程序提供了优化的运行环境;然而,它们的设计大多是不可变的,以缩小代码占用并加强扩展性。它们也不容许应用内核模块。eBPF 在这种状况下依然无效,因为它是 Linux 原生的,并且提供了一种齐全不依赖内核模块来提取数据的办法。

应用 eBPF 加强监控的 4 个益处

既然您理解了它的工作原理并在 Kubernetes 监控中施展着不可或缺的作用,那么这里有一些办法能够加强您的监控工作。

长处:低侵入性

在与内核及其资源交互时,它专一于极简主义。它旨在尽可能减少烦扰。以下是它这样做的一些办法:

它不会扭转任何内核源代码,从而缩小了 eBPF 程序与内核之间的耦合。

当将其用作调试器时,它不须要进行正在运行的程序来观测其状态。

只容许一小部分内核辅助函数,进一步缩小两者之间的依赖 / 耦合,并有助于建设一个沙盒环境来运行您的程序。

长处:平安

上述措施还有助于加强内核和程序的安全性。

因为 eBPF 程序基本不容许批改内核,因而能够轻松保留代码级更改的拜访治理规定。否则,这将应用内核模块实现,这会带来过多的平安问题。

此外,eBPF 程序在转换为字节码后会通过验证阶段。此步骤检查程序中是否存在资源透露,例如有限循环。此验证可避免程序意外适度应用零碎上的可用资源。

长处:不便

它为您的监控工作提供了更大的便当。与任何其余 Linux 监控代替计划相比,您能够取得更精密的细节和内核上下文。您还能够自在导出监控数据并将其摄取到第三方可视化工具中。

除此之外,如果你从高层次的角度看一下 BPF 编程的概念,与保护独立的内核模块相比,增加挂钩到内核函数的代码片段更有意义,也更容易。

长处:可编程性

与规范检测技术相比,它为您提供了在转储数据之前对记录的数据运行操作的空间。您能够抉择在 eBPF 事件之间存储数据,并依据须要选择性地存储数据。此性能在不增加额定依赖项的状况下进步了监控零碎的整体实用性。

4 个应用 eBPF 的特定用例

以下是四个特定用例,在这些用例中,它是取得深度可见性的最佳抉择。

Kubernetes 可观测性

Kubernetes 是展现 eBPF 可观测性能力的最佳场合之一。家喻户晓,Kubernetes 通过减少或缩小 pod 的数量来高低扩大工作负载。豆荚实质上是随机的,没有保障的生命周期。因而,在每个 pod 或容器中设置检测代理可能会在工作负载中引入性能问题,并且因为 pod 将随机创立和销毁,因而成果不佳。

应用它,您能够在操作系统级别设置监控营垒并监控 Kubernetes 设置中产生的所有事件。

动静网络性能监控

咱们曾经屡次提到 eBPF 如何非常容易地监控和跟踪 Linux 子系统的外部方面,例如 CPU 使用率、网络性能等。您能够利用 eBPF 的这一个性来创立网络性能监控设置。然而,这样的设置将是动态的,因为用于监控网络的规定是预约义的常量。您依然能够手动更改它们,但这是一个漫长的过程。

为了让这个零碎真正动态化,你能够引入 Cilium,一个帮忙你在 eBPF 中进行规定治理的开源我的项目。Cilium 能够帮忙您逐包剖析网络流量应用状况,并主动调整 eBPF 规定以适应传入的工作负载需要。您能够利用它来创立真正动静的网络性能监控设置。

内核跟踪

重申 eBPF 的工作原理——它容许您在 Linux 内核中运行自定义代码。因为零碎中产生的所有流动都在内核中实现,因而从一个中央跟踪和跟踪所有内容变得很容易。您还能够设置要依据零碎事件执行的 eBPF 程序。这使您可能跟踪围绕此类事件产生的所有。

这也是实现内核跟踪的最平安办法之一,因为所有 eBPF 程序都通过验证阶段,在该阶段查看它们是否存在有限循环和其余谬误可能性。因而,您能够平安地依赖它来满足您的内核跟踪要求。

Pod 级网络监控

eBPF 最风行的用处之一是在基于 Kubernetes 的零碎中监控 Pod 四周的网络。因为基于 Kubernetes 的设置能够运行各种应用程序,并且每个应用程序都有本人独特的根底映像,因而应用传统办法对其进行检测十分具备挑战性。根本操作系统、云服务器或编码标准的每个变体都可能须要不同的监控代理。

通过 eBPF 施行网络监控能够帮忙您解决这些问题。此外,您能够在 Linux cgroup 级别执行套接字过滤。eBPF 程序将帮忙您取得粒度信息,否则这些信息只能在 Linux 的 /sys 目录中拜访。因为您能够通过 eBPF 拜访内核,因而您能够从内核中接管到更具体的信息以及上下文。

最初的想法

eBPF 是对传统 BPF 机制的一个很好的补充。它为您提供了额定的平安劣势,同时实现了传统 BPF 程序的深度可观测性劣势。

在本指南中,咱们探讨了如何应用 eBPF 来加强 Kubernetes 设置中的可观测性。咱们探讨了应用 eBPF 绝对于传统 BPF 的一些益处,并提到了一些用例,您能够在其中利用它来获得最佳后果。

正文完
 0