當前位置: 妍妍網 > 碼農

第二屆 eBPF 開發者大會分享回顧 - Pipy 與 eBPF:重塑系統級編程的新範式

2024-04-23碼農
四月的西安,春意盎然,這座古城在溫暖的春風中更添了幾分旖旎風光。第二屆 eBPF 開發者大會在西安順利召開。

本次大會由西安郵電大學主辦,主題為「 發揮 eBPF 技術力量,提升電腦系統可觀測性和效能 」,旨在探討和分享 eBPF 技術的最新發展和套用。會議不僅提供 30 余場精彩報告,還特別準備了豐富的現場互動環節,確保每位參會者都能獲得最前沿的技術資訊和實際套用知識。

Flomesh 應邀參加了本次大會,架構師張曉輝參會並做了題為「Pipy 與 eBPF:重塑系統級編程的新範式」的分享。

在本次技術分享中,重點探討 Pipy 與 eBPF 結合創造的全新編程模式及其在網路場景中的潛力。Pipy,作為一個高效能且低資源的可編程引擎,與 eBPF 的結合超越了傳統的網路流量處理和系統監控領域,開辟了新的套用可能性。我們將重點介紹這種創新模式如何實作更靈活、更高效的編程和運維實踐,特別是透過網路動態更新 BPF 程式來增強能力。

eBPF 的工作場景

可觀測

eBPF 強大的觀測能力允許它收集系統執行時的各種指標,如 CPU 使用率、記憶體使用、網路 I/O、系統呼叫等,而且這種監控對系統的效能影響極小。這使得 eBPF 非常適合即時監控和效能分析。開發者可以利用 eBPF 實作精細的效能跟蹤和故障診斷,幫助提高套用和服務的效能和穩定性。

安全

在安全領域,eBPF 允許開發人員建立更細粒度和高度客製的安全策略,無需更改內核程式碼或載入內核模組。它能夠監控和控制系統呼叫、檔存取、網路存取等,從而有效防範惡意軟體和其他安全威脅。

網路

eBPF 在網路技術領域的套用確實表現出上升趨勢。它可以在內核級別進行包過濾、路由決策、負載均衡等操作,這些都是透過編寫安全、高效的程式碼直接在內核中執行來完成的。例如,使用 eBPF 可以建立動態的網路流量監控工具,或者實作更復雜的網路功能,如 DDoS 防護策略、精細的流量管理和網路效能最佳化等。此外,eBPF 也支持構建高效能的網路功能虛擬化(NFV)解決方案,這對現代數據中心尤為重要。

eBPF 以接近零的效能開銷提供這些場景的解決方案,在雲端運算和大數據環境中變得尤為重要。隨著技術的成熟和社群的活躍,我們可以預見 eBPF 在未來將在網路領域發揮更加重要的角色。

網路也是這次分享的重點場景。

eBPF 數據路徑

eBPF 在 Linux 數據路徑方面的套用,特別是在網路數據處理和效能最佳化上具有重要意義。在 Linux 數據路徑中,eBPF 允許使用者在內核中執行的程式碼對封包進行高度客製的處理,這也在很多方面都非常有用,比如網路監控、安全、和效能增強。

eBPF 允許在網路堆疊的多個點插入勾點,以便在封包到達網路介面、透過路由決策、甚至在達到使用者空間應用程式之前進行處理。開發者可以編寫自訂的封包處理邏輯,如過濾、重新導向、或修改封包。

eBPF 網路範例

說起 eBPF 在網路方面的套用,就不得不說近幾年 CNCF 中比較火熱的 Cilium。Cilium 是基於 eBPF 技術的一個非常流行的開源計畫,它在近年來尤其在容器和 Kubernetes 環境中得到了廣泛的套用。Cilium 利用 eBPF 提供網路安全、可見性和網路流量管理的高級功能。

雖然 eBPF 提供了在 L3/L4 層級上處理封包的強大能力和效能優勢,但在 L7 —— 即套用層的處理上,情況則復雜得多。eBPF 在 L3/4 層處理方面的優勢主要源自其能夠在內核空間直接操作和分析封包,這樣可以極大減少上下文切換和封包的復制。

到了 L7,流量處理變得更為復雜。在這一層,流量不僅僅包括簡單的網路包,還包括對具體套用數據的理解和處理。就拿套用廣泛的套用層協定 HTTP 來說,如 HTTP 請求的頭部解析、WebSocket 支持等。這些功能通常需要更多的資源和復雜的邏輯,因此用 eBPF 直接實作這些高級功能會面臨效能和復雜性的挑戰。

Cilium 嘗試透過引入 per-node sidecar 代理,並透過多個元件(Agent、Proxy、BPF Map、BPF 程式)的協作在來解決該問題。該方案涉及 多技術棧、多個元件和多層協作 ,這不僅增加了系統的復雜性,也要求運維團隊必須具備跨層次的知識,以有效地管理和故障排查;同時也對功能的擴充套件帶來了成本。

是否有更加簡潔的設計,來降低解決方案的復雜度呢?有,接下來就有請今天的另一個主角 Pipy。

Pipy 是什麽?

Pipy [1] 是一個開源的可編程套用引擎,它使用 C++ 開發。它支持透過 JS 編程的方式來實作網路流量的處理,以及復雜的套用邏輯,這些功能都可以透過編寫 JS 檔來實作。

Pipy 架構

Pipy 是一個單一的可執行檔,無需其他依賴。其分層架構非常簡單,底層依賴非常少;中層 API 層是核心層,封裝了網路流處理、BPF、NetLink,以及可編程的核心 Pipeline API;上層是一個自研的 JS 引擎,可以處理 PipyJS(標準 JavaScript 的客製版本) 的指令碼。

我們可以使用 JS 語法和 Pipy 提供的 API 來編寫個簡單 HTTP 負載均衡器,這些 JS 程式碼就是我們上面說的 PipyJS 指令碼。

可以看到其使用了 JS 的語法,以及 Pipy 提供的 API,比如流處理、網路 API。

Pipy Repo

Pipy 有多種執行方式,比如上面直接載入 JS 指令碼檔。它還可以從網路載入檔(不限於 JS 檔,還可以有靜態資源、證書金鑰、甚至是編譯好的 BPF .o 檔),一種類似 GitOps 的模型。

這種模型依賴執行於 Repo 模式的 Pipy,其提供了 Admin API 對其中的檔進行管理,透過透過網路向其他節點即時同步檔,節點收到更新後可以進行熱載入而無需重新開機。

Pipy BPF API

Pipy 的 BPF API 提供了 BPF 程式、Map 的相關操作。比如透過 Pipy BPF API,可以實作 BPF 程式的載入、掛載、分離等操作,還有 Map 的更新操作。

Pipy 和 eBPF 實作透明代理

讓我們透過一個簡單的例子來看 Pipy BPF API 的使用,這個例子我們之前在 Flomesh 公眾號上分享過: 。

透過 JS 編程,我們可以使用 BPF API 來對 BPF 程式和 Map 進行操作。在同一個行程,甚至是同一個 JS 指令碼檔 [2] 中,我們還實作了一個 Pipy 代理。

在同一個技術棧、行程中,我們實作對 BPF 程式的操作,以及套用層的網路處理。

在我們的 GitHub 倉庫 [3] 中,還提供了更多的 Pipy 與 eBPF 的範例,有興趣的同學可以下載瀏覽。

這裏多提一下 Pipy NetLink API,透過其可以將 XDP 型別的 BPF 程式掛載到網路裝置上。

eBPF 與 Pipy 的相同點

最後我們來看看 eBPF 和 Pipy 最基本的介紹作為總結。

eBPF 和 Pipy 都強調了 動態可編程性 作為其核心特性,這讓它們在各自的領域內非常有用且靈活。二者都是 基於穩定的微核心(eBPF 之於 Linux kernel,PipyJS 之於 Pipy),提供可編程的能力。

這裏將 Linux kernel 比作微核心,這裏的「微」是相對的,相對於直接在 kernel 中擴充套件實作自訂可觀測、安全、網路功能使其膨脹。

反而,這次大會上大家也預測未來的 kernel 會不會更加輕量級,因為其部份功能不是所有套用場景都必須的,反而可以透過 eBPF 來提供。

更多:Pipy Inside

隨著雲端運算的興起,企業的網路基礎設施迅速發展和演變。無論是公有雲、私有雲還是邊緣計算,都為企業帶來了前所未有的機會和挑戰。流量管理技術,如 CDN、隧道、WAF 等,也不斷適應新的需求和環境。涉及的網路基礎設施可達十幾種,有興趣的可以看下我們之前發表的「 」

Pipy 憑借其強大的網路編程能力,實作這些基礎設施的功能,提供一站式的流量管理。透過 「Pipy 與 eBPF 重塑系統級編程的新範式」,Pipy 可以將 eBPF 的套用擴充套件這些基礎設施。比如在服務網格中,使用 eBPF 進行容器內的流量攔截。

不只是 Pipy Inside,會是 Pipy & eBPF Inside !

關於 Flomesh

Flomesh(易衡科技)成立於 2018 年,自主研發並開源了高效能可編程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 為基礎,Flomesh 研發了軟體負載均衡、服務網格兩款軟體產品。為工信部認證的可信雲產品、可信開源計畫。

Flomesh 核心競爭力來自完全自研的核心元件 Pipy,該元件高效能、高可靠、低延遲、可編程、可延伸、低依賴,采用 C++ 開發,內建自研的 JS 引擎,支持使用 JS 指令碼做擴充套件開發。支持包括 x86、arm、龍芯、海光等硬體 CPU 架構;支持 Linux、FreeBSD、macOS、Windows、OpenWrt 等多種核心的作業系統。

Flomesh 成立以來,以技術為根基、以客戶為導向,產品被套用在頭部股份制商業銀行總行、大型保險公司、營運商總部以及研究院等眾多客戶和多個場景。

加入 Flomesh 社群

添加小 P 成為好友,參與社群互動,享受豐富互動並獲取獨家周邊禮品!

參照連結

[1] Pipy: https://github.com/flomesh-io/pipy
[2] JS 指令碼檔: https://github.com/flomesh-io/pipy/blob/main/samples/bpf/transparent-proxy/main.js
[3] GitHub 倉庫: https://github.com/flomesh-io/pipy/tree/main/samples/bpf