基于eBPF的配置库应用拓扑自动发现功能的实现

2024-03-25 06:03李强李光兆
互联网周刊 2024年4期

李强 李光兆

摘要:在运维数字化转型、智能化发展的时代背景下,配置管理库是数字化运维必不可少的核心工具,其中应用拓扑是配置管理库的一个重要功能,也是配置管理数据的一个重要消费场景。与传统手工绘制的应用拓扑不同,配置管理库中的应用拓扑是依托于配置数据的动态拓扑图,但其仍依赖配置数据的准确性和更新的实时性。eBPF技术以在操作系统中进行动态插装的方式,通过采集IP和端口间的访问关系,实时跟踪获取每个节点的信息,从而自动获取应用之间的调用关系,建立应用拓扑的二、三层关系,减少配置库的维护成本,增加应用拓扑的准确性和实时性。

关键词:配置管理库;应用拓扑;动态跟踪;eBPF技术

引言

近年来,信息化、网络化技术迅猛发展,信息系统在各行业的日常生产工作中承担的作用越来越大,信息系统的运维安全日益重要。随着各行业数据中心的投入运营,虚拟化、云计算、大数据等技术的广泛应用,数字化升级进程持续加速,IT基础设施的种类和数量激增,信创产品的自主研发和技术创新全面加速,信息系统架构的复杂程度也不断提升,信息系统运维工作,特别是管理组成信息系统的IT资产和资源需要适应新形势、应对新挑战。

信息系统配置库即CMDB,是ITIL框架的配置管理流程中的基础部分,是通过获取、维护,检查企业的IT资源,从而高效控制与管理不断变化的IT基礎架构与IT服务,并为其他系统提供准确的配置信息,如任务调度、运维工单、发布管理等。一个实时准确的配置库是信息化时代安全运维的基石,也是运维管理的核心。

其中,应用拓扑是配置管理库的一个重要功能,也是配置管理数据的一个重要消费场景。应用拓扑图是以节点和边为基础,以一个应用为视角,描绘组成该应用的各个IT资源和资产的部署分布及节点状态的功能图。应用拓扑可以在异常告警精准化、变更风险管控、故障根因分析等场景中起到关键作用。然而传统的静态拓扑图,依赖于手工搭建,精确程度较低,维护成本较高,无法达到可靠、实时、准确的程度。与传统手工绘制的应用拓扑不同,配置管理库中的应用拓扑是依托于配置数据的动态拓扑图,但其仍依赖配置数据的准确性和更新的实时性。本文提出一种基于eBPF的配置库应用拓扑自动发现的方法,并进行了代码实现,根据配置库中的配置关系,采集IP和端口间的访问关系,实时跟踪获取每个节点的信息,从而自动获取应用之间的调用关系。

1. eBPF技术

1.1 eBPF简介

eBPF是基于BPF的扩展,BPF是类Unix系统上数据链路层的一种原始接口,BPF提供了原始链路层封包的收发。

eBPF技术是扩展的伯克利数据包过滤器,起源于Linux内核,可以在操作系统内核等特权上下文中运行该程序。eBPF无须更改Linux内核的源代码,且不需要重载内核模块的前提下,对内核功能进行扩展,可以让内核变得更加灵活和强大,从而达到动态追踪的功能。这些程序可以用于过滤网络数据包、收集内核统计信息、监控和调试等目的[1]。

1.2 eBPF的架构

eBPF的架构分为用户态和内核态,一个完整的eBPF程序包含用户态程序和内核态程序两部分。

eBPF用户态程序是指在用户空间范围内运行的程序,负责加载和管理eBPF的内核态程序,以及与内核态程序进行交互和数据处理,可以使用不同的语言和工具来编写。一种常用的工具是BCC,提供Python和C语言的API,以及一些现成的eBPF工具,可以进行编写和运行eBPF程序。用户空间程序负责加载BPF字节码至内核中,如果需要也会负责读取内核回传的统计信息或者事件详情[2]。

eBPF内核态程序是指在操作系统内核空间中运行的程序,负责实现eBPF的主要功能和逻辑。内核中的BPF字节码负责在内核中执行特定事件,如需要也会将执行的结果通过maps或者perf-event事件发送至用户空间。其中用户空间程序与内核BPF字节码程序可以使用map结构实现双向通信,这为内核中运行的BPF字节码程序提供了更加灵活的控制。

用户空间程序与内核中的BPF字节码交互的流程有如下步骤:

(1)使用LLVM或者GCC工具将编写的BPF代码程序编译成BPF字节码;

(2)使用加载程序Loader将字节码加载至内核;

(3)内核使用验证器组件保证执行字节码的安全性,以避免对内核造成灾难,在确认字节码安全后将其加载对应的内核模块执行;

(4)内核中运行的BPF字节码的程序可以使用两种方式将数据回传至用户空间。maps方式可用于将内核中实现的统计摘要信息(比如测量延迟、堆栈信息)等回传至用户空间。perf-event用于将内核采集的事件实时发送至用户空间,用户空间程序实时读取分析。

2. 系统设计与实现

2.1 eBPF插件设计与实现

eBPF程序可以通过一些工具包如BCC、bpftrace和ebpf_exporter来编写和加载。

本文的eBPF插件主要是基于ebpf_exporter,可以将eBPF程序的输出转换为Prometheus的指标,从而实现对网络数据包的监控和分析。此外还需要选择合适的挂载点,如kprobe、uprobe、tracepoint、xdp等,来捕获感兴趣的事件和数据,如进程名、文件名、网络包等。该插件的程序流程图如图1所示。

在插件启动时,启动ebpf_exporter并加载eBPF的配置文件,配置文件中包含BPF代码和导出指标的规则。ebpf_exporter会判断配置文件是否有效,如果无效,就返回错误并结束,如果有效,就继续执行。接着ebpf_exporter会编译BPF代码,并将其加载到内核中,同时创建一个BPFmap和一个perfevent用于存储和传输数据,加载到内核后ebpf_exporter开始监听端口(默认是9435),等待Prometheus的请求。Prometheus定期从ebpf_exporter的端口拉取数据,并将其存储在Mongo和MySQL数据库中,最后在配置库响应模块中进行调用[3]。

整个eBPF程序的核心逻辑是在两个k_probe上挂载回调函数,分别是tcp_v4_connect和tcp_rcv_state_process,分别用于捕获TCP连接的开始和结束。

2.2 应用拓扑自动发现功能的实现

本次eBPF采集插件使用僅支持Linux操作系统,系统内核版本需满足以下任意要求:版本大于等于4.14或等于3.10.0-693、3.10.0-957、3.10.0-1160。

系统主要通过安装eBPF插件后,通过配置库topic数据能够发现B端的资源,获取资源信息,结合CMDB中手动维护配置(系统、应用单元、模块实例之间的层级包含关系)。建立应用拓扑第二、三层关系时,通过在topic中找到的A、B端的资源能通过关联关系找到对应的应用单元和系统。找到资源和建立关系数据,并进行资源数据插入[4]。

2.2.1 数据采集格式

系统通过eBPF技术采集IP和port间的访问关系,从而自动获取应用之间的调用关系,采集数据上报的数据格式为src_ip,src_port,dst_ip,dstn_port;上报源到目标的访问关系,源指定IP和监听接口,可指定proc的资源类型。

2.2.2 数据处理入库

关系生成分为两级目标。

一级目标是生成模块实例-访问-模块实例、模块实例-访问-数据库实例、模块实例-访问-中间件实例3类关系。

二级目标是生成应用模块-应用模块之间的访问关系、应用模块-数据库、应用模块-模板的访问关系,甚至是系统与系统之间的访问关系、系统与中间件服务、数据库服务的依赖关系。

数据处理规则分为两部分,在上报的条目中,根据访问源或目标的IP和端口信息,在配置库中匹配目标关系两端的实例创建关系动作执行,异常情况反馈;在一级目标完成的基础上,根据已有的实例关系两端,各自所关联的上级所属应用关联目标,建立之间的关系。

2.2.3 数据模型调整

使用eBPF插件,需要调整相应的数据模型,在应用拓扑的绘制中,需要新增与eBPF联调所需的模板关系定义,新增模型方案如下:

通过应用实例之间的访问关系发现,建立各层应用之间的访问关系模型,增加和修改模板关系包括:

(1)模板“部署实例”访问“部署实例”,约束:N:N;

(2)模板“部署实例”访问“数据库实例”,约束: N:N;

(3)模板“部署实例”访问“中间件实例”,约束:N:N;

(4)“应用单元”访问“应用单元”,约束:N:N;

(5)“应用单元”访问“数据库实例”,约束:N:N;

(6)“系统”访问“系统”,约束:N:N;

(7)“中间件实例”访问“部署实例”,约束:N:N;

(8)“中间件实例”访问“数据库实例”,约束:N:N;

(9)“中间件实例”访问“中间件实例”,约束:N:N;

(10)修改部署实例的“服务端口”字段的数据类型,由string改为list;

(11)“应用单元”包含“部署实例”,约束:1:N。

2.2.4 呈现效果

在配置库中,通过物理子系统节点,自动生成该物理子系统下的访问关系拓扑入口。从应用模块进入物理子系统节点,可自动发现默认的展示路径包含:物理子系统(访问)→物理子系统;物理子系统(包含)→应用模块;应用模块(访问)→应用模块;应用模块(包含)→应用实例;应用实例(访问)→应用实例;应用实例(访问)→DB实例;应用实例(访问)→中间件实例;中间件实例(访问)→应用实例;中间件实例(访问)→中间件实例;中间件实例(访问)→DB件实例。

结语

本文在简要介绍和分析eBPF技术的基础上,详细阐述了eBPF技术的架构、汇编指令等内容,并在使用开源的react-flow和dagre库搭建的配置管理库原型系统的基础上,介绍了eBPF采集插件的设计与实现,通过采集插件和数据模型的配置,实现了配置库原型系统中应用拓扑的二、三层关系的自动发现功能。总体而言,通过eBPF插件对操作系统动态跟踪,实时采集调用关系,从而获得实时更新的应用拓扑。在实际运维工作中,尤其是应用资源统计、应用节点控制、故障定位等实际运维场景中,可以快速帮助运维人员快速找到应用中需要被关注的节点信息[5]。配置库应用拓扑自动发现功能在未来运维自动化、智能化发展中将具有决定性意义。

参考文献:

[1]刘伟,廖平.eBPF技术在操作系统动态跟踪中的应用研究[J].中国金融电脑,2022(8):81-84.

[2]姜欧涅.基于eBPF的网络数据包捕获与分析系统的设计与实现[D].武汉:华中科技大学,2020.

[3]薛擎宇.基于eBPF的报文快速处理技术研究[D].成都:电子科技大学,2023.

[4]孙建强.基于时序拓扑结构特征的会话推荐系统设计与实现[D].成都:电子科技大学,2022.

[5]高巍.基于操作系统eBPF在云原生环境下的技术研究[J].电子技术与软件工程,2022(17):70-74.

作者简介:李强,本科,助理工程师,研究方向:计算机技术及应用。

基金项目:中国铁路信息科技集团有限公司科技研究开发计划(编号:2022A05)。