eBPF 和 WebAssembly:哪種虛擬機將制霸雲原生時代?

eBPF 和 WebAssembly 是當今雲原生領域最火熱的兩種虛擬機技術,又稱輕量級代碼執行沙箱。二者都能夠運行由 C、C++ 和 Rust 編譯而來的高性能字節碼程序。

然而,最大的區別在於 eBPF 在 Linux 內核中運行,而 WebAssembly 在用戶空間中運行。eBPF 有一些編程限制,使其在內核應用場景中是安全的(例如,沒有無限循環)。但這也意味着 eBPF 不是是圖靈完備的。相比之下,WebAssembly 是一種圖靈完備的語言,具有能夠打破沙盒和訪問原生 OS 庫的擴展。

一般來說,eBPF 適用於網絡或安全相關的任務,而 WebAssembly 則非常適用於商業應用。但其中有重疊。

首先,有一些在  Linux 內核中運行 WebAssembly 的嘗試。然而,基本上不太成功。eBPF 是這個應用場景下更好的選擇。

然而,WebAssembly 程序可以處理許多類內核的任務。WebAssembly 可以被 AOT 編譯成原生應用程序。CNCF WasmEdge Runtime 是一個很好的基於 LLVM 的雲原生 WebAssembly 編譯器。原生應用程序將所有沙箱檢查合併到原生庫中,這允許 WebAssembly 程序表現得像一個獨立的 unikernel “庫操作系統”。

此外,這種 AOT 編譯的沙盒 WebAssembly 應用程序可以在微內核操作系統(如 seL4)上運行,並且可以接管許多 “內核級” 任務。

雖然 WebAssembly 可以下降到內核級別,但 eBPF 也可以上升到應用程序級別。例如,服務網格代理通常支持 WebAssembly 作爲一種擴展機制。由於這些代理基本上是網絡應用程序,因此可以在 eBPF 中編寫一些擴展,以在不影響安全性和可擴展性的情況下獲得更高的性能和可擴展性。

在服務網格應用場景中,WebAssembly 非常適合  sidecar 微服務應用程序,而 eBPF 適合通過代理路由 API 流量並監控整個應用程序。

eBPF 和 WebAssembly 的興起對開發者而言是個好消息。我們有了更多的工具來管理和編程日益複雜的基礎設施。Rust 已成爲這兩種虛擬機的領先編程語言,因爲它性能強大,並且可以由 LLVM 編譯爲機器代碼,而無需額外的 runtime 支持。

所以最終,開發者只需要關心 Rust API,將 Rust 程序按照部署需要編譯成 eBPF 和 WebAssembly 即可。Rust 是正解。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/h0st6qbqSl21bsPVe6ciFw