什么是革命性技術(shù)eBPF?為什么可觀測性領(lǐng)域都得用它
如果有一種技術(shù)可以監(jiān)控和采集任何應(yīng)用信息,支持任何語言,并且應(yīng)用完全無感知,零侵入,想想是不是很激動,那么這個技術(shù)是什么呢?就是eBPF,他應(yīng)該是最近一兩年非常熱門的技術(shù)名詞,我相信你或多或少都看到過,但可能不知道他能做什么,今天我們來講講這個革命性的技術(shù)eBPF,以及它在可觀測領(lǐng)域的應(yīng)用。
一、eBPF是什么?
eBPF(extended Berkeley Packet Filter)是在Linux內(nèi)核中運行的虛擬機技術(shù),2014年它首次出現(xiàn)在 Linux 內(nèi)核中,并經(jīng)過這幾年迭代,目前已經(jīng)成熟。它提供了一種靈活并且安全的方式來擴展內(nèi)核功能。eBPF最初是為網(wǎng)絡(luò)數(shù)據(jù)包過濾而設(shè)計的,但現(xiàn)在已經(jīng)擴展到其他領(lǐng)域,如安全監(jiān)控、性能分析和系統(tǒng)跟蹤等。
eBPF允許用戶在不修改內(nèi)核源代碼的情況下,通過加載和執(zhí)行自定義的eBPF程序來擴展內(nèi)核功能。這些eBPF程序通過Hook機制與內(nèi)核交互,他們可以對進入和離開內(nèi)核的事件進行過濾和處理,以實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的監(jiān)控、性能統(tǒng)計和安全審計等功能。
如下圖,eBPF可以在文件寫入和讀取進行攔截處理,網(wǎng)絡(luò)的發(fā)送和接受進行攔截處理
這段代碼是一個eBPF過濾器程序,用于在網(wǎng)絡(luò)數(shù)據(jù)包通過時打印源IP地址和目標IP地址。它使用bpf_printk函數(shù)來輸出信息到內(nèi)核日志。
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/in.h>
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能做什么?
動態(tài)編程內(nèi)核以實現(xiàn)高效的網(wǎng)絡(luò)、可觀測性、追蹤和安全性。
1.可觀測性
eBPF程序是事件驅(qū)動的,當內(nèi)核或用戶程序經(jīng)過一個 eBPF Hook 時,對應(yīng)Hook點上加載的eBPF程序就會被執(zhí)行。從而可以采集相關(guān)信息,而且它是完全無侵入,對應(yīng)用系統(tǒng)來說完全無感知。
想想以前我們用的監(jiān)控系統(tǒng)Cat、SkyWalking或多或少都有侵入,只是代碼多少的問題,有了它完全不用關(guān)心,而且它能對所有運行在linux上面應(yīng)用進行監(jiān)控,比如redis、kafka等
2.安全監(jiān)控和審計
eBPF可以用于實時監(jiān)控系統(tǒng)的安全事件和異常行為。它可以檢測惡意軟件、網(wǎng)絡(luò)攻擊、未經(jīng)授權(quán)的訪問等安全威脅,并觸發(fā)警報或采取相應(yīng)的防御措施。
3.自定義功能擴展
如數(shù)據(jù)包處理、協(xié)議解析、數(shù)據(jù)轉(zhuǎn)換等。
三、eBPF在可觀測性方案的應(yīng)用
可觀測性,也是近幾年非常熱門的話題,因為應(yīng)用大部分都基于k8s部署,而k8s的網(wǎng)絡(luò)模型比較復(fù)雜,如果系統(tǒng)出現(xiàn)異常,無法快速定位問題,所以需要有一個的平臺可以去做系統(tǒng)故障定位、性能優(yōu)化、以及監(jiān)控等工作,而可觀測性提供了更深入的洞察力和更好的理解,使得再復(fù)雜的分布式系統(tǒng)中構(gòu)建、部署和維護應(yīng)用程序更加可靠和高效。
如何做好一個可觀測性系統(tǒng),那么eBPF技術(shù)是繞不開的,下面看下eBPF是如何抓取應(yīng)用數(shù)據(jù)。
1.eBPF是如何抓取應(yīng)用數(shù)據(jù)的
可能有人會問eBPF是怎么抓取數(shù)據(jù),因為進入系統(tǒng)內(nèi)核都是二進制數(shù)據(jù),如何知曉是kafka或者mongodb的數(shù)據(jù),答案是基于通信協(xié)議,每個中間件都是屬于自身的通信協(xié)議,比如 redis、mysql、mongodb等,以下為mongodb的原始通信報文,這個報文每幾位代表什么含義,在mongodb官方文檔都有定義
2.mongodb消息解析
由于作者本人的電腦為Mac M系列芯片,對eBPF不怎么兼容,所以我們下面只講原理,如下圖是mongodb通信協(xié)議,基于這個協(xié)議,可以知曉消息內(nèi)容、操作類型、響應(yīng)碼等。
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/
基于這個消息協(xié)議,eBPF就可以完成數(shù)據(jù)解析和抽取:
四、基于eBPF構(gòu)建的可觀測性平臺
目前很多公司都基于 eBPF技術(shù)在構(gòu)建自己的可觀測性平臺,下面介紹一些相關(guān)產(chǎn)品
1.阿里云應(yīng)用監(jiān)控eBPF版
它是一套針對Kubernetes集群開發(fā)的一站式可觀測性產(chǎn)品,它能做到:
- 代碼無侵入:阿里云應(yīng)用監(jiān)控eBPF版通過旁路技術(shù),不需要對代碼進行埋點即可獲取到豐富的網(wǎng)絡(luò)性能數(shù)據(jù)。
- 語言無關(guān):阿里云應(yīng)用監(jiān)控eBPF版在內(nèi)核層進行網(wǎng)絡(luò)協(xié)議解析,支持任意語言,任意框架。
- 高性能:阿里云應(yīng)用監(jiān)控eBPF版基于eBPF技術(shù),能以極低的消耗獲取豐富的網(wǎng)絡(luò)性能數(shù)據(jù)。
- 資源關(guān)聯(lián):阿里云應(yīng)用監(jiān)控eBPF版通過網(wǎng)絡(luò)拓撲,資源拓撲展示相關(guān)資源的關(guān)聯(lián)。
- 數(shù)據(jù)多樣:阿里云應(yīng)用監(jiān)控eBPF版支持可觀測的各種類型數(shù)據(jù)(監(jiān)控指標、鏈路、日志和事件)。
- 整體性:阿里云應(yīng)用監(jiān)控eBPF版通過控制臺的場景設(shè)計,關(guān)聯(lián)起架構(gòu)感知拓撲、Prometheus監(jiān)控、告警配置。
部分效果圖:
dashboard
拓撲圖
https://help.aliyun.com/zh/arms/application-monitoring-ebpf/product-overview/what-is-alibaba-cloud-application-monitoring-ebpf-version
2.開源監(jiān)控系統(tǒng)deepFlow
DeepFlow 開源項目旨在為復(fù)雜的云基礎(chǔ)設(shè)施及云原生應(yīng)用提供深度可觀測性。DeepFlow 基于 eBPF 實現(xiàn)了零侵擾(Zero Code)的指標、分布式追蹤、調(diào)用日志、函數(shù)剖析數(shù)據(jù)采集,并結(jié)合智能標簽(SmartEncoding)技術(shù)實現(xiàn)了所有觀測數(shù)據(jù)的全棧(Full Stack)關(guān)聯(lián)和高效存取,核心特性如下:
- 任意 Service 的全景圖:利用 eBPF 零侵擾繪制生產(chǎn)環(huán)境的全景圖。
- 任意 Request 的分布式追蹤:基于 eBPF 的零侵擾分布式追蹤能力,支持任意語言的應(yīng)用程序,并完整覆蓋網(wǎng)關(guān)、服務(wù)網(wǎng)格、數(shù)據(jù)庫、消息隊列、DNS、網(wǎng)卡等各類基礎(chǔ)設(shè)施。
- 任意 Function 的持續(xù)性能剖析:以低于 1% 的開銷零侵擾采集生產(chǎn)環(huán)境進程的性能剖析數(shù)據(jù)。
- 無縫集成流行的可觀測性技術(shù)棧:可作為 Prometheus、OpenTelemetry、SkyWalking、Pyroscope 的存儲后端。
- 存儲性能 10x ClickHouse:基于 SmartEncoding 機制,向所有觀測信號注入標準化的、預(yù)編碼的元標簽,相比 ClickHouse 的 String 或 LowCard 方案均可將存儲開銷降低 10x。
部分效果圖:
redis 監(jiān)控
請求日志
分布式鏈路追蹤
sql 監(jiān)控
https://github.com/deepflowio/deepflow/blob/main/README-CN.md
3.Skywalking
眾多周知Skywalking基于agent方式采集可觀測性數(shù)據(jù),比如java用java agent相關(guān)api編寫,其他語言則編寫對應(yīng)語言的agent,這種方式可行,但是對技術(shù)人員要求較高。如果使用eBPF就不存在這種問題,目前看到Skywalking也有往eBPF方向發(fā)展
部分效果圖:
引用于吳晟老師SkyWalking2023峰會演講PPT
4.Cilium
Cilium 是一個開源項目,為 Kubernetes 集群和其他容器編排平臺等云原生環(huán)境提供網(wǎng)絡(luò)、安全和可觀測性,它主要使用的技術(shù)就是eBPF
https://cilium.io/
總結(jié)
以上我們介紹了eBPF是什么,以及它有哪些優(yōu)勢,同時講解了它在可觀測性領(lǐng)域的一些應(yīng)用,希望對你有所幫助。