公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。
如果有一种技术可以监控和采集任何应用信息,支持任何语言,并且应用完全无感知,零侵入,想想是不是很激动,那么这个技术是什么呢?就是eBPF,它应该是最近一两年非常热门的技术名词,我相信你或多或少都看到过,但可能不知道它能做什么,今天我们来讲讲这个革命性的技术eBPF,以及它在可观测领域的应用eBPF是什么?
eBPF
(extended Berkeley Packet Filter)是在 Linux 内核中运行的虚拟机技术,2014 年它首次出现在 Linux 内核中,并经过这几年迭代,目前已经成熟。它提供了一种灵活并且安全的方式来扩展内核功能。eBPF 最初是为网络数据包过滤而设计的,但现在已经扩展到其它领域,如安全监控、性能分析和系统跟踪等。
eBPF
允许用户在不修改内核源代码的情况下,通过加载和执行自定义的eBPF
程序来扩展内核功能。这些eBPF
程序通过Hook 机制与内核交互,它们可以对进入和离开内核的事件进行过滤和处理,以实现网络数据包的监控、性能统计和安全审计等功能。
如下图,eBPF
可以在文件写入和读取进行拦截处理,网络的发送和接受进行拦截处理
这段代码是一个 eBPF 过滤器程序,用于在网络数据包通过时打印源 IP 地址和目标 IP 地址。它使用 bpf_printk 函数来输出信息到内核日志。
#include
#include
#include
#include
SEC("filter")
int print_ip(struct __sk_buff *skb) {
struct ethhdr *eth = bpf_hdr_pointer(skb);
struct iphdr *ip = (struct iphdr *)(eth + 1);
if (eth->h_proto == htons(ETH_P_IP)) {
bpf_printk("Source IP: %u.%u.%u.%u\n",
ip->saddr & 0xFF,
(ip->saddr >> 8) & 0xFF,
(ip->saddr >> 16) & 0xFF,
(ip->saddr >> 24) & 0xFF);
bpf_printk("Destination IP: %u.%u.%u.%u\n",
ip->daddr & 0xFF,
(ip->daddr >> 8) & 0xFF,
(ip->daddr >> 16) & 0xFF,
(ip->daddr >> 24) & 0xFF);
}
return XDP_PASS;
}
动态编程内核以实现高效的网络、可观测性、追踪和安全性。
eBPF 程序是事件驱动的,当内核或用户程序经过一个 eBPF Hook 时,对应 Hook 点上加载的 eBPF 程序就会被执行。从而可以采集相关信息,而且它是完全无侵入,对应用系统来说完全无感知。
想想以前我们用的监控系统Cat
、SkyWalking
或多或少都有侵入,只是代码多少的问题,有了它完全不用关心,而且它能对所有运行在 linux 上面应用进行监控,比如
redis
、kafka
等
eBPF
可以用于实时监控系统的安全事件和异常行为。它可以检测恶意软件、网络攻击、未经授权的访问等安全威胁,并触发警报或采取相应的防御措施。
如数据包处理、协议解析、数据转换等。
可观测性,也是近几年非常热门的话题,因为目前互联网公司应用大部分都基于 k8s 部署,而 k8s 的网络模型比较复杂,如果系统出现异常,无法快速定位问题,所以需要有一个的平台可以去做系统故障定位、性能优化、以及监控等工作,而可观测性提供了更深入的洞察力和更好的理解,使得在复杂的分布式系统中构建、部署和维护应用程序更加可靠和高效
如何做好一个可观测性系统,那么eBPF
技术是绕不开的,下面看下eBPF
是如何抓取应用数据
可能有人会问eBPF是怎么抓取数据,因为进入系统内核都是二进制数据,如何知晓是kafka或者mongodb的数据,答案是基于通信协议,每个中间件都是属于自身的通信协议,比如 redis、mysql、mongodb等,以下为mongodb的原始通信报文,这个报文每几位代表什么含义,在mongodb官方文档都有定义
引用于:郑志聪老师在 2023 云原生+可观测性广州 Meeup 分享
由于作者本人的电脑为MAC M系列芯片,对eBPF
不怎么兼容,所以我们下面只讲原理,如下图是mongodb
通信协议,基于这个协议,可以知晓消息内容、操作类型、响应码等。
struct MsgHeader {
int32 messageLength; // total message size, including this
int32 requestID; // identifier for this message
int32 responseTo; // requestID from the original request
// (used in responses from the database)
int32 opCode; // message type
}
https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol/
目前很多公司都基于 eBPF技术在构建自己的可观测性平台,下面介绍一些相关产品
它是一套针对 Kubernetes 集群开发的一站式可观测性产品,它能做到:
部分效果图
https://help.aliyun.com/zh/arms/application-monitoring-ebpf/product-overview/what-is-alibaba-cloud-application-monitoring-ebpf-version
DeepFlow 开源项目旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了零侵扰(Zero Code)的指标、分布式追踪、调用日志、函数剖析数据采集,并结合智能标签(SmartEncoding)技术实现了所有观测数据的全栈(Full Stack)关联和高效存取,核心特性如下:
部分效果图
https://github.com/deepflowio/deepflow/blob/main/README-CN.md
众多周知Skywalking基于agent方式采集可观测性数据,比如java用java agent相关api编写,其它语言则编写对应语言的agent,这种方式可行,但是对技术人员要求较高。如果使用eBPF就不存在这种问题,目前看到Skywalking也有往eBPF方向发展
部分效果图
引用于吴晟老师 SkyWalking2023 峰会演讲 PPT
Cilium 是一个开源项目,为 Kubernetes 集群和其它容器编排平台等云原生环境提供网络、安全和可观测性,它主要使用的技术就是eBPF
https://cilium.io/
以上我们介绍了eBPF
是什么,以及它有哪些优势,同时讲解了它在可观测性领域的一些应用,希望对你有所帮助。