Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力
WebAssembly (通常縮寫為 Wasm) 是一種為網絡瀏覽器設計的低級編程語言。它旨在提供一種比傳統的 JavaScript 更快、更高效的方式來執行代碼,以彌補 JavaScript 在性能方面的不足。通過使用二進制格式,WebAssembly 能夠提供比傳統 JavaScript 更快的解析和執行速度。
原文鏈接:https://forum.laf.run/d/1095
Wasm 擴展到云原生領域
然而但隨著時間的發展,它的應用范圍已經擴展到了云原生領域。相比于容器和虛擬機,WebAssembly 具有以下優勢:
- 性能和安全:隨著云原生生態系統的發展,大家對于高性能和安全的需求日益增長。WebAssembly 以其快速、安全、沙箱化的特點,成為了一個吸引人的選擇。
- 跨平臺特性:WebAssembly 的跨平臺特性使得它非常適合云原生環境,因為它可以在任何支持 Wasm 運行時的環境中運行,與底層硬件或操作系統均無關。
- 輕量化:相比于傳統的虛擬機和容器技術,Wasm 提供了更輕量級的解決方案,這對于需要快速擴展和縮放的云原生應用尤為重要,例如函數計算場景。
- 微服務和邊緣計算:Wasm 適合被用于微服務架構和邊緣計算場景,因為它能夠提供快速的啟動時間和更高的資源利用效率。
隨著技術的成熟和社區的發展,已經有越來越多的工具和平臺被開發出來以支持在云原生環境中使用 WebAssembly,runwasi 便是其中之一。它是一個 Containerd 插件,用來將 Wasm 運行時整合到 Containerd 中,以支持使用 Containerd 來創建和管理 Wasm 應用。
本文將會給大家介紹如何在 Sealos 云操作系統中快速集成 runwasi,并使用 runwasi 來運行 Wasm 應用。
?? 注意:runwasi 目前還是 Alpha 版,不建議在生產環境中使用。
runwasi 介紹
先來看一眼 runwasi 騷氣的 Logo:
在理解 runwasi 之前,我們先來明確幾個概念:
WebAssembly (Wasm) 運行時
- WebAssembly 基礎:WebAssembly 提供了一個沙箱環境,允許在其中以接近原生性能執行預編譯的二進制代碼。這些代碼模塊獨立于平臺,能夠在任何支持 Wasm 的環境中運行。
- Wasm 運行時:這是一個軟件棧,用于加載、驗證、編譯,并最終執行 Wasm 二進制文件。例如,Wasmtime 或 Wasmer 就是這樣的運行時。
Containerd 架構
Containerd 是一個達到工業標準的容器運行時,負責容器的創建、啟動、停止和管理,它的架構被設計為模塊化,可以通過插件來擴展其功能。這包括快照插件、運行時插件等。runwasi 就是其中一個快照插件。
runwasi 的工作原理
-
作為插件:
runwasi作為一個Containerd快照插件存在,使得 Wasm 應用能夠作為容器運行。 -
加載 Wasm 應用:當
Containerd請求啟動一個容器時,runwasi插件負責加載 Wasm 應用。 -
Wasm 運行時集成:
runwasi使用一個 Wasm 運行時(如 Wasmtime)來執行 Wasm 應用。這意味著它會處理 Wasm 二進制文件的加載、驗證和執行。 -
容器化的 Wasm 應用:通過
runwasi,Wasm 應用在Containerd的管理下以類似于傳統容器應用的方式運行,但實際上是在 Wasm 運行時中執行。
Sealos 集成 runwasi
下面我們來演示如何在 Sealos 云操作系統中集成 runwasi,步驟非常簡單,只需要一條命令即可。
Sealos 提供了 3 個不同的集群鏡像:labring/containerd-shim-wasmtime、labring/containerd-shim-wasmedge 和 labring/containerd-shim-wasmer,分別對應三個不同的 Wasm 運行時:WasmEdge、Wasmtime 和 Wasmer。
以 Wasmtime 運行時為例,只需執行下面這條命令就可以將 runwasi 集成到 Sealos 集群中:
$ sealos run docker.io/labring/containerd-shim-wasmtime:v0.3.0
然后使用 Rust 編寫一個 Wasm 應用:
// hello.rs
use std::thread::sleep;
fn main() {
loop {
sleep(std::time::Duration::from_secs(5));
println!("{}", "This is from a main function from a wasm module");
}
}
編譯并運行:
$ rustup target add wasm32-wasi
$ rustc quick-start.rs --target wasm32-wasi
$ wasmtime quick-start.wasm
This is from a main function from a wasm module
這個倉庫里已經編譯好了 wasm 文件:https://github.com/labring-actions/wasi-image/tree/main/applications/quick-start/main
你可以克隆該倉庫,進入 applications/quick-start/main,然后執行以下命令構建 wasi 鏡像并推送到 Sealos 本地鏡像倉庫:
$ sealos build --platform "wasi/wasm" -t sealos.hub:5000/quick-start:latest .
$ sealos push sealos.hub:5000/quick-start:latest
編寫一個 Job 配置清單:
# wasm-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: wasm-demo
spec:
template:
metadata:
labels:
app.kubernetes.io/name: wasm-demo
spec:
containers:
- name: wasm-demo
image: sealos.hub:5000/quick-start:latest
runtimeClassName: runwasi-wasmtime # 修改成對應的 runtime 名字
restartPolicy: Never
創建 Job:
$ kubectl apply -f wasm-demo.yaml
查看 demo 日志:
$ kubectl logs jobs/wasm
This is from a main function from a wasm module
總結
以上是生活随笔為你收集整理的Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将强化学习引入NLP:原理、技术和代码实
- 下一篇: .NET6中的await原理浅析