eBPF 和 WebAssembly:哪個雲原生VM更好?

banq發表於2021-12-16

當今雲原生世界中兩個最熱門的輕量級程式碼執行沙箱/VM 是eBPFWebAssembly。它們都執行從 C、C++ 和 Rust 編譯的高效能位元組碼程式。
然而,最大的區別在於: eBPF 在 Linux 核心中執行,而 WebAssembly 在使用者空間中執行。
eBPF 有一些程式設計限制,使其在核心用例中是安全的(例如,沒有無限迴圈)。但這也意味著 eBPF 是圖靈不完整的。另一方面,WebAssembly 是一種圖靈完備的語言,具有打破沙盒和訪問原生 OS 庫的擴充套件。
一般來說,eBPF 適用於網路或安全相關的任務,而 WebAssembly 則非常適用於商業應用。但肯定有重疊。
首先,已經有案例努力在Linux 核心中[url=https://link.medium.com/HAUbDlHM4ib]執行 WebAssembly[/url]。然而,他們在很大程度上是不成功的。eBPF 是這個用例的更好選擇。
然而,WebAssembly 程式可以處理許多類似核心的任務。WebAssembly 可以被 AOT 編譯成原生應用程式。基於 LLVM 的雲原生 WebAssembly 編譯器的一個很好的例子是來自CNCFWasmEdge Runtime。本機應用程式將所有沙箱檢查合併到本機庫中。這允許 WebAssembly 程式表現得像一個獨立的 unikernel “庫作業系統”。
此外,這種 AOT 編譯的沙盒 WebAssembly 應用程式可以在微核心作業系統上執行,例如seL4,並且可以接管許多“核心級”任務。
雖然 WebAssembly 可以下降到核心級別,但 eBPF 也可以上升到應用程式級別。例如,服務網格代理通常支援WebAssembly 作為擴充套件機制。由於這些代理基本上是網路應用程式,因此可以在 eBPF 中編寫一些擴充套件,以在不影響安全性和可擴充套件性的情況下獲得更高的效能和可觀察性。
在服務網格用例中,WebAssembly 非常適合sidecar 微服務應用程式,eBPF 適合透過代理路由 API 流量並監控整個應用程式。
eBPF 和 WebAssembly 的興起對開發人員來說是個好訊息。我們有更多的工具來管理和程式設計日益複雜的基礎設施。Rust 已成為這兩種虛擬機器的領先程式語言,因為它具有高效能,並且可以由 LLVM 編譯為機器程式碼,而無需額外的執行時支援。

相關文章