Skip to content

23-年度总结:eBPF的2023之旅 ​

你好,我是倪朋飞。

不知不觉,2024 年已经悄然而至,为过去的 2023 年划上了句号。每到年底,我都喜欢回顾一下过去一年的旅程,看看发生了哪些事情、有什么收获和遗憾,并期待着未来。对于 eBPF 的学习和应用也是如此,在本讲中,我将带你回顾一下 eBPF 在 2023 年所经历的旅程,探寻其中发生的事情、取得的成果以及存在的遗憾,并展望未来值得期待之处。

eBPF 内核的新进展 ​

作为 Linux 内核的一部分,让我们先来看看 eBPF 在2023年中有哪些新变化。

Linux 内核在 2023 年主要发布了 6.2-6.6 这几个版本,每个版本都为 eBPF 引入了大量的新特性。具体来说,每个版本引入的主要特性包括:

  • Linux 6.2 为 eBPF 添加了自定义对象、可睡眠程序以及把 struct task_struct 和 struct cgroup 对象用作内核指针(kptrs)等,并为 bpf prog load|loadall 命令支持了自动挂载 eBPF 程序的功能,大大简化了 eBPF 程序的加载过程。
  • Linux 6.3 为 eBPF 添加了红黑树数据结构以及 HID 设备的支持等,并把 kprobe 支持的参数数量扩展到了 8 个。
  • Linux 6.4 为 eBPF 添加了通用迭代器、新的 netfilter 程序类型以及 kfunc 64 位指针等,并为 kptrs 扩展了 RCU、共享所有权、更多的 BPF 映射支持等多种功能特性。
  • Linux 6.5 为 eBPF 添加了套接字销毁、eBPF 子程序和回调精度传播以及加载 XDP 程序时指定网络接口名字等,并新增了一系列方便易用的动态指针(dynptr)帮助函数。
  • Linux 6.6 为 eBPF 添加了 uprobe 多挂载,通过文件描述符将 BPF 程序挂载到 TC 程序(TC Extension,简称TCX)等,并允许用户为 TC bpf_sk_assign 设置 SO_REUSEPORT 选项。

关于这些版本详细的发布文档这儿不再展开,如果你有兴趣的话,可以点击这里的链接查看每个版本详细的发布文档。

伴随着这些内核版本的发布,新引入的功能特性也都集成到了 libbpf 和 bpftool 中。你可以访问它们的 GitHub 发布网站,查看最新的发布列表。

从以上最新版本的发布情况来看,eBPF 在内核中仍然是最活跃的模块之一,并且其功能特性正在快速发展。此外,在开源社区和商业公司的推动下,eBPF 的发展也在不断进行,进一步完善了 eBPF 生态系统并带来了更多应用实践。接下来,我们再来一起看看开源社区和商业公司为 eBPF 生态系统带来的最新进展。

eBPF 生态的新进展 ​

如果说 2022 年的 eBPF 生态还处在飞跃成长期,那 2023 年的 eBPF 生态可以说是遍地开花了。在 2022 年的时候,很多公司和开源社区还在探索 eBPF 的能力,并尝试把 eBPF 应用到自己的产品中。而到了 2023 年,eBPF 已经成为了很多公司和开源社区的核心技术,基本上所有知名的网络、观测、安全等领域的产品和项目都有 eBPF 的身影。

在这些产品和项目中,毫无疑问的是 Cilium 项目依然是最引人瞩目的一个。它不仅在 2023 年继续保持了高速的发展,还在 2023 年 10 月份正式毕业,成为 CNCF 基金会的最新明星项目。这标志着 Cilium 从最初的 CNI 网络插件正式演变为完整的网络、观测和安全解决方案。2023 年 12 月思科还宣布将收购 Cilium 背后的公司 Isovalent,代表已经有七年历史的 Cilium 将伴随思科进入新的发展阶段。

Cilium 项目的成功,不仅是 Cilium 项目本身的成就,也是 eBPF 生态发展的一个重要里程碑。伴随 Cilium 毕业发布的 eBPF 纪录片详细讲述了 eBPF 的起源、挑战以及发展过程中的有趣旅程,并特别提到 Cilium 项目在其中所发挥的重要作用。如果你还没有看过这部纪录片,我强烈建议你花一点时间来观看一下,相信你会有很多收获。

除了 Cilium 以外,开源社区还有很多的开源项目都在 2023 年取得了重大的进展,仅在 ebpf.io 上列出的开源应用就已经超过了 40 个。其中比较有代表性的几个包括:

  • 我们之前介绍过的 Tetragon 项目已经发布了 1.0 稳定版,在持续改进性能和开销的同时,还引入了默认可观察性策略库,覆盖了广泛的常见安全用例,使用门槛大大降低。
  • 最流行的监控面板项目 Grafana 发布了 Beyla 项目,支持无侵入地捕获 HTTP、HTTPS 和 gRPC 服务的关键指标(特别是 Rate、Errors、Duration 等应用程序指标),并支持以 OpenTelemetry 和 Prometheus 格式导出。
  • 最流行的观测项目 OpenTelemetry 项目也不甘示弱,发布了 OpenTelemetry Go 自动观测、OpenTelemetry eBPF 等多个开源项目,借助 eBPF 实现 Go 应用程序和内核网络的自动观测。
  • eBPF for Windows 项目也一口气发布了将近 10 个版本,极大地完善了 Windows 上的 eBPF 支持,为 Windows 上的 eBPF 应用提供了更多的可能性。

事实上,上一节提到的 Linux 内核版本中的很多新特性都是由这些开源项目驱动的,它们不仅在 Linux 内核中实现了新特性,还在自己的项目中实现了对应的功能,为用户提供了更好的体验。这些开源项目的成功,也在不停地促进着 eBPF 的稳步发展。

作为新冠疫情终结之后的后疫情时代开启之年,eBPF 也是很多技术会议回归线下之后的最热门话题之一。比如,在 2023 年的各个 KubeCon 会议中,eBPF 都是最热门的话题之一,更不用提 eBPF Summit、Plumbers Conference (LPC)、bpfconf、eBPF Day 等专门的 eBPF 会议了。这些繁荣的社区活动,不仅极大促进了 eBPF 技术的发展,也吸引了更多的人加入到 eBPF 中来,用 eBPF 解决更多的问题。如果你对这些活动感兴趣,可以到 https://ebpf.io/events/ 中找到它们的详细信息。

小结 ​

今天,我带你回顾了 eBPF 在 2023 年的发展历程。过去一年,Linux 内核不仅大幅增强了 eBPF 的功能特性,新增了通用迭代器、uprobe 多挂载、套接字销毁、自定义对象、红黑树数据结构等一系列的新特性,eBPF 的生态系统和实践也是遍地开花,很多开源项目都在去年达到了生产可用的稳定版本。特别是 Cilium 在 CNCF 的毕业,标志着 eBPF 已经成为网络、监控和安全等领域解决方案的构建标准,并成为云原生领域的基石技术。就像 Kubernetes 在成熟之后有了写给儿童的插图版 Kubernetes 指南一样,eBPF 也已经把它的大手伸向了儿童,有了它自己的儿童版指南。如果你还没有在产品中使用 eBPF,那么可以说你已经在很多方面(尤其是网络、观测和安全等领域)落后了。

今天这一讲就到这里了。在 2024 年,我们专栏将继续关注 eBPF 的发展,为大家带来更多的 eBPF 相关的内容。下一次的动态更新预计会在 4 月份。如果你有对我们课程未来内容的建议,欢迎在评论区提出来,期待你与我一起完善和构建一个最贴近实践的 eBPF 知识体系。

思考题 ​

在这一讲的最后,我想邀请你来聊一聊:

在过去的一年中,你有没有把 eBPF 应用到自己的产品中呢?如果有使用过,它们帮你解决了哪些实际的问题?或者,还有哪些其他的产品或开源项目是你打算在新的一年中使用的呢?

欢迎在留言区和我讨论,也欢迎把这节课分享给你的同事、朋友。让我们一起在实战中演练,在交流中进步。

最近更新