《3.eunomia:让eBPF程序的开发和部署尽可能简单.pptx》由会员分享,可在线阅读,更多相关《3.eunomia:让eBPF程序的开发和部署尽可能简单.pptx(30页珍藏版)》请在三个皮匠报告上搜索。
1、eunomia-bpf:让 eBPF 的编译和分发尽可能简单2022.11郑昱笙eBPF 轻量级开发框架https:/ 背景背景 2 项目目标项目目标3 使用案例使用案例4 架构架构5 未来的发展方向未来的发展方向目录项目背景项目背景01014eBPF:一个革命性的技术:一个革命性的技术eBPF 与内核的关系有点类似于 JavaScript 或者 WASM 与浏览器内核的关系。eBPF 提供了一种新的内核可编程的选项eBPF 程序架构强调安全性和稳定性,不需要重新编译内核,使用更加便捷多种应用方式和多种 eBPF 程序类型5一般来说,一个完整的 eBPF 应用程序分为用户空间程序和内核程序两部
2、分:用户空间程序:加载、控制 eBPF 程序、数据处理;内核中的 eBPF 程序:事件驱动、接受用户态的控制、上传信息eBPF 程序的基础设施:除了内核的加载器和运行时之外,通常还需要用户态的辅助加载框架和通信框架如 BCC、libbpf 等,以及对应的编译工具链 Clang/LLVM、辅助工具 bpftool 等01项目背景6常见的 eBPF 开发和部署使用方式:BCC、bpftrace 为代表的脚本方式编写和分发01项目背景编写内核态代码编写用户态的加载处理代码运行时动态编译运行以源代码方式分发部署依赖 Clang/LLVM 等库,每次运行都要执行 Clang/LLVM重新编译,编译环境配
3、置复杂需要编写复杂的用户态加载框架,对每个 eBPF 函数分别进行加载,源代码形态的 eBPF 程序难以标准化分发;更为灵活7常见的 eBPF 开发和部署使用方式:libbpf、libbpf-go/rs、cilium/ebpf 等 CO-RE(一次编译、到处运行)框架01项目背景编写、编译内核态代码生成 bpf.oBPF 二进制程序C/C+gorust以包含预编译 BPF 代码的二进制分发多种不同的用户态加载框架更好的移植性,部署时不需要 重新编译;需要编写或自动生成复杂的用户态加载框架;没有标准的分发方案;C、Go、Rust 等框架都各自有各自的生态和 API,工具难以兼容、复用、管理;内核
4、代码和用户态代码绑定,难以动态加载和调整;8还可能存在哪些不够方便的地方?搭建和开发 eBPF 程序是一个门槛比较高、比较复杂的工作,必须同时关注内核态和用户态两个方面的交互和信息处理,还要配置环境,有没有更方便的方式?目前不同用户态语言如 C、Go、Rust 等编写的工具难以兼容、难以统一管理,多种开发生态难以整合:如何跨架构、跨语言和内核版本,使用标准化的方式方便又快捷的打包、分发、发布 eBPF 程序,同时还需要能很方便地动态调整 eBPF 程序的挂载点、参数等等?如何更方便地使用 eBPF 的工具?有没有可能从云端一行命令拉下来就使用,类似 docker 那样?或者把 eBPF 程序作
5、为服务运行,通过 HTTP 请求和 URL 即可动态插拔运行任意一个可重定位的 eBPF 程序?如何更方便地编译和分发使用 eBPF 程序?01项目背景901项目背景WebAssemblyWebAssembly(缩写 Wasm)是基于堆栈虚拟机的二进制指令格式。到现在为止,WASM 已经发展成为一个轻量级、高性能、跨平台和多语种的软件沙盒环境,被运用于云原生软件组件,可以在非浏览器环境下运行。wasm 的设计思路和 ebpf 也有不少相似之处。Docker+Wasm 让开发者能够更容易地快速构建和分发使用面向 Wasm 运行时的应用程序。项目目标项目目标0102编写内核态即可运行降低 eBPF
6、 学习成本提高开发效率编译和运行完全分离降低部署和使用的资源消耗简化使用方式使用 JSON/WASM 分发和 WebAssembly 生态相结合类似 docker 的使用体验保留动态调整 eBPF 程序的可能自动获取内核态导出数据在部署时不需要重新编译提供标准化的分发方式eunomia-bpfeBPF 轻量级开发框架:目标0212eunomia-bpf 核心部分的开发使用流程 02项目目标编写、编译内核态代码生成包含更多信息的 bpf.oBPF 二进制程序从源代码中提取额外的信息生成 JSON/YAML 的配置信息打包 JSON 或其他格式直接分发使用C/C+/Rust/GoWASM通常的编译
7、流程在使用用户态加载框架处理 bpf.o 的时候已经丢失了部分信息:改变思路,引入额外的编译步骤,直接从源代码中获取类似 IR 的想法:引入配置文件的方式,作为不同用户态语言和动态加载 eBPF 内核态代码的桥梁,不需要为每一种语言做一套 API 和开发框架根据配置信息动态加载和调整 eBPF 程序使用案例使用案例020103从网页端下载预编译 eBPF 程序 一行命令即可从云端运行任意最新版本的 eBPF 程序 类似 docker 的使用体验:OCI 存储 WASM 模块 使用 WebAssembly 模块或 JSON 对象进行标准化 eBPF 程序的分发和动态加载运行 一次编译到处运行:部
8、署时不需要重新编译、架构无关下载使用预编译 eBPF 程序03只需要编写内核态代码 最大程度减少新手的上手障碍 省略用户态的重复性加载框架编写和原生 libbpf 完全兼容 兼容主流框架,最大程度减少迁移成本 无任何特殊语法限制,不需要包含任何特定的头文件或声明 支持 libbpf 自带的所有 attach 类型,并且可以方便地扩展自定义 eBPF 程序的 attach point 可以在源代码中通过一些类似 SEC 或者 doxygen 那种类型的注释的方式,添加一些额外的辅助加载信息 支持 tracepoint、kprobe、fentry、lsm、uprobe 等多种类型Hello Wor
9、ld“年轻人的第一个 eBPF 程序”03使用容器打包编译工具链 不需要担心环境配置问题、一行命令生成项目模板、一行命令编译编译运行 eBPF 程序03生成对应的配置文件信息 以标准化的 JSON 或 YAML 的方式呈现 可读可编辑 修改配置文件即可实现动态加载、配置17用户态传递信息使用原生 C 语言结构体往用户态传递信息:只需要在特定的头文件中定义好传递信息的内核态 C 语言结构体或不定义在头文件中,也可以使用特定的注释方式进行注解自动序列化和导出对应信息0318用户态传递信息自动完成对于 ring buffer 或者 perf event 的加载、导出事件等,只需要编写内核态代码即可根
10、据注解自动从 hash map 中采样获取对应信息03在 WASM 中编写用户态辅助程序可选的用户态 wasm 程序提供安全、高效的用户态数据处理和控制逻辑平台无关探索使用更多的语言来进行开发 eBPF 程序:JS/TS 等等最大程度上复用现有的生态和代码:把 bcc/libbpf-tools 不需要修改直接编译为 WASM 模块打包生成 WASM 模块借助 WebAssembly 的相关生态帮助分发、管理 eBPF 程序可嵌入大型应用中作为可编程模块或插件使用WebAssembly0320提供基于 async Rust 的自定义 Prometheus 或 OpenTelemetry 可观测性
11、数据收集器通过 API 请求即可启动和管理 eBPF 程序;eBPF as a Service仅需一个数十kb的请求,加载时间通常为数十毫秒且内存占用少(例如使用 libbpf-bootstrap/bootstrap.bpf.c,热加载时间约为 50ms,运行时内存占用约为 5 MB,同时新增更多的 eBPF 程序实例通常只会增加数百 kB 的内存占用)可观测性数据导出器0321用户态接口可以将 eunomia-bpf 运行时嵌入其他大型应用中,作为 ebpf 动态加载库使用;和 bpftool gen 生成的代码框架类似。提供核心的 API 原语(open/load/attach/poll)
12、可以再使用 libbpf 原生的一些用户态辅助函数,例如bpf_map_lookup_elem 等提供 C/C+/Rust/wasm 等多种开发接口,探索更多语言的用户态 eBPF 开发方式本质上是一个配置文件的 eBPF 程序的动态加载、热更新运行时抽象层(类似于 RPC 的思想)不局限于某些特定的库,可以借助其他框架实现不支持 BTF 的运行方案、低内核版本的支持等。架构架构&生态生态030104系统架构24文档文档详细的文档和教程网站:https:/eunomia-bpf.github.io/25Github Template本地不需要安装配置任何编译环境26在线编译运行、快速体验在线编
13、译运行、快速体验提供前端和快速上手平台:只需要在网页上编写 eBPF 内核态程序,即可一键完成在线编译、在线查看运行结果;也可以直接下载编译好的 eBPF 字节码在本地一键运行;https:/ 本质上是一套使用配置文件进行 eBPF 程序动态加载的标准,以及帮助获取配置信息的编译工具链,来:让开发者专注于 eBPF 内核程序的编写,简化 eBPF 程序的开发、分发、运行;尽可能复用现有的生态,避免重复造轮子;后端的运行时可以是多种多样的,只需要能正确通过配置文件进行加载即可:可以选择标准的 libbpf 在 C/C+语言中进行开发,或者 libbpf-go、libbpf-rs 等;或者希望具有
14、远程编译的特性,需要对低内核版本进行适配,也可以选择 Coolbpf 的 libbpf 的实现;可以在 WASM 中加载和处理配置文件信息,也可以很方便地和大型系统做集成,嵌入到一个大型的 eBPF 程序管理、编排、可视化系统中作为一个动态加载器使用;我们提供的基于 libbpf 的动态加载运行时示例实现,代码仅不到 1k 行29未来的计划提供一套标准化的、从配置文件和 WASM 出发的动态加载方案和 SIG 社区的其他成员一起讨论并形成一个具体的 API 标准,提供更完善和稳定的 API、配置文件、和 OCI 镜像定义;尝试和 eBPF 上游社区对接,例如 bpftool、libbpf 等;
15、尝试和 WASM 上游社区对接,提供从 WASI 动态加载 eBPF 程序的能力;和其他社区合作,完善 eBPF 相关生态;和 LMP 社区一起完成基于 WASM 和 OCI 镜像的 eBPF 分发运行方案;借助 Coolbpf,提供更好的低内核版本的支持、远程编译和分发支持等;也可以给 Coolbpf 添加使用 WASM 模块、更多的语言进行用户态 API 开发的能力,以及让 Coolbpf 也能编写内核态代码即可运行;其他:提供更完善的文档;更完善的 OCI 镜像和 WASM 支持;支持更多的架构:除了 arm/x86 之外,还可以支持 RISC-V 等;Thanks for watchingDate:2022.11