2022云栖精选—eunomia-bpf eBPF 轻量级开发框架

简介: 郑昱笙浙江大学

lQLPJxbcF2cqNBvMiM0FeLCMz4ifcSGHeANpqgFLAEAA_1400_136.png

一、概要

image.png

eBPF程序当前的开发和分发过程中存几个痛点:

第一,对于新手而言,搭建和开发 eBPF程序的门槛较高,必须同时关注内核态和用户态两方面的交互和信息处理,还需要编写用户态加载代码。


第二,不同架构不同内核版本上无法方便快捷地打包分发发布各种eBPF程序。eBPF很多小工具不同的语言开发,存在不同的接口,无法轻易集成到大型的可观系统。


第三,当前没有很好的插件方案,很多时候必须重新编译整个可观的框架,再重新部署上线,才能更新 ebpf 探针或数据处理模块。另外,如果引入第三方的用户态数据处理代码,代码崩溃会导致整个程序崩溃。


因此,我们提出了两种解决思路。

第一,针对初学者,只需要编写内核态代码即可自动获取内核态导出的数据,编译后即可进行加载和运行,降低了eBPF的学习成本,提高开发效率。


第二,基于 libbpf一次编译处处运行的特性,将用户态和内核态的编译和运行的完全分离,通过标准 JSON WASM模块的方式进行分发,无需进行重新编译应用启动占用资源少,时间短,甚至容器启动更短。


另外,我们希望能够提供标准化的分发方式,比如可以使用 JSON/ WASM 分发。WebAssembly一种基于堆栈虚拟机的二进制格式,为了可移植的目标而设计。一开始的目的在于希望能够让CC++rust 编写的代码在浏览器里运行,到现在已经发展成为轻量级、高性能、跨平台和多语种的沙盒环境可以运用于原生软件组件。其设计思路eBPF相似,区别在于运行在内核态用户态。


我们尝试将两者做了结合比如只编写内核代码时,直接将整个 eBPF程序打包成 JSON,其中包含各种配置信息比如从内核态上报到用户态数据内存布局信息比如需要配置的全局变量等,使得仅通过 JSON 即可完成大部分内核态 eBPF程序的配置信息,并且可以正确地加载。

WASM结合后,用户态通过 WASM eBPF程序进行打包,其中包含用户态的数据处理、配置信息完整的命令、函数解析等,与eBPF一起分发。


二、示例

Eunomia并不是一个完整的系统,而是类似于开发库和开发框架可以很轻松地嵌入coolbpf 工具链里,也可以作为开发库或开发框架嵌入其他程序

image.png

可以通过一行命令从网页端直接下载预编译好的eBPF程序运行。使用 WebAssembly JSON模块的方式进行分发,部署时无需重新编译,启动速度很快。

图中为放入 URL 的形式,也可以换成 OCI 镜像或 Docker 镜像可以存储在 Docker 仓库或 github package ,使用方式与Docker基本一致,只需简单地执行pullrun即可运行,也可以将编译好的程序包 push 下去直接使用。

而相比于传统的 Docker 镜像,它的启动速度更快,同时也保留了 eBPF很重要的特性,可以轻松嵌入到其他程序作为子模块或插件使用。

image.png

通过Eunomia只需编写内核态代码即可正确运行,能够最大程度减少新手的上手障碍省略用户态的加载框架编写,能够自动导出内核态 perf event ring buffer 事件。另外,它与和原生 libbpf 完全兼容,可以获取libbpf tools的内核态代码,无需修改任何代码,可直接运行。

可以额外添加 tracepoint 也可以通过注释的形式添加其他内容。使用容器打包编译工具链,无需担心环境配置问题一行命令生成项目模板、一行命令编译

image.png

完整的 eBPF工具通常会分为用户空间和内核空间两个部分。用户空间负责加载读取内核态回传的统计信息以及配置信息可以在WASM编写用户态辅助程序WASM本身是安全高效的用户态数据处理和控制逻辑,处于用户态无需担心会对其他应用程序造成干扰,且速度非常快

用户可以用多种语言编写比如CC++GoRust,最终均可被编译成WASM形式。我们将内核态代码和用户态代码一起打包生成WASM模块,借助 WebAssembly 的相关生态帮助分发、管理 eBPF 程序可嵌入大型应用中作为可编程模块或插件使用

目前我们已经实现了将libbpf tools 里用libbpf 写的工具直接编译成WASM模块进行分发。

过程中最主要的困难在于 WebAssembly 的内存布局比如结构体的内存布局eBPF完全不一样,因此 API 可能会存在数据序列化或转译的开销。同时因为 WebAssembly本身虚拟机的沙箱环境运行,可以访问的系统占用受限,因此也必须经过额外的转换。


三、系统架构

image.png

架构底层依赖的是内核态和用户态的基础设施,比如libbpf 库和 kernel 会提供相关的编译工具链,帮助生成 JSON 或打包成 WASM的模块工具链本身使用了比如 Clang/LLVMbpftool工具。动态加载库可以独立使用,WASM无关,可以根据 JSON 信息动态地加载 eBPF程序,外面套一个HTTP 即可变为web 服务的形式,实现 kernel function as your service ,变为内核函数及服务的形态。

我们还实现了WASM抽象层,包含 API 规范,比如用于扩展 WASM的虚拟机WSAI 系统占用的访问形式eBPF交互的访问形式。还有基于 WASM定制的 libbpf 移植的辅助态程序以及序列化库等,用于在 WASM模块加载基于 libbpf eBPF程序。

运行时库可以轻松进行替换,比如替换成WSIWASM运行时。除此之外,上层还实现了LMP命令工具、可观测性工具等。


关于龙蜥峰会 eBPF & Linux 稳定性专场课件获取方式:


【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件” 即可获取。有任何疑问请随时咨询龙蜥助手—小龙(微信:openanolis_assis)。


【视频回放】:视频回放可前往龙蜥官网https://openanolis.cn/video 查看。

lQLPJxbcF2cqM2TM-M0CnrCgW_7LDpyh1wNpqgFKAPsA_670_248.png

 

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
开发框架 前端开发 Linux
Go语言实战框架,GoFly全栈开发社区的Go快速开发框架简介与阿里服务器部署说明
GoFly中后台框架永久开源可商用。api文档管理并一键生成api接口代码,一键生成 CRUD前后端代码, GoFly快速开发框架是一款基于Go语言的 Gin和 Vue3的Arco Design的快速后台开发框架,基于JWT接口验证和Auth验证的权限管理系统,附件管理系统,天生支持saas架构。可打包部署在阿里云Linux系统上。
558 1
|
7月前
|
开发框架 JavaScript 前端开发
方舟笔记:方舟开发框架概述
方舟笔记:方舟开发框架概述
165 0
|
存储 监控 安全
DeeTune:基于 eBPF 的百度网络框架设计与应用
随着云计算的技术的不断迭代演进,百度内部服务逐渐搬迁到云环境中,部署成本和效率取得明显收益,但一些可观测能力的短板和缺失逐渐显露,传统的方式往往通过植入代码进行修改来实现,但在业务形态和技术栈多样性的背景下,面临业务被侵入、沟通协调、性能、稳定性等方面的诸多问题。本文中我们介绍百度基于 eBPF 实现的网络框架:DeeTune,包含构建服务拓扑、流量录制、无侵入指标监控等能力,进一步提升了 SRE 和质量保障的工作效率。
128 0
|
存储 缓存 监控
深入浅出 eBPF 技术
1 eBPF 介绍eBPF 是革命性技术, 起源于 linux 内核, 能够在操作系统内核中执行沙盒程序。旨在不改变内核源码或加载内核模块的前提下安全便捷的扩展内核能力。1.1 demo 展示demo程序如下:#include <linux/bpf.h> #define SEC(NAME) __attribute__((section(NAME), used)) SEC(&quot
3337 0
深入浅出 eBPF 技术
|
Kubernetes 监控 安全
2022云栖精选-eBPF安全特性解析
许庆伟 深信服创新研究院
2022云栖精选-eBPF安全特性解析
|
存储 JSON 开发框架
eunomia-bpf项目重磅开源!eBPF 轻量级开发框架来了 | 龙蜥技术
eunomia-bpf 是如何从云端一行命令下载运行 eBPF 程序等功能?
eunomia-bpf项目重磅开源!eBPF 轻量级开发框架来了 | 龙蜥技术
|
Cloud Native Java 程序员
2022云栖精选—基于eBPF的程序摄像头构想
苌程 开源eBPF可观测项目kindling创始人
2022云栖精选—基于eBPF的程序摄像头构想
|
存储 监控 安全
深入浅出eBPF|你要了解的7个核心问题
过去一年,ARMS基于eBPF技术打造了Kubernetes监控,提供多语言无侵入的应用性能,系统性能,网络性能观测能力,验证了eBPF技术的有效性。eBPF技术和生态发展很好,未来前景广大,作为该技术的实践者,本文目标是通过回答7个核心问题介绍eBPF技术本身,为大家解开eBPF的面纱。
深入浅出eBPF|你要了解的7个核心问题
|
存储 运维 监控
深入浅出 eBPF|你要了解的 7 个核心问题
eBPF 提供的只是一个框架和机制,核心还是需要用 eBPF 的人对软件栈的理解,找到合适的插桩点,能够和应用问题进行关联。
深入浅出 eBPF|你要了解的 7 个核心问题