Eunomia  0.1.0
A lightweight eBPF-based CloudNative Monitor tool for Container Security and Observability
操作系统大赛:基于 eBPF 的容器监控工具 Eunomia 决赛报告目录

本文档为决赛报告的目录,包含了主要的设计思路和创新点展示,以及一些比赛的相关信息。细节实现部分请参考每个部分列举的附加文档。

网站上的代码文档部分采用 doxygen 自动生成,因此不存在过时问题,但图片链接有些小问题。可以结合网站进行阅读: https://yunwei37.github.io/Eunomia/

1. 项目目标

Eunomia 是一个使用 C/C++ 开发的基于 eBPF的轻量级,高性能云原生监控工具框架,旨在帮助用户了解容器的各项行为、监控可疑的容器安全事件,力求提供覆盖容器全生命周期的轻量级开源监控解决方案。

它使用 Linux eBPF 技术在运行时跟踪您的系统和应用程序,并分析收集的事件以检测可疑的行为模式。目前,它包含性能分析、容器集群网络可视化分析*、容器安全感知告警、一键部署、持久化存储监控等功能,提供了多样化的 ebpf 追踪点,并可以轻松拓展。其核心导出器/命令行工具最小仅需要约 4MB 大小的二进制程序,即可在支持的 Linux 内核上启动。

  • [X] 开箱即用:以单一二进制文件或镜像方式分发,一次编译,到处运行,一行代码即可启动,包含多种 ebpf 工具和多种监测点,支持多种输出格式(json, csv, etc) 并保存到文件;
  • [X] 轻量级,高性能:编译成的二进制大小仅 4MB;
  • [X] 通过 ebpf 自动收集容器和 k8s 相关元信息,并和多种指标相结合;
  • [X] 可集成 prometheusGrafana,作为监控可视化和预警平台;也可作为 OpenTelemetry 的 collector 使用;
  • [X] 可自定义运行时安全预警规则, 并通过 prometheus 等实现监控告警;
  • [X] 可以自动收集进程行为并通过 seccomp/capability 进行限制;
  • [X] 提供远程的 http API 进行控制,实现 ebpf 跟踪器的热插拔、一键分发和热更新,也可自行定制插件进行数据分析;
  • [X] 其核心框架高度可扩展,可以非常轻松地集成其他的 libbpf ebpf C 程序;

2. 前期调研

2.1. 赛题调研

请参考:容器监控工具赛题调研.md

2.2. 云原生可观测性工具调研

请参考:云原生可观测性工具调研.md

3. 系统设计

3.1. 框架与 ebpf 探针设计

请参考:系统框架与ebpf探针设计.md

3.2. 容器元信息模块设计

请参考:容器追踪模块设计.md

3.3. 安全加固设计

请参考:安全告警规则设计.md

3.4. ebpf 追踪器跟踪点设计

请参考:ebpf追踪器跟踪点设计.md

3.5. 文档与教程

  1. 文档网站:使用 doxygen 部署 https://yunwei37.github.io/Eunomia/
  2. eBPF介绍与 libbpf 基础教程
  3. ebpf 跟踪器源码解析与使用教程

4. 难点与创新点:问题与解决方案

  1. 如何设计高效的,可扩展的数据结构来支持我们的 Eunomia 框架?
  2. 如何做到高效、轻量级?
    • 基于 C/C++ 和 libbpf
    • 使用现代的C++标准,给编译器提供更强的优化语义;
    • 使用了 LTO(链接时优化),以编译时间为代价降低二进制大小并提升性能;
    • 性能优化请参考:性能优化和benchmark.md
  3. 如何做到轻松接入新的 libbpf ebpf 追踪器程序?
    • 在初赛之后,我们增强、完善了一下 eunomia 的追踪器框架部分,提供了更通用的接口;
    • 除了旧的使用多线程运行的检查器之外,新增的检查器可以选择使用多线程运行,并且通过字符串参数控制;
    • 关于如何添加新的检查器,请参考:如何添加新的检查器.md
  4. 如何感知容器中进程的执行,将进程信息和容器元信息进行关联?
    • 我们在进程追踪器的基础上额外获取了进程的 cgroups、namespace 等信息,并且通过 docker API/k8s API 和容器信息相关联;
    • 请参考:容器追踪模块设计.md
  5. 如何实现 ebpf 追踪器通过 http API 的热插拔、分发和热更新?
  6. 使用了什么策略来保证 C/C++ 开发的 Eunomia 追踪器的稳定性?为什么不用 rust?
    • 启用了 github CI 进行自动构建, 并使用了大量的静态分析和动态分析工具,如 clang tidy、cppcheck、AddressSanitizer、Clang Static Analyzer 等来保证代码质量和风格;
    • rust 的安全性更强,但是 libbpf 绑定落后于 libbpf 主线开发进程,并且生态较少;

5. 项目测试

6. 提交仓库目录和文件描述

请参考:目录结构.md

7. 开发计划、重要进展、分工协作, 比赛收获

请参考:比赛和项目进展相关其他资料.md

8. 参考资料

请参考:参考资料.md

9. 附录

9.1. 使用手册

请参考:使用手册.md

9.2. http API 文档

请参考:http-API-文档.md

9.3. prometheus 指标

请参考:prometheus指标文档.md

9.4. 集成开源工具 prometheus 和 grafana

请参考:开源集成.md

9.5. OSPP开源项目申请书-基于 ebpf 的性能分析工具

请参考:OSPP开源项目申请书-基于 ebpf 的性能分析工具.md

9.6. 其他过程文档

请参考:[develop_doc](develop_doc)

9.7. 中期报告

请参考:develop_doc/report-v1-backup.md