基于eBPF的云原生可观测性开源项目Kindling之eBPF基础设施库技术选型

本文涉及的产品
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
性能测试 PTS,5000VUM额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: eBPF技术正以令人难以置信的速度发展,作为一项新兴技术,它具备改变容器网络、安全、可观测性生态的潜力。本文主要探讨Kindling的eBPF基础设施库的选型考量。

eBPF技术正以令人难以置信的速度发展,作为一项新兴技术,它具备改变容器网络、安全、可观测性生态的潜力。eBPF作为更加现代化的内核技术,相较于内核模块,它的编写难度已经有了较大的降低,但是不可否认对于普通开发者还是有一定门槛。因此,很多云原生软件会在eBPF系统调用(函数)和libbpf之上封装一层更加简单易用的api,比如falco的libs、bcc的libbcc、cilium的cilium-ebpf。笔者将这些依赖库称之为eBPF的基础设施。Kindling专注于云可观测性领域,致力于排查各种复杂故障,包括但不限于网络、文件、内存、on-off cpu堆栈,解决上述问题是Kindling的第一优先级目标,本着不重复造轮子的原则,Kindling无意于再创造一个eBPF的基础设施。

丰富的eBPF基础设施库

当下有很多库可以供开发者选择,比如libbcc、dropbox的goebpf、cilium的ebpf库、calico的底层库、falco的lib库。这些库主要协助完成以下功能:

  • 将eBPF程序加载到内核中并且重定位
  • 将map载入初始化,提供fd供用户态和内核态交互
  • 更友好的开发使用体验

基于此,我们分别选择了2个基于c和go的基础设施库来对比:

Libbcc

Gobpf

Falco-libs

Cilium-ebpf

开发语言

c或cgo

go

c

c通过bpf2go转换成go

是否支持CO-RE

支持

支持

不支持(正在支持)

支持

api完善度

较好

较好

较好

很好

初始化流程完善程度

在这4个比较对象中,libbcc和gobpf一脉同源,gobpf是libbcc的go实现,其原理是用cgo包装了libbcc和libelf。faclo-libs是纯c语言的实现,cilium-ebpf则是纯go语言的实现。在功能实现方面,这些库都实现了eBPF程序加载使用的基本流程。不过这些库分别也拥有一些其独有的优势,比如:

  • Cilium-ebpf由于cilium踩得坑较多,在一些细节方面更加出色,比如eBPF中使用memcmp函数存在一些可用性的BUG(详见:https://lists.llvm.org/pipermail/llvm-bugs/2016-January/044502.html),cilium就重写这些基础库函数,保证函数是可用的
  • libbcc和faclo-libs由于是纯c的库,不需要经过cgo这样的方式调用,相对来说性能也更加出色一点
  • libbcc有更好的脚本语言生态,bcc中很多python和lua这类运行在libbcc之上的脚本已经很成熟,能帮助用户更快和更容易的写出eBPF程序

Kindling选择falco-libs的N大理由

既然基础的功能这些库都能实现,并且在细节方面cilium更加出色,那么为什么Kindling依旧选择了falco-libs作为了eBPF基础设施呢?理由如下:

  • 对低版本内核的支持

众所周知,eBPF在4.14内核版本以上才能使用。但是现阶段很多发行版比如centOS7的内核版本都是3.x,无法使用eBPF(centOS7.6以上已经通过eBPF patch支持)。falco-libs使用内核模块实现了和eBPF相同的功能,且性能表现更加出色,Kindling认为centOS7.4等版本在国内现阶段还是广泛应用的,在低版本内核中体验到Kindling可观测性的功能是非常重要的。 由于采用了faclo-libs,Kindling支持的发行版本:

发行版

版本

Ubuntu

16.04+

Debian

9.0+

RHEL

7+

CentOS

7+

内核模块更出色的性能表现(图出自falco-libs github):


faclo社区的性能测试结果

  • 对于系统调用的精细化整理

falco-libs是syscall方面的专家,而Kindling对syscall的分析需求也必不可少。

syscall是Kindling可观测性事件的重要来源,syscall可以分析出一次网络调用的时间、具体网络报文,一次 文件读写等指标。在Kindling的未来功能规划里,oncpu offcpu剖析也需要用到futex,write,epoll等syscall。 facalo-libs梳理了300多个syscall,将其中的主要参数从内核数据结构转换成如下类似事件结构:

/* PPME_SOCKET_GETSOCKOPT_E */{"getsockopt", EC_NET, EF_MODIFIES_STATE | EF_DROP_SIMPLE_CONS, 0 },
/* PPME_SOCKET_GETSOCKOPT_X */{"getsockopt", EC_NET, EF_USES_FD | EF_MODIFIES_STATE| EF_DROP_SIMPLE_CONS, 6, {{"res", PT_ERRNO, PF_DEC}, {"fd", PT_FD, PF_DEC}, {"level", PT_FLAGS8, PF_DEC, sockopt_levels}, {"optname", PT_FLAGS8, PF_DEC, sockopt_options}, {"val", PT_DYN, PF_DEC, sockopt_dynamic_param, PPM_SOCKOPT_IDX_MAX}, {"optlen", PT_UINT32, PF_DEC}}},
/* PPME_SOCKET_SENDMSG_E */{"sendmsg", EC_IO_WRITE, EF_USES_FD | EF_WRITES_TO_FD | EF_MODIFIES_STATE, 3, {{"fd", PT_FD, PF_DEC}, {"size", PT_UINT32, PF_DEC}, {"tuple", PT_SOCKTUPLE, PF_NA} } },
/* PPME_SOCKET_SENDMSG_X */{"sendmsg", EC_IO_WRITE, EF_USES_FD | EF_WRITES_TO_FD | EF_MODIFIES_STATE, 2, {{"res", PT_ERRNO, PF_DEC}, {"data", PT_BYTEBUF, PF_NA} } },
  • Falco-libs对事件的丰富化Falco-libs会根据内核事件的tid,fd等信息自动补全事件的以下字段:

字段

描述

Category

事件分类,比如该事件属于网络、文件、内存等

FdInfo

FD相关信息,比如该FD代表的文件,网络协议,四元组等信息

ThreadInfo

线程名称,事件所属于的容器id等信息

这让Kindling将事件转换成指标和trace变得事半功倍。

  • 正在支持中的CO-RE

Faclo-libs截止目前还未支持CO-RE,不过其已经有独立的分支开始进行相关内容支持,相信在不久的将来falco-libs将支持CO-RE。这使得笔者认为的falco-libs的最大短板将得到解决

在以上理由的驱动下,笔者认为faclo-libs是当下最适合Kindling功能需求的基础eBPF库

基于faclo-libs的拓展

  • 由于faclo-libs专注于syscall,所以其对tracepint的支持较好,对于其他eBPF程序类型没有支持。Kindling拓展了faclo-libs的代码使其支持了kprobe

3.png

  • 支持了centos7.6+使用eBPF
  • 拓展了除syscall之外的更多事件,并且Kindling还将根据需求不断拓展新事件,以下是Kindling已经新增的事件:

4.png

  • 拓展了用户态动态控制probe启停的能力
  • 拓展了eBPF相关的基础函数,比如字符串比较等

这些改动都体现在该仓库agent-libs(fork on faclo/libs): https://github.com/Kindling-project/agent-libs

对于未来

随着国内3.x内核版本操作系统的逐渐更新换代,Kindling有理由选择社区热度更火、细节方面更出色的cilium-eBPF作为底层基础库,也有理由选择经过无数环境验证的libbcc作为底层库。总之,一切取决与Kindling用户的需要,Kindling对此呈开放态度并且始终权衡利弊,选择当下最合适的方案。


Kindling是一款基于eBPF的云原生可观测性开源工具,旨在帮助用户更好更快的定界云原生系统问题,并致力于打造云原生全故障域的定界能力。

Kindling项目地址:Kindling

在云可观测性方面有任何疑问欢迎与我们联系:Kindling官网

目录
相关文章
|
2月前
|
Kubernetes Cloud Native 关系型数据库
云原生数据基础设施之kubeblocks
云原生数据基础设施之kubeblocks
|
2月前
|
运维 安全 Cloud Native
核心系统转型问题之保障云原生分布式转型中的基础设施和应用层面如何解决
核心系统转型问题之保障云原生分布式转型中的基础设施和应用层面如何解决
|
2月前
|
Cloud Native 安全 中间件
核心系统转型问题之云原生架构下的基础资源设施应重点考虑什么方面
核心系统转型问题之云原生架构下的基础资源设施应重点考虑什么方面
|
2月前
|
Kubernetes Cloud Native API
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
39 1
|
3月前
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
|
4月前
|
弹性计算 监控 Cloud Native
构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛
本次比赛旨在如何通过分析 ECS 性能数据和任务信息,综合利用深度学习、序列分析等先进技术,生成特定机器的性能指标。参赛者的解决方案将为云资源管理和优化决策提供重要参考,助力云计算资源的高效稳定运行和智能化调度。
641 14
|
3月前
|
SQL Cloud Native 关系型数据库
云原生数据仓库使用问题之如何实现adb到adb的整库迁移或同步
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
4月前
|
人工智能 监控 Cloud Native
多款可观测产品全面升级丨阿里云云原生 5 月产品月报
多款可观测产品全面升级丨阿里云云原生 5 月产品月报。
|
5月前
|
运维 Cloud Native 安全
云原生架构的未来演进:迈向自我优化的基础设施
【5月更文挑战第30天】 随着企业数字化转型的深入,云原生技术正成为推动现代应用开发和运维模式变革的关键力量。本文探讨了云原生架构如何通过不断的技术迭代,实现自我优化的基础设施,以及这一进化对企业IT策略的影响。文章首先回顾了云原生的概念与核心组件,随后分析了当前云平台在自动化、微服务管理、容器化等方面的最新趋势,并预测了未来可能的发展路径,包括AI辅助的运维、无服务器架构的进一步普及以及安全自动化等。最后,文章提出了企业在采纳云原生技术时的策略建议,以促进业务敏捷性和技术创新。
|
5月前
|
存储 Prometheus 运维
【阿里云云原生专栏】云原生下的可观测性:阿里云 ARMS 与 Prometheus 集成实践
【5月更文挑战第25天】阿里云ARMS与Prometheus集成,为云原生环境的可观测性提供强大解决方案。通过集成,二者能提供全面精准的应用监控,统一管理及高效告警,助力运维人员及时应对异常。集成示例代码展示配置方式,但需注意数据准确性、监控规划等问题。这种集成将在云原生时代发挥关键作用,不断进化以优化用户体验,推动业务稳定发展。
217 0