• Eunomia: 让 ebpf 程序的分发和使用像网页和 web 服务一样自然


    我们的项目地址:https://github.com/yunwei37/Eunomia

    eBPF 是一项革命性的技术,它能在操作系统内核中运行沙箱程序。被用于安全并有效地扩展内核的能力而无需修改内核代码或者加载内核模块。

    但是开发、构建和分发 eBPF 一直以来都是一个高门槛的工作,社区先后推出了 BCC、BPFTrace 等前端绑定工作,大大降低了编写和使用 eBPF 技术的门槛,但是这些工具的源码交付方式,需要运行 eBPF 程序的 Linux 系统上安装配套的编译环境,对于分发带来了不少的麻烦,同时将内核适配的问题在运行时才能验证,也不利于提前发现和解决问题。

    近年来,为解决不同内核版本中 eBPF 程序的分发和运行问题,社区基于 BTF 技术推出了 CO-RE 功能(“一次编译,到处运行”),一定程度上实现了通过 eBPF 二进制字节码分发,同时也解决了运行在不同内核上的移植问题,但是对于如何打包和分发 eBPF 二进制代码还未有统一简洁的方式。除了 eBPF 程序,目前我们还需要编写用于加载 eBPF 程序和用于读取 eBPF 程序产生数据的各种代码,这往往涉及到通过源码复制粘贴来解决部分问题。

    Eunomia 同样基于 CO-RE(Compile Once-Run Everywhere)为基础实现,保留了资源占用低、可移植性强等优点,同时更适合在生产环境批量部署所开发的应用:

    Eunomia 想要探索一条全新的路线:在本地编译或者远程服务器编译之后,使用 http RESTful API 直接进行 ebpf 字节码的分发,在生产环境最小仅需 4 MB 的运行时,约 100ms 的时间和微不足道的内存、CPU 占用即可实现 ebpf 代码动态分发、热加载、热更新,不受内核版本限制,不需要在生产环境中安装底层库(如 LLVM、python 等)、搭建环境即可启动;

    ebpf:一个革命性的技术

    从古至今,由于内核有监视和控制整个系统的特权,操作系统一直都是实现可观察性、安全性和网络功能的理想场所。同时,操作系统内核也很难进化,因为它的核心角色以及对稳定和安全的高度要求,因此,操作系统级别的创新相比操作系统之外实现的功能较少。

    请添加图片描述

    eBPF 从根本上改变了这个定律。通过允许在操作系统内运行沙箱程序,应用开发者能够运行 eBPF 程序在运行时为操作系统增加额外的功能。然后操作系统保证安全和执行效率,就像借助即时编译器(JIT compiler)和验证引擎在本地编译那样。这引发了一波基于 eBPF 的项目,涵盖了一系列广泛的使用案例,例如:

    • 在现代数据中心和云原生环境中提供高性能网络和负载均衡;
    • 以低开销提取细粒度的安全可观察性数据;
    • 帮助应用开发者追踪应用程序;
    • 洞悉性能问题和加强容器运行时的安全性

    ebpf 开发和分发方式

    众所周知,计算机程序的分发也经历了几个阶段,每个阶段都会带来一次巨大的流量突破和爆发:

    1. 使用机器码或汇编编写,和当前机器的架构强绑定,没有移植性可言;
    2. 在这之后,伟大的先驱们开发了各种计算机高级编程语言(如 C )和编译器,此时移植需要针对特定的机器指令集架构,有一个编译器实现,并且在移植的时候通过编译器进行源代码的再次编译;
    3. 使用虚拟机进行分发和运行(例如 Java),可以预先编译好程序并进行分发,在特定的机器上使用虚拟机进行解译和运行,将编译阶段和运行阶段解耦;
    4. 在浏览器中直接浏览 web 网页或使用 web 应用程序,仅仅需要一条 url 链接或者说一些 web 请求,就能在随时随地打开并且运行对应的应用程序,获得相似的体验,不再受设备和操作系统的限制(能打败你的只有网速!);

    同样, ebpf 程序的开发和分发也经历了以下几个阶段:

    1. 类似 linux 内核源代码的 samples/bpf 目录下的 eBPF 示例,开发一个匹配当前内核版本的 eBPF 程序,并编译为字节码(或者直接手写字节码),再分发到生产环境中,和当前内核版本强绑定,几乎没有可移植性,开发效率也很低:
    int main(int ac, char **argv)
    {
       
        struct bpf_object *obj;
        struct bpf_program *prog;
        int map_fd, prog_fd;
        char filename[256];
        int i, sock, err;
        FILE *f;
    
        snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
    
        obj = bpf_object__open_file(filename, NULL);
        if (libbpf_get_error(obj))
            return 1;
    
        prog = bpf_object__next_program(obj, NULL);
        bpf_program__set_type(prog, BPF_PROG_TYPE_SOCKET_FILTER);
    
        err = bpf_object__load(obj);
        if (err)
            return 1;
    
        prog_fd = bpf_program__fd(prog);
        map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
        ...
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    1. 基于 BCC、bpftrace 的开发和分发,一般来说需要把 BCC 和开发工具都安装到容器中,开发效率高
  • 相关阅读:
    Github | 如何在Github上只下载一个文件或文件夹!?
    Live800:更少套路,今年双十一服务战开启
    基于 QUIC 协议的 HTTP/3 正式发布!
    Nginx浏览器缓存
    java毕业设计德云社剧场网上售票系统Mybatis+系统+数据库+调试部署
    6-VMware Horizon 2203 虚拟桌面-Connect服务配置(六)
    69 RGB图像转单色位图
    Mybatis01、Mybatis简介
    【CSS】css弹性布局、CSS hack_08
    2022牛客暑期多校训练营3(总结+补题)
  • 原文地址:https://blog.csdn.net/qq_42779423/article/details/126414543