一篇带给你eBpf开源项目解析

开源
WebAssembly的设计目标是为了解决Web上应用程序的性能问题,尤其是在使用JavaScript等高级语言编写的复杂Web应用中。

前置知识:

  • WASM:WebAssembly(缩写为Wasm)是一种低级的、与平台无关的二进制指令格式,是一种新型的虚拟机技术,可以在现代Web浏览器中运行,并且可以与JavaScript等其他Web技术一起使用。它被设计为一种可移植的编译目标,能够将不同编程语言的代码编译成WebAssembly字节码,这些字节码可以在Web浏览器中快速加载和执行。

WebAssembly的设计目标是为了解决Web上应用程序的性能问题,尤其是在使用JavaScript等高级语言编写的复杂Web应用中。相比于JavaScript等脚本语言,WebAssembly的执行速度更快,且能够提供更好的性能和安全性,同时也更加适合进行密集计算和高性能图形处理等操作。除了在Web浏览器中使用,WebAssembly还可以在其他环境中运行,如桌面应用程序、移动应用程序等,因此它也被认为是一种通用的、可移植的虚拟机技术。

A stack-based virtual machine is a type of virtual machine architecture in which the operands for instructions are pushed onto a stack, and the instructions themselves operate on the top elements of the stack. In other words, the virtual machine uses a stack to store data and operands, and the instructions are executed based on the data at the top of the stack.

  • WASI:WebAssembly System Interface(缩写为WASI)是一个标准化的API接口,它提供了一种通用的系统接口,使得WebAssembly程序能够在不同的操作系统和硬件平台上运行,并能够访问底层操作系统的资源和功能,如文件系统、网络、定时器等。
  • eBPF:(Extended Berkeley Packet Filter)是一个内核级别的虚拟机技术,它可以动态地注入用户自定义的程序代码到内核中运行并关联事件,并在不修改内核源代码的情况下增强内核的功能。eBPF 可以监控和分析内核和用户空间的事件,从而实现高效的性能分析、网络抓包、安全监控和资源管理等功能。

eBPF 能够工作的原理是通过在内核中注册各种钩子函数,这些钩子函数会在特定的事件发生时被触发,并执行 eBPF 程序来处理这些事件。eBPF 程序是一种特殊的字节码格式,可以在用户空间编写,然后通过内核的加载器加载到内核中运行。eBPF 程序可以访问内核中的数据结构,并对数据进行修改或过滤。

在云原生环境下,ebpf更有优势。

可关联event类型:

Entry to/Exit from Functions:kprobe,kretprobe,uprobe,uretprobe
Tracepoints:/sys/kernel/debug/tracing/events
Perf Events
Linux Security Module Interface
Network Interfaces:XDP
Sockets and Other Networking Hooks
  • Bcc:bcc(BPF Compiler Collection)是一个用于生成eBPF(extended Berkeley Packet Filter)程序的工具集,它提供了一组高级工具和库,使得用户可以轻松地编写和调试eBPF程序。

Starship的架构

1、agent

├── cmd 入口函数

├── deployer 部署eBpf+wasm模块

├── driver 运行模块

├── ebpf eBpf相关

├── proc-info 收集process信息

└── wasm wasm处理信息

两大块功能:

1、模块管理,模块指的是eBpf+wasm。

2、进程信息上报。

Agent的标识是NodeName和agent PodID。这两个是从kubernetes注入的:

另外,还挂载了主机的/和/sys,用于bcc工具和process监控。

因为要使用ebpf program和监控进程,所以需要特权。

Agent启动后,首先会清除之前部署过的TricorderProbes trap。然后,程序使用 linux_headers 包中的 Init 函数初始化 BCC 的 Linux 头文件。之后,grpc连接到api-server、连接到pg、开启循环获取process信息、开启循环处理module的deploy处理。

由于agent容器挂载了主机的/sys路径,因此可以收集节点上所有的进程信息。在这种情况下,grabProcessInfo函数将搜索主机的/sys/fs/cgroup目录,因此,它将能够收集节点上所有进程的信息。

当部署一个module后,会开启轮询:1.从eBPF中读取数据。2.将数据复制到WASM中。3.从WASM中读取结果。4.将json结果写入pg。

2、api-server

├── cmd 入口函数

├── grpc 处理deploy和process的grpc调用

├── http 定义http路由,dao

├── meta 原生kubernetes监控资源

├── pb protobuf定义

├── testing 测试

├── utils 工具

└── wasm 编译

目前部署为StatefulSet,但是卷类型是emptyDir,也就是每次会新建一个tricorder.db文件。

然后启动的时候进行初始化。

Api-server主要功能有:agent管理,管理模块的部署,获取节点进程信息,数据展示,数据持久化(sqlite)。

在部署模块时,各agent的moduleInstance持久化保存成功后,会触发cond条件,这时才会去各agent去部署。同时,会在pg创建相应的数据表,供agent进行数据存储。

在api-server的部署中,使用名为api-server的sa,这个sa具备所有resource的权限。

Api-server同时监测原生kubernetes资源,目前有:

这些资源是通过informer监测的,api-server会将监测信息同步至pg。

Api-server会使用pod informer监测各节点的pod,然后将这些容器id发给agent进行processInfo获取,获取后,由api-server存储至pg。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-02-27 10:17:05

EventBus观察者模式

2021-07-12 06:11:14

SkyWalking 仪表板UI篇

2022-01-14 11:45:40

JVM 虚拟机Java

2022-01-17 11:28:55

JVM 虚拟机Java

2021-04-08 11:00:56

CountDownLaJava进阶开发

2023-03-29 07:45:58

VS编辑区编程工具

2021-03-12 09:21:31

MySQL数据库逻辑架构

2021-01-28 08:55:48

Elasticsear数据库数据存储

2021-06-21 14:36:46

Vite 前端工程化工具

2021-07-21 09:48:20

etcd-wal模块解析数据库

2022-04-29 14:38:49

class文件结构分析

2021-04-01 10:51:55

MySQL锁机制数据库

2022-03-22 09:09:17

HookReact前端

2024-06-13 08:34:48

2021-04-14 14:16:58

HttpHttp协议网络协议

2022-02-17 08:53:38

ElasticSea集群部署

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-10-28 08:51:53

GPIO软件框架 Linux

2022-02-25 15:50:05

OpenHarmonToggle组件鸿蒙
点赞
收藏

51CTO技术栈公众号