WebAssembly (通??s寫為 Wasm) 是一種為網(wǎng)絡(luò)瀏覽器設(shè)計(jì)的低級(jí)編程語言。它旨在提供一種比傳統(tǒng)的 JavaScript 更快、更高效的方式來執(zhí)行代碼,以彌補(bǔ) JavaScript 在性能方面的不足。通過使用二進(jìn)制格式,WebAssembly 能夠提供比傳統(tǒng) JavaScript 更快的解析和執(zhí)行速度。
原文鏈接:https://forum.laf.run/d/1095
Wasm 擴(kuò)展到云原生領(lǐng)域
然而但隨著時(shí)間的發(fā)展,它的應(yīng)用范圍已經(jīng)擴(kuò)展到了云原生領(lǐng)域。相比于容器和虛擬機(jī),WebAssembly 具有以下優(yōu)勢(shì):
- 性能和安全:隨著云原生生態(tài)系統(tǒng)的發(fā)展,大家對(duì)于高性能和安全的需求日益增長(zhǎng)。WebAssembly 以其快速、安全、沙箱化的特點(diǎn),成為了一個(gè)吸引人的選擇。
- 跨平臺(tái)特性:WebAssembly 的跨平臺(tái)特性使得它非常適合云原生環(huán)境,因?yàn)樗梢栽谌魏沃С?Wasm 運(yùn)行時(shí)的環(huán)境中運(yùn)行,與底層硬件或操作系統(tǒng)均無關(guān)。
- 輕量化:相比于傳統(tǒng)的虛擬機(jī)和容器技術(shù),Wasm 提供了更輕量級(jí)的解決方案,這對(duì)于需要快速擴(kuò)展和縮放的云原生應(yīng)用尤為重要,例如函數(shù)計(jì)算場(chǎng)景。
- 微服務(wù)和邊緣計(jì)算:Wasm 適合被用于微服務(wù)架構(gòu)和邊緣計(jì)算場(chǎng)景,因?yàn)樗軌蛱峁┛焖俚膯?dòng)時(shí)間和更高的資源利用效率。
隨著技術(shù)的成熟和社區(qū)的發(fā)展,已經(jīng)有越來越多的工具和平臺(tái)被開發(fā)出來以支持在云原生環(huán)境中使用 WebAssembly,runwasi 便是其中之一。它是一個(gè) Containerd 插件,用來將 Wasm 運(yùn)行時(shí)整合到 Containerd 中,以支持使用 Containerd 來創(chuàng)建和管理 Wasm 應(yīng)用。
本文將會(huì)給大家介紹如何在 Sealos 云操作系統(tǒng)中快速集成 runwasi,并使用 runwasi 來運(yùn)行 Wasm 應(yīng)用。
?? 注意:runwasi 目前還是 Alpha 版,不建議在生產(chǎn)環(huán)境中使用。
runwasi 介紹
先來看一眼 runwasi 騷氣的 Logo:
在理解 runwasi 之前,我們先來明確幾個(gè)概念:
WebAssembly (Wasm) 運(yùn)行時(shí)
- WebAssembly 基礎(chǔ):WebAssembly 提供了一個(gè)沙箱環(huán)境,允許在其中以接近原生性能執(zhí)行預(yù)編譯的二進(jìn)制代碼。這些代碼模塊獨(dú)立于平臺(tái),能夠在任何支持 Wasm 的環(huán)境中運(yùn)行。
- Wasm 運(yùn)行時(shí):這是一個(gè)軟件棧,用于加載、驗(yàn)證、編譯,并最終執(zhí)行 Wasm 二進(jìn)制文件。例如,Wasmtime 或 Wasmer 就是這樣的運(yùn)行時(shí)。
Containerd 架構(gòu)
Containerd
是一個(gè)達(dá)到工業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí),負(fù)責(zé)容器的創(chuàng)建、啟動(dòng)、停止和管理,它的架構(gòu)被設(shè)計(jì)為模塊化,可以通過插件來擴(kuò)展其功能。這包括快照插件、運(yùn)行時(shí)插件等。runwasi 就是其中一個(gè)快照插件。
runwasi 的工作原理
-
作為插件:
runwasi
作為一個(gè)Containerd
快照插件存在,使得 Wasm 應(yīng)用能夠作為容器運(yùn)行。 -
加載 Wasm 應(yīng)用:當(dāng)
Containerd
請(qǐng)求啟動(dòng)一個(gè)容器時(shí),runwasi
插件負(fù)責(zé)加載 Wasm 應(yīng)用。 -
Wasm 運(yùn)行時(shí)集成:
runwasi
使用一個(gè) Wasm 運(yùn)行時(shí)(如 Wasmtime)來執(zhí)行 Wasm 應(yīng)用。這意味著它會(huì)處理 Wasm 二進(jìn)制文件的加載、驗(yàn)證和執(zhí)行。 -
容器化的 Wasm 應(yīng)用:通過
runwasi
,Wasm 應(yīng)用在Containerd
的管理下以類似于傳統(tǒng)容器應(yīng)用的方式運(yùn)行,但實(shí)際上是在 Wasm 運(yùn)行時(shí)中執(zhí)行。
Sealos 集成 runwasi
下面我們來演示如何在 Sealos 云操作系統(tǒng)中集成 runwasi,步驟非常簡(jiǎn)單,只需要一條命令即可。
Sealos 提供了 3 個(gè)不同的集群鏡像:labring/containerd-shim-wasmtime、labring/containerd-shim-wasmedge 和 labring/containerd-shim-wasmer,分別對(duì)應(yīng)三個(gè)不同的 Wasm 運(yùn)行時(shí):WasmEdge、Wasmtime 和 Wasmer。
以 Wasmtime 運(yùn)行時(shí)為例,只需執(zhí)行下面這條命令就可以將 runwasi 集成到 Sealos 集群中:
$ sealos run docker.io/labring/containerd-shim-wasmtime:v0.3.0
然后使用 Rust 編寫一個(gè) Wasm 應(yīng)用:
// 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");
}
}
編譯并運(yùn)行:
$ 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
這個(gè)倉庫里已經(jīng)編譯好了 wasm 文件:https://github.com/labring-actions/wasi-image/tree/main/applications/quick-start/main
你可以克隆該倉庫,進(jìn)入 applications/quick-start/main
,然后執(zhí)行以下命令構(gòu)建 wasi 鏡像并推送到 Sealos 本地鏡像倉庫:
$ sealos build --platform "wasi/wasm" -t sealos.hub:5000/quick-start:latest .
$ sealos push sealos.hub:5000/quick-start:latest
編寫一個(gè) 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 # 修改成對(duì)應(yīng)的 runtime 名字
restartPolicy: Never
創(chuàng)建 Job:文章來源:http://www.zghlxwxcb.cn/news/detail-746427.html
$ kubectl apply -f wasm-demo.yaml
查看 demo 日志:文章來源地址http://www.zghlxwxcb.cn/news/detail-746427.html
$ kubectl logs jobs/wasm
This is from a main function from a wasm module
到了這里,關(guān)于Sealos 云操作系統(tǒng)一鍵集成 runwasi,解鎖 Wasm 的無限潛力的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!