作者:Hannah Troisi,New Relic高级开发关系工程师,Pixie Labs创始工程师
eBPF 在过去几年里一直稳步增长。这个想法的基础表面上听起来有点深奥——在 Linux 内核中运行用户定义的程序。然而,eBPF 引起了巨大的轰动,因为它在可观测性、网络和安全性等领域有着重要的应用。
特别是,eBPF 在云原生社区中产生了巨大的影响。这是因为转向 Kubernetes 和微服务带来了部署、监控和保护应用的新挑战,而 eBPF 可以帮助解决这些挑战。
伴随着大量的讨论和兴奋,很难理解像 eBPF 这样的技术的采用和应用。在这篇博文中,我们将快速浏览几个 CNCF 开源项目,它们应用 eBPF 来解决重要的问题。
eBPF[1]是一项革命性的技术,它允许你在 Linux 内核中运行轻量级沙盒程序。
操作系统是实现可观测性、网络和安全功能的理想位置,因为它可以监督整个系统。然而,在 eBPF 出现之前,为内核编写代码充满了稳定性和兼容性问题:无法保证你的代码不会使内核崩溃,并且更改内核版本和架构很容易破坏代码。
eBPF 正在改变游戏规则,因为它提供了一种在内核中运行代码的安全有效的方法。如下面的概述所示,eBPF 允许内核运行 BPF 字节码。虽然所使用的前端语言可以有所不同,但它通常是 C 的一个受限子集。通常,C 代码首先使用 Clang 编译成 BPF 字节码,然后验证字节码以确保它可以安全执行。这些严格的验证保证了机器码不会有意或无意地损害 Linux 内核,并且 BPF 探测器每次被触发时都会执行有限数量的指令。
eBPF 可观测性应用示例(来自brendangregg.com[2])。
CNCF(Cloud Native Computing Foundation,云原生计算基金会)旨在促进云原生生态系统的发展。其中一种方法是为开源云原生项目提供一个供应商中立的家。如果你使用过 Kubernetes 或者 Prometheus,你就已经用过 CNCF 的项目了。CNCF 汇集了一些世界顶级的开发人员,通过查看其项目中使用的新兴技术,你可以对云计算的未来方向有所了解。
你可以在这里[3]查看 CNCF 的所有开源项目。
让我们看看三个不同的 CNCF 项目是如何应用 eBPF 来解决云原生领域中的问题。
保护软件应用程序已经是一项艰巨的任务,但是当你将应用程序分解成许多小型、可扩展和分布式的微服务时,它会变得更加困难。
Falco[4]是一个开源的运行时安全工具。运行时安全性是保护 Kubernetes 集群时的最后一道防线,旨在提醒你注意那些偷偷越过其他防御保护的威胁。
Falco 监控系统调用以检查各种异常行为[5],例如:
如下图所示,Falco 可以使用 eBPF 驱动程序安全高效地生成系统调用信息流。这些系统调用由用户空间程序解析,该程序对照配置中定义的规则进行检查,以确定是否发送警报。
Falco 工作原理(来自Sysdig[6])。
Falco 支持多个驱动程序[7],包括一个使用内核模块的驱动程序和一个使用 eBPF 探针的驱动程序。与原来的内核模块相比,新的 eBPF 驱动程序给认为更安全,因为它不会使内核崩溃或死机。eBPF 驱动程序也能够在不能加载内核模块的环境中运行(比如 GKE)。
要开始使用 Falco,请查看入门指南[8]。
Kubernetes 更容易将应用逻辑从基础设施中分离出来,并扩展独立的微服务。然而,这给观测系统行为带来了新的复杂性。
Pixie[9]是用于 Kubernetes 应用程序的开源可观测性工具。可观测性是一个相当模糊的术语,但在 Pixie 的情况下,这包括全应用程序请求[10]、应用程序概况[11]以及网络[12]和基础设施[13]健康指标。
Pixie 平台提供的所有遥测数据都是使用 eBPF 自动捕获[14]的。通过使用 eBPF,Pixie 不再需要传统的手动工具。让我们看看这对于应用程序请求跟踪是如何工作的。
使用 eBPF 的 Pixie 协议跟踪(来自docs.px.dev[15])。
当 Pixie 部署到集群中的节点时,它会部署 eBPF 内核探测器,这些探测器给设置为触发用于网络的 Linux 系统调用。当你的应用程序进行任何与网络相关的系统调用时——比如 send()和 recv()——Pixie 的 eBPF 探测器会监听数据并将其发送到 Pixie 的边缘模块。边缘模块根据检测到的协议解析数据,并将数据存储在节点本地的表中。然后可以使用 Pixie API、CLI 或基于 web 的 UI 来查询和可视化这些数据表。
有加密流量吗?eBPF 探针也可以用来跟踪 TLS 连接[16]!
要开始使用 Pixie,请查看安装指南[17]。
Kubernetes 可以是高度动态的,当应用程序扩展以适应负载变化或滚动更新时,大量容器在几秒钟内被创建和销毁。对于大型集群来说,Kubernetes 的这种短暂特性给使用 IP 地址和端口的传统网络安全方法带来了压力。
Cilium[18]是一个开源的 Kubernetes 容器网络接口(CNI)插件,用于提供和透明地保护应用程序工作负载之间的网络连接和负载平衡。
Cilium 还使用 eBPF 在 Linux 系统调用级别观测流量并与之交互。eBPF 的使用允许 Cilium 以使用服务/pod/容器身份的方式透明地插入和实施安全可见性。通过这样做,Cilium 解决了前面提到的网络安全问题,它将安全与 IP 地址和端口分离[19],而是使用服务/pod/容器进行身份验证。因为 Cilium 具有对应用层的可见性,所以它可以通过在不同层应用安全策略来提供更强的 API 安全性。
eBPF 是 Cilium 的基础。(来自cilium.io[20])。
Hubble[21]是 Cilium 的网络可观测性的解决方案。Hubble 提供服务映射[22]、网络[23]健康和应用程序请求[24]监控。Hubble 依靠 Cilium 收集数据。
要开始使用 Cilium 和 Hubble,请查看入门指南[25]。
eBPF 是一项创新技术,它在可观测性、网络和安全性等领域带来了效率改进和新功能。我们介绍了目前使用 eBPF 的三个 CNCF 项目,但是,我们预期在未来看到更多利用 eBPF 的项目。
有问题?需要帮助吗?可以在Slack[26]或Twitter[27]上找到我们。
[1]
eBPF: https://ebpf.io/what-is-ebpf
[2]
brendangregg.com: https://www.brendangregg.com/ebpf.html#ebpf
[3]
CNCF的所有开源项目: https://landscape.cncf.io/?project=hosted
[4]
Falco: https://falco.org/
[5]
各种异常行为: https://falco.org/docs/#what-does-falco-check-for
[6]
Sysdig: https://sysdig.com/blog/intro-runtime-security-falco/#how-dow-falco-work
[7]
Falco 支持多个驱动程序: https://falco.org/blog/choosing-a-driver
[8]
入门指南: https://falco.org/docs/getting-started/
[9]
Pixie: https://px.dev/
[10]
全应用程序请求: https://docs.px.dev/tutorials/pixie-101/request-tracing/
[11]
应用程序概况: https://docs.px.dev/tutorials/pixie-101/profiler/
[12]
网络: https://docs.px.dev/tutorials/pixie-101/network-monitoring/
[13]
基础设施: https://docs.px.dev/tutorials/pixie-101/infra-health/
[14]
使用 eBPF 自动捕获: https://docs.px.dev/about-pixie/pixie-ebpf/
[15]
docs.px.dev: https://docs.px.dev/about-pixie/pixie-ebpf/
[16]
跟踪 TLS 连接: https://docs.px.dev/about-pixie/pixie-ebpf/#protocol-tracing-tracing-tlsssl-connections
[17]
安装指南: https://docs.px.dev/installing-pixie/install-guides/
[18]
Cilium: https://cilium.io/
[19]
分离: https://docs.cilium.io/en/stable/intro/#why-cilium-hubble
[20]
cilium.io: https://cilium.io/get-started
[21]
Hubble: https://github.com/cilium/hubble
[22]
服务映射: https://github.com/cilium/hubble#service-dependency-graph
[23]
网络: https://github.com/cilium/hubble#networking-behavior
[24]
应用程序请求: https://github.com/cilium/hubble#http-requestresponse-rate--latency
[25]
入门指南: https://docs.cilium.io/en/stable/gettingstarted/
[26]
Slack: https://slackin.px.dev/
[27]
Twitter: https://twitter.com/pixie_run
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。