前置知识:
- 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类型:
- 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。