雲原生 WebAssembly 現在發展到哪一步了?

WASM中文社群發表於2021-11-05
本文作者:Michael Yuan,WasmEdge Maintainer

2021 年 7 月,計算機協會程式語言特別興趣小組將其享有盛譽的程式語言軟體獎(Programming Language Software Award )頒給了 WebAssembly,高度肯定了 WebAssembly 作為“自 JavaScript 以來第一種在 Web 瀏覽器中廣泛採用的新語言”的成就。而今年也標誌著 WebAssembly 在 Web 瀏覽器之外的爆炸性增長,尤其是在伺服器端和雲原生環境中。

到 2021 年為止,雲原生計算基金會已經正式接受了至少三個 WebAssembly 專案,包括 WasmEdge Runtime,一個雲原生 WebAssembly runtime;wasmCloud,一個 WebAssembly 應用程式框架;Krustlet,一個在 Kubernetes pods 中執行 WebAssembly 程式的工具。同時,許多現有的 CNCF 專案開始採用 WebAssembly。

由於雲原生社群對 WebAssembly 的興趣日益增長, KubeCon+CloudNativeCon 於 10 月在洛杉磯舉辦了一場專門的 Cloud Native Wasm Day 活動。超過 300 名開發人員註冊並付費參加了為期一天的活動。我(指作者)是活動的策劃委員會成員,並親自參加了活動。

活動以 Microsoft Azure 的 Ralph SquillaceCosmonicLiam Randall 的主題演講開始。 Squillace 和 Randall 都是雲端計算老兵。他們的主題演講討論了雲端計算架構的演變,併為 WebAssembly 作為雲原生 runtime 的興起進行了背景介紹。

WebAssembly 是一個輕量級、快速、安全和多語言的函式“容器”。WebAssembly 將由 Kubernetes 和 Docker 開拓的雲原生程式設計模式,從大型資料中心引入邊緣計算和微服務領域。

從這場大會中,可以顯然看出,雲原生 WebAssembly 應用程式已經被各種規模的企業採用。隨著應用程式的出現,我們也看到了一個蓬勃發展的框架、工具和 runtime 生態。

Kubernetes

由於 Kubernetes 已成為所有云原生應用程式事實上的“控制皮膚”,因此 WebAssembly 必須被 Kubernetes 支援才能真正意義上得到採用。伺服器端的雲原生 WebAssembly 不僅需要 WASI 訪問作業系統函式,還需要與 Kubernetes 整合。我們需要在 Kubernetes 叢集中與其他容器(例如 containerd、Docker 和 cri-o)並排執行 WebAssembly 工作負載。在這次大會上,我們看到了兩種領先的方法。

Krustlet 專案從 Kubernetes pod 執行 WebAssembly 專案。 Wasm day 大會上,我們看到幾項使用 krustlet 的demo。同時,大會期間 Microsoft Azure AKS 宣佈了一項基於 krustlet 的 WebAssembly 服務。

WasmEdgecrunw 專案是另一種方法。它是 Kubernetes 容器 runtime(如 runc 和 crun)的直接替代品。crunw runtime 可以自動檢測容器映象是用於 WasmEdge 還是 containerd/Docker,然後啟動和管理相應的 runtime/容器。它使 WebAssembly 程式成為 Kubernetes 叢集中的一等公民。

WebAssembly 程式不僅僅是由 Kubernetes 管理和控制的工作負載。他們還可以擴充套件 Kubernetes 本身。 SUSE 的 Rafael Fernández López 向我們介紹了 Kubewarden 專案,該專案為 Kubernetes 提供了一個基於 WebAssembly 的策略引擎。

應用框架

應用程式框架構建在 Kubernetes 之上,為應用程式提供通用服務。一個很好的例子是 Dapr,它由微軟建立,很快將成為 CNCF 孵化專案(翻譯本文時,Dapr 已經是 CNCF 孵化專案)。 Dapr 利用 sidecar 模式為附加到這些 sidecar 的微服務應用程式提供常用服務,例如服務發現和呼叫、彈性重試、日誌記錄和跟蹤、監控、祕密儲存、連線安全等。這些 sidecar 應用程式(微服務)可以由 Kubernetes 管理。 Dapr 現在支援基於 WebAssembly 的 sidecar 應用程式

wasmCloud 專案是一個基於 actor 的應用程式框架,專門為 WebAssembly 設計。來自 Red Badger 的 Stuart Harris 和 Aayush Attri 講解了他們如何使用由 Kubernetes 管理的 wasmCloud 叢集在歐洲銀行內部實施大型應用程式。

服務網格建立在應用程式框架之上。它們提供附加功能,例如通過代理進行流量路由和拆分。 Envoy Proxy 是基於 WebAssembly 的服務網格擴充套件的早期採用者。 螞蟻金服的 MOSN 是一個服務網格,可管理超過 200,000 臺伺服器的大型叢集。

MOSN 團隊的 Jason Song 在會上做了一個閃電演講,討論在服務網格中執行 WebAssembly 函式來代替傳統容器。 MOSN 的代理支援 proxy-wasm 規範作為一種擴充套件機制。 MOSN 的 sidecar 框架,稱為 Layotto,支援用 WebAssembly 編寫的微服務。 Jason 現場演示瞭如何使用 Kubernetes 在 MOSN 和 Layotto 在電商應用中部署和管理 WebAssembly 函式。

SaaS 中的嵌入函式

至此,我們已經瞭解了 WebAssembly 在雲原生基礎設施中的應用。 那麼業務邏輯應用呢?WebAssembly 使業務應用程式可以輕鬆支援第三方外掛或擴充套件。 集中託管的雲原生應用程式(例如 SaaS)可以使用 WebAssembly runtime 安全有效地執行任何使用者提交的程式碼功能。

Suborbital 的 Connor Hicks 非常清楚地解釋了為什麼響應式嵌入式函式比傳統的 webhooks 或“本地整合”(即定製模板)更適合擴充套件和定製 SaaS。 Suborbital 是一個應用程式框架,可以輕鬆地將 WebAssembly 函式嵌入到 SaaS 中。

Shopify 是使用嵌入 WebAssembly 函式擴充套件和定製相關 SaaS 的開拓者。很明顯,開發者們確實希望使用 JavaScript 而不是 Rust 或 C/C++ 來編寫這些函式。 Shopify 的 Saúl Cabrera 就如何在 WebAssembly 上執行和優化 JavaScript 程式進行了演講。

此類別中,我們看到了 WebAssembly runtimes 如 WasmEdge,支援高階的JavaScript特性,例如 ES6 模組async 網路、 以及 Rust/JavaScript互動。

Bailey Hayes 和 Carl Sverre 講了 SingleStore 如何使用 WebAssembly 來執行使用者定義的函式嵌入到雲資料庫中。它允許資料儲存和計算保持緊密聯絡,並提高效率。在他們的演講中,該團隊展示瞭如何在大型資料集上使用 AI 模型執行實時情感分析。

作為早期採用者,該團隊還參與了標準化工作,提出了 WASI-data 規範,以支援資料庫和 WebAssembly runtime 之間的標準雙向通訊協議。

AI 和物聯網

正如 Liam Randall 在他的主題演講中所討論的那樣,WebAssembly 的最大應用機會可能在邊緣,在邊緣網路和邊緣裝置上。

Dan Mihai Dumitriu 介紹了索尼物聯網應用部門 Midokura 如何在感測器裝置上部署 WebAssembly 應用程式。 WebAssembly 佔用空間小和效能高,使其能夠在小型裝置上作為使用者應用程式的安全沙箱執行。來自 Microsoft 的 Kate Goldenring 和來自伯南布哥聯邦大學的 Rodrigo Farias Rodrigues Lemos 展示了 Akri,一個執行 Krustlet 的 WebAssembly 應用程式,用於發現物聯網裝置並將它們作為資源提供給一個 Kubernetes 叢集。

實際上,CNCF 現在有至少3個 “K8s用在邊緣上”的專案 KubeEdgeSuperEdgeOpenYurt。和剛剛提到的 K8s 整合一起,WebAssembly 在物聯網裝置上的未來可期。

如今的邊緣網路上的一個重要應用是 AI 推理。又輕又快的 WebAssembly runtimes 能讓 AI 推理計算離邊緣上的感測器和資料來源更近。大會中有兩個演講是和 AI 推理特別相關的。

來自 Layer5 的Shivay Lamba 和來自 Hackerrank 的 Mritunjay Sharma 講了如何使用 WasmEdge 的 Tensorflow 和 Tensorflow Lite API 擴充套件來做影像識別,可以以毫秒的速度識別每個影像。該 API 對 RustJavaScript 開發者都可用。

來自微軟的 Radu Matei 討論了 WASI-NN 規範,該規範提供了一個標準 API,可以將任何 AI 推理庫合併到 WebAssembly 中。 WasmEdge Tensorflow 擴充套件正被調整到適用 WASI-NN。

生態創新

隨著 WebAssembly 應用增多,開發者紛紛參與進來提高 WebAssembly 本身和相關工具。大會上有兩個引人注意的 WebAssembly 生態進展: BindleGrain

Bindle 為 WebAssembly 模組和 artifacts 提供包管理系統。 正如我們從 NPM、Docker Hub、Go 和 Rust crate 的成功所看到的,包管理可以促進協作,並使開發者能夠基於彼此的工作做開發。 來自 Microsoft Azure 的 Matt Butcher 和來自 Cosmonic 的 Taylor Thomas 就 Bindle 是如何設計的以及如何使用進行了演講。 我們期待這項重要技術得到更多地採用。

Grain 是一個 WebAssembly 優先的程式語言。 靜態型別和編譯型程式語言可以最有效地利用 WebAssembly 的輕量級 runtime。 但是,Rust 和 C/C++ 等靜態型別語言對於初學者來說並不容易。 來自 Grain 專案的 Oscar Spencer 討論了 Grain 如何設計為一種易於使用的程式語言,可以編譯成高效的 WebAssembly 位元組碼。 這個專案還處於早期,但非常有潛力。

展望未來

2021 年是雲原生 Wasm 應用起飛的元年。隨著 WebAssembly 幾乎被納入所有領先的雲原生專案,我們可以看到,未來的一年, WebAssembly 應用會普遍部署在雲上。 你還在等什麼呢?

相關文章