BumbleBee: 如丝般顺滑构建、交付和运行 eBPF 程序
本文地址:https://www.ebpf.top/post/bumblebee
1. 前言
不久前,Solo.io 公司在官网博客宣布了开源了一个名称为 BumbleBee 的新项目。该项目专注于简化构建 eBPF 工具的门槛和优化使用体验,通过将 eBPF 程序打包成 OCI 镜像,带来了与使用 Docker 一致的体验的构建、分发和运行 eBPF 程序。
BumbleBee 目的是让我们专注于编写 eBPF 代码,其负责自动生成与 eBPF 程序相关的用户空间的代码功能,包括加载 eBPF 程序和将 eBPF 程序的数据作为日志、指标和直方图进行展示。
那么我们为什么需要 BumbleBee 项目来管理 eBPF 程序呢?这需要从 eBPF 技术的特点讲起。
2. 构建和分发 eBPF 工具的挑战
eBPF 技术被称之为近 50 年来操作系统最大的变革,解决了 Linux 内核在上游开发、合并和发行功能缓慢的窘境。 eBPF 技术为内核提供了不通过上游实现内核的定制功能的能力,当前已经在可观测、网络和安全等多个领域得到了广泛的应用,尤其是在云原生的技术潮流中,eBPF 技术发挥的能力也越来越重要,诸如当前风头正盛的 Cilium 项目。
但是开发、构建和分发 eBPF 一直以来都是一个高门槛的工作,社区先后推出了 BCC、BPFTrace 等前端绑定工作,大大降低了编写和使用 eBPF 技术的门槛,但是这些工具的源码交付方式,需要运行 eBPF 程序的 Linux 系统上安装配套的编译环境,对于分发带来了不少的麻烦,同时将内核适配的问题在运行时才能验证,也不利于提前发现和解决问题。
近年来,为解决不同内核版本中 eBPF 程序的分发和运行问题,社区基于 BTF 技术推出了 CO-RE 功能(“一次编译,到处运行”),一定程度上实现了通过 eBPF 二进制字节码分发,同时也解决了运行在不同内核上的移植问题,但是对于如何打包和分发 eBPF 二进制代码还未有统一简洁的方式。除了 eBPF 程序,目前我们还需要编写用于加载 eBPF 程序和用于读取 eBPF 程序产生数据的各种代码,这往往涉及到通过源码复制粘贴来解决部分问题。
此外,libbpf-bootstrap 通过 bpftool 工具生成相关的脚手架代码,一定程度上解决了通用代码重复编写的问题,但是对于构建、分发和运行 eBPF 程序上提供的帮助有限。
3. BumbleBee 简介
BumbleBee 项目正是 Solo 公司在企业服务网格 Gloo-Mesh 项目中为方便应用 eBPF 技术而诞生中,其用于解决在构建、分发和运行 eBPF 程序遇到的重复性挑战,
当前该项目还在早期(当前版本 0.0.9),提供的功能场景(Network 和 FileSystem)有限,但是基于特定模板能力来构建 OCI 镜像的思路,为我们在管理 eBPF 程序方面提供了一种高效简洁的实现,值得我们关注。
使用 BumbleBee 工具的前置依赖: 运行的 eBPF 的操作系统开启了 BTF 支持,编写的 eBPF 代码也需要使用 CO-RE 相关函数,关于 CO-RE 相关的技术可以参考这里。
BumbleBee 提供了与 Docker 一致的体验感觉。下图是 Docker 的高层次示意图,BumbleBee 工具完全参考了这个流程。
3.1 构建
BumbleBee 打造 "恰到好处" 的 eBPF 工具链,将 eBPF 程序的构建过程自动化,让你专注于代码本身。 BumbleBee 的 eBPF 代码打包成一个 OCI 标准镜像,这样就可以在基础设施中进行分发。
下述命令可实现将 eBPF 程序 probe.c 的直接编译和打包成镜像 my_probe:v1 。
$ bee build probe.c username/my_probe:v1
3.2 发布
利用 BTF 和 OCI 打包能力,BumbleBee 编写的 eBPF 代码是可移植的,并且可以嵌入到现有的发布工作流程中。 通过将 eBPF 代码构建的镜像,推送到任何符合 OCI 标准的镜像仓库,就可以实现发布给其他用户使用。
下述命令实现了将镜像发布至镜像仓库的功能,使用时可直接使用 bee run 基于镜像运行。
# 推送
$ bee push username/my_probe:v1
# 拉取
$ bee pull username/my_probe:v1
3.3 运行
使用 BumbleBee 提供的 CLI 界面和保存在镜像仓库中的镜像,我们可快速在其他地方运行。 BumbleBee 不但构建了用户空间代码,而且可以利用 eBPF map,来展示日志、指标和柱状图信息。 BumbleBee 使用了 BTF 格式自审能力,获知到需要显示哪些数据类型。
$ bee run my_probe:v1
下面让我们通过一个完整的样例,来体验 BumbleBee 带给我们管理 eBPF 程序的便利。
4. 完整体验
4.1 bee 安装
首先我们需要一个运行支持 BTF 内核的 Linux 操作系统,这里推荐直接使用 ubuntu 2110 版本,搭载的内核已经默认支持了 BTF。如果你选择使用 Vagrant 来管理虚拟机,BumbleBee 仓库中提供的 Vagrantfile 文件可以直接使用。或者你可以使用 mulipass 工具直接启动一个 ubuntu 2110 版本的系统。
这里使用仓库提供的脚本安装,当然也可以直接通过 git clone 仓库的方式进行。
为了快速体验,避免某些场景中的权限问题,这里建议直接使用 root 用户进行安装。
ubuntu@ubuntu21-10:~# curl -sL https://run.solo.io/bee/install | BUMBLEBEE_VERSION=v0.0.9 sh
Attempting to download bee version v0.0.9
Downloading bee-linux-amd64...
Download complete!, validating checksum...
Checksum valid.
bee was successfully installed