使用 Podman 运行 WebAssembly 工作负载
2024 年 1 月 19 日 | Alexandre Vicenzi | CC-BY-SA-3.0
WebAssembly(简称 Wasm)是一种可移植的二进制指令格式。 它因其可移植性而广受欢迎,作为一种编译目标,能够为客户端和服务器应用程序部署到 Web 上。
我们可以利用 Wasm 的可移植性,通过结合 crun 和 Podman,在 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 工作负载。 此新功能是在 Tumbleweed 的 Podman 中引入的,并且还有一个新软件包。 博客文章展示了如何使用它。
准备我们的环境
我们首先需要将 crun 安装为 Podman 的默认 OCI 运行时中的 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 容器是这种格式的可移植性的另一个例子。