WebAssembly (通常缩写为 Wasm) 是一种为网络浏览器设计的低级编程语言。它旨在提供一种比传统的 JavaScript 更快、更高效的方式来执行代码,以弥补 JavaScript 在性能方面的不足。通过使用二进制格式,WebAssembly 能够提供比传统 JavaScript 更快的解析和执行速度。

Wasm 扩展到云原生领域

然而但随着时间的发展,它的应用范围已经扩展到了云原生领域。相比于容器和虚拟机,WebAssembly 具有以下优势:

  1. 性能和安全:随着云原生生态系统的发展,大家对于高性能和安全的需求日益增长。WebAssembly 以其快速、安全、沙箱化的特点,成为了一个吸引人的选择。
  2. 跨平台特性:WebAssembly 的跨平台特性使得它非常适合云原生环境,因为它可以在任何支持 Wasm 运行时的环境中运行,与底层硬件或操作系统均无关。
  3. 轻量化:相比于传统的虚拟机和容器技术,Wasm 提供了更轻量级的解决方案,这对于需要快速扩展和缩放的云原生应用尤为重要,例如函数计算场景。
  4. 微服务和边缘计算:Wasm 适合被用于微服务架构和边缘计算场景,因为它能够提供快速的启动时间和更高的资源利用效率。

随着技术的成熟和社区的发展,已经有越来越多的工具和平台被开发出来以支持在云原生环境中使用 WebAssembly,runwasi 便是其中之一。它是一个 Containerd 插件,用来将 Wasm 运行时整合到 Containerd 中,以支持使用 Containerd 来创建和管理 Wasm 应用。

本文将会给大家介绍如何在 Sealos 云操作系统中快速集成 runwasi,并使用 runwasi 来运行 Wasm 应用。

runwasi 介绍

先来看一眼 runwasi 骚气的 Logo:

Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力-LMLPHP

在理解 runwasi 之前,我们先来明确几个概念:

WebAssembly (Wasm) 运行时

  • WebAssembly 基础:WebAssembly 提供了一个沙箱环境,允许在其中以接近原生性能执行预编译的二进制代码。这些代码模块独立于平台,能够在任何支持 Wasm 的环境中运行。
  • Wasm 运行时:这是一个软件栈,用于加载、验证、编译,并最终执行 Wasm 二进制文件。例如,Wasmtime 或 Wasmer 就是这样的运行时。

Containerd 架构

Containerd 是一个达到工业标准的容器运行时,负责容器的创建、启动、停止和管理,它的架构被设计为模块化,可以通过插件来扩展其功能。这包括快照插件、运行时插件等。runwasi 就是其中一个快照插件。

runwasi 的工作原理

  1. 作为插件runwasi 作为一个 Containerd 快照插件存在,使得 Wasm 应用能够作为容器运行。
  2. 加载 Wasm 应用:当 Containerd 请求启动一个容器时,runwasi 插件负责加载 Wasm 应用。
  3. Wasm 运行时集成runwasi 使用一个 Wasm 运行时(如 Wasmtime)来执行 Wasm 应用。这意味着它会处理 Wasm 二进制文件的加载、验证和执行。
  4. 容器化的 Wasm 应用:通过 runwasi,Wasm 应用在 Containerd 的管理下以类似于传统容器应用的方式运行,但实际上是在 Wasm 运行时中执行。

Sealos 集成 runwasi

下面我们来演示如何在 Sealos 云操作系统中集成 runwasi,步骤非常简单,只需要一条命令即可。

以 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
11-15 11:17