使用 Podman 运行 WebAssembly 工作负载
2024-01-21 | Poplar at twilight | CC-BY-SA-4.0
WebAssembly(缩写为 Wasm)是一种可移植的二进制指令格式。它作为一种支持在Web 上部署客户端和服务器应用程序的编译目标的可移植性而广受欢迎。
我们可以通过结合 crun
和 Podman,利用 Wasm 的可移植性与 Linux 容器一起运行 Wasm 工作负载。crun
支持使用 WasmEdge、Wasmtime 或 Wasmer 运行时运行 Wasm 工作负载。虽然 Podman 使用为 runc
,但 runc
和 crun
可以互换使用。
WasmEdge 是一个轻量级、高性能且可扩展的 WebAssembly 运行时,适用于云原生和边缘应用程序。WasmEdge 最近被添加到 openSUSE Tumbleweed 中,如果我们启用 crun
中的一项实验功能,就能在容器上支持 Wasm 工作负载。
现在,我们在 openSUSE Tumbleweed 中拥有了 WasmEdge,并且 crun
实验支持 Wasm 工作负载,我们可以在 Podman 上运行 WebAssembly 工作负载。
准备环境
我们首先需要在 Podman 的默认 OCI 运行时中将 crun
安装为 runc
。
zypper in crun
安装 crun 后,检查是否有 Wasm 支持。
$ crun -v
crun version 1.9
commit: a538ac4ea1ff319bcfe2bf81cb5c6f687e2dc9d3
rundir: /run/user/1000/crun
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
在上面的输出中,我们可以看到 crun
支持 WasmEdge (+WASM:wasmedge
)。
准备应用
我们将用 Rust 创建一个简单的 “Hello” 应用程序。
首先,确保安装了 Rust 和 WasmEdge。
zypper in rust wasmedge
现在让我们用 Rust 创建 “Hello” 应用程序。
$ cargo new hello --bin
$ cd hello
将 src/main.rs
中的消息更改为 Hello WebAssembly!
或你想要的任何其他消息。
现在让我们编译我们的应用程序,但目标机器将是 Wasm。
$ cargo build --target wasm32-wasi
我们现在可以执行刚刚编译的二进制文件并检查它是否按预期工作。
$ wasmedge run target/wasm32-wasi/debug/hello.wasm
Hello WebAssembly!
你已成功构建 Wasm 应用程序。
创建 Wasm 容器
有了 Wasm 二进制文件,我们将其添加到容器中。
创建一个名为 Containerfile
的文件并向其中添加以下内容:
FROM scratch
COPY target/wasm32-wasi/debug/hello.wasm /
CMD ["/hello.wasm"]
让我们使用 Buildah 构建 Wasm 容器。
$ buildah build --platform=wasi/wasm -t hello-wasm .
现在你应该有一个 Wasm 容器了。
运行 Wasm 工作负载
让我们使用 Podman 运行 Wasm 容器。
$ podman run --rm hello-wasm
Hello WebAssembly!
太棒了,我们有一个可用的 Wasm 容器。
结论
WebAssembly 是一个相当新的话题,但它已经获得了很多关注,因为你可以重复使用你已经知道或使用的大部分内容,并轻松地移植应用程序。
运行原生 Wasm 容器是这种格式的可移植性的另一个例子。
原文:Running WebAssembly workloads with Podman,作者:Alexandre Vicenzi