跳转至

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_structstruct 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 选项。

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

伴随着这些内核版本的发布,新引入的功能特性也都集成到了 libbpfbpftool 中。你可以访问它们的 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 应用到自己的产品中呢?如果有使用过,它们帮你解决了哪些实际的问题?或者,还有哪些其他的产品或开源项目是你打算在新的一年中使用的呢?

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

精选留言(4)
  • Geek_72807e 👍(1) 💬(0)

    今年还没更啊!!!

    2024-06-11

  • Skylake 👍(0) 💬(0)

    支持老师持续更新课程!

    2024-07-16

  • 鑫鑫 👍(0) 💬(1)

    请问为什么ebpf 通过性能事件获取事件信息,而不是通过map?我知道map获取一些交互的内容,为什么map 不能作为事件信息的获取?而是采用性能事件?

    2024-03-13

  • Geek_644bec 👍(0) 💬(0)

    辛苦老师在持续更新课程,我会一直关注下去!老师能否对比一下国内厂商在eBPF上的实践,另外还有基于eBPF的无侵入式调用链的前景

    2024-02-23