草庐IT

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

浩仔浩仔 2023-04-12 原文

前置知识:

  • 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。

有关一篇带给你eBpf开源项目解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  7. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  8. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  9. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  10. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

随机推荐