使用 Podman 运行 WebAssembly 工作负载

2024 年 1 月 19 日 | Alexandre Vicenzi | CC-BY-SA-3.0

Running WebAssembly workloads with Podman

WebAssembly(简称 Wasm)是一种可移植的二进制指令格式。 它因其可移植性而广受欢迎,作为一种编译目标,能够为客户端和服务器应用程序部署到 Web 上。

我们可以利用 Wasm 的可移植性,通过结合 crunPodman,在 Linux 容器旁边运行 Wasm 工作负载。 crun 支持使用 WasmEdgeWasmtimeWasmer 运行时运行 Wasm 工作负载。 虽然 Podman 默认使用 runc,但 runccrun 可以互换使用。

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 容器是这种格式的可移植性的另一个例子。

分享此帖子