什麼是革命性技術eBPF?為什麼可觀測性領域都得用它

架構成長指南發表於2023-12-27

公眾號「架構成長指南」,專注於生產實踐、雲原生、分散式系統、大資料技術分享。

如果有一種技術可以監控和採集任何應用資訊,支援任何語言,並且應用完全無感知,零侵入,想想是不是很激動,那麼這個技術是什麼呢?就是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 程式就會被執行。從而可以採集相關資訊,而且它是完全無侵入,對應用系統來說完全無感知

想想以前我們用的監控系統CatSkyWalking或多或少都有侵入,只是程式碼多少的問題,有了它完全不用關心,而且它能對所有執行在 linux 上面應用進行監控,比如
rediskafka

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

拓撲圖

https://help.aliyun.com/zh/arms/application-monitoring-ebpf/product-overview/what-is-alibaba-cloud-application-monitoring-ebpf-version

開源監控系統 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

https://cilium.io/

總結

以上我們介紹了eBPF是什麼,以及它有哪些優勢,同時講解了它在可觀測性領域的一些應用,希望對你有所幫助。


掃描下面的二維碼關注我們的微信公眾帳號,在微信公眾帳號中回覆◉加群◉即可加入到我們的技術討論群裡面共同學習。

相關文章