公眾號「架構成長指南」,專注於生產實踐、雲原生、分散式系統、大資料技術分享。
如果有一種技術可以監控和採集任何應用資訊,支援任何語言,並且應用完全無感知,零侵入,想想是不是很激動,那麼這個技術是什麼呢?就是eBPF,它應該是最近一兩年非常熱門的技術名詞,我相信你或多或少都看到過,但可能不知道它能做什麼,今天我們來講講這個革命性的技術eBPF,以及它在可觀測領域的應用eBPF是什麼?
eBPF 是什麼?
eBPF
(extended Berkeley Packet Filter)是在 Linux 核心中執行的虛擬機器技術,2014 年它首次出現在 Linux 核心中,並經過這幾年迭代,目前已經成熟。它提供了一種靈活並且安全的方式來擴充套件核心功能。eBPF 最初是為網路資料包過濾而設計的,但現在已經擴充套件到其它領域,如安全監控、效能分析和系統跟蹤等。
eBPF
允許使用者在不修改核心原始碼的情況下,透過載入和執行自定義的eBPF
程式來擴充套件核心功能。這些eBPF
程式透過Hook 機制與核心互動,它們可以對進入和離開核心的事件進行過濾和處理,以實現網路資料包的監控、效能統計和安全審計等功能。
如下圖,eBPF
可以在檔案寫入和讀取進行攔截處理,網路的傳送和接受進行攔截處理
這段程式碼是一個 eBPF 過濾器程式,用於在網路資料包透過時列印源 IP 地址和目標 IP 地址。它使用 bpf_printk 函式來輸出資訊到核心日誌。
#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 能做什麼?
動態程式設計核心以實現高效的網路、可觀測性、追蹤和安全性。
1.可觀測性
eBPF 程式是事件驅動的,當核心或使用者程式經過一個 eBPF Hook 時,對應 Hook 點上載入的 eBPF 程式就會被執行。從而可以採集相關資訊,而且它是完全無侵入,對應用系統來說完全無感知。
想想以前我們用的監控系統Cat
、SkyWalking
或多或少都有侵入,只是程式碼多少的問題,有了它完全不用關心,而且它能對所有執行在 linux 上面應用進行監控,比如
redis
、kafka
等
2.安全監控和審計
eBPF
可以用於實時監控系統的安全事件和異常行為。它可以檢測惡意軟體、網路攻擊、未經授權的訪問等安全威脅,並觸發警報或採取相應的防禦措施。
3.自定義功能擴充套件
如資料包處理、協議解析、資料轉換等。
eBPF 在可觀測性方案的應用
可觀測性,也是近幾年非常熱門的話題,因為目前網際網路公司應用大部分都基於 k8s 部署,而 k8s 的網路模型比較複雜,如果系統出現異常,無法快速定位問題,所以需要有一個的平臺可以去做系統故障定位、效能最佳化、以及監控等工作,而可觀測性提供了更深入的洞察力和更好的理解,使得在複雜的分散式系統中構建、部署和維護應用程式更加可靠和高效
如何做好一個可觀測性系統,那麼eBPF
技術是繞不開的,下面看下eBPF
是如何抓取應用資料
eBPF 是如何抓取應用資料的
可能有人會問eBPF是怎麼抓取資料,因為進入系統核心都是二進位制資料,如何知曉是kafka或者mongodb的資料,答案是基於通訊協議,每個中介軟體都是屬於自身的通訊協議,比如 redis、mysql、mongodb等,以下為mongodb的原始通訊報文,這個報文每幾位代表什麼含義,在mongodb官方文件都有定義
引用於:鄭志聰老師在 2023 雲原生+可觀測性廣州 Meeup 分享
mongodb 訊息解析
由於作者本人的電腦為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
就可以完成資料解析和抽取
基於 eBPF 構建的可觀測性平臺
目前很多公司都基於 eBPF技術在構建自己的可觀測性平臺,下面介紹一些相關產品
阿里雲應用監控 eBPF 版
它是一套針對 Kubernetes 叢集開發的一站式可觀測性產品,它能做到:
- 程式碼無侵入:阿里雲應用監控 eBPF 版透過旁路技術,不需要對程式碼進行埋點即可獲取到豐富的網路效能資料。
- 語言無關:阿里雲應用監控 eBPF 版在核心層進行網路協議解析,支援任意語言,任意框架。
- 高效能:阿里雲應用監控 eBPF 版基於 eBPF 技術,能以極低的消耗獲取豐富的網路效能資料。
- 資源關聯:阿里雲應用監控 eBPF 版透過網路拓撲,資源拓撲展示相關資源的關聯。
- 資料多樣:阿里雲應用監控 eBPF 版支援可觀測的各種型別資料(監控指標、鏈路、日誌和事件)。
- 整體性:阿里雲應用監控 eBPF 版透過控制檯的場景設計,關聯起架構感知拓撲、Prometheus 監控、告警配置。
部分效果圖
dashboard
拓撲圖
開源監控系統 deepFlow
DeepFlow 開源專案旨在為複雜的雲基礎設施及雲原生應用提供深度可觀測性。DeepFlow 基於 eBPF 實現了零侵擾(Zero Code)的指標、分散式追蹤、呼叫日誌、函式剖析資料採集,並結合智慧標籤(SmartEncoding)技術實現了所有觀測資料的全棧(Full Stack)關聯和高效存取,核心特性如下:
- 任意 Service 的全景圖:利用 eBPF 零侵擾繪製生產環境的全景圖。
- 任意 Request 的分散式追蹤:基於 eBPF 的零侵擾分散式追蹤能力,支援任意語言的應用程式,並完整覆蓋閘道器、服務網格、資料庫、訊息佇列、DNS、網路卡等各類基礎設施。
- 任意 Function 的持續效能剖析:以低於 1% 的開銷零侵擾採集生產環境程式的效能剖析資料。
- 無縫整合流行的可觀測性技術棧:可作為 Prometheus、OpenTelemetry、SkyWalking、Pyroscope 的儲存後端。
- 儲存效能 10x ClickHouse:基於 SmartEncoding 機制,向所有觀測訊號注入標準化的、預編碼的元標籤,相比 ClickHouse 的 String 或 LowCard 方案均可將儲存開銷降低 10x。
部分效果圖
redis 監控
請求日誌
分散式鏈路追蹤
sql 監控
https://github.com/deepflowio/deepflow/blob/main/README-CN.md
SkyWalking
眾多周知SkyWalking基於agent方式採集可觀測性資料,比如java用java agent相關api編寫,其它語言則編寫對應語言的agent,這種方式可行,但是對技術人員要求較高。如果使用eBPF就不存在這種問題,目前看到SkyWalking也有往eBPF方向發展
部分效果圖
引用於吳晟老師 SkyWalking2023 峰會演講 PPT
Cilium
Cilium 是一個開源專案,為 Kubernetes 叢集和其它容器編排平臺等雲原生環境提供網路、安全和可觀測性,它主要使用的技術就是eBPF
總結
以上我們介紹了eBPF
是什麼,以及它有哪些優勢,同時講解了它在可觀測性領域的一些應用,希望對你有所幫助。
掃描下面的二維碼關注我們的微信公眾帳號,在微信公眾帳號中回覆◉加群◉即可加入到我們的技術討論群裡面共同學習。