边缘的容器化 — WasmEdge 与 seL4

本研发基于开源项目 WasmEdge 和 seL4,并得到了Second State 和 FutureWei 的支持。

应用程序容器,例如 Docker,是云原生应用程序增长背后的关键驱动力。然而,虽然云原生开发范式已经非常流行,但由于应用程序容器需要大量计算资源,因此很难将云原生基础设施扩展到大型数据中心之外。例如,Docker 不支持实时操作系统(RTOS),仅适用于 POSIX 系统。

此外,在智能工厂和智能汽车等边缘网络和设备上,行业生态和供应商网络的现状造就了应用程序必须由多个独立供应商组装。例如,在典型的电动汽车中,有 100 多家供应商为汽车的不同部分编写软件组件。对于汽车 OEM 来说,为供应商和供应商集成其软件组件提供安全、高性能和实时的运行环境至关重要。目前,我们已经看到了几个在边缘 RTOS 上支持应用程序容器的尝试。

VxWorks 是一个领先的实时操作系统,用在使命关键的系统中,如飞机和航天飞船中。VxWorks 容器 是2021年提出的要在 VxWorks RTOS 上支持符合 OCI 的轻量级容器。

可是使用 Docker 对于边缘上的 RTOS 并不理想。从根本上说,Docker 不是实时的,Docker 假设许多底层操作系统服务是可用的。 更好的 RTOS Runtime 方案是高级字节码 VM。 这样的虚拟机比 Docker 更轻、更快。 它们提供基于能力的安全沙箱,对底层操作系统服务做很少的假设,同时在前端支持多种编程语言。 WebAssembly 凭借其广泛的行业支持和轻量级设计,看起来恰恰是复杂边缘应用程序完美的虚拟机 Runtime。

WebAssembly 另一个有意思的方面是 WebAssembly 程序通常可以像 seL4 那样进行形式化验证,因而对于像车载操作系统这种使命关键的系统来说非常合适。

WasmEdge 和 seL4

seL4 操作系统是一个形式化验证的、高度安全且实时的微内核操作系统。它现在越来越多地用于安全性和实时性能至关重要的场景,如自动驾驶汽车和无人机。 seL4 OS 是一个微内核,不符合 POSIX,这使得运行类似 Docker 的容器特别具有挑战性。 另一方面,WebAssembly 可以从大部分操作系统中抽象出来,并为开发者提供一组统一的编程语言和 SDK 以供使用。

WasmEdge Runtime 是一个高性能且开源的 WebAssembly runtime,由 CNCF 托管。它作为微服务、 serverless 函数和 plugin 用在云原生基础设施中。除了标准的 WebAssembly 规范, WasmEdge 支持与云原生应用场景相关的扩展 API,例如 network sockets,基于 Tensorflow 的推理,数据库存储等。 WasmEdge 支持 Rust 和 JavaScript 作为前端语言,可以被嵌入 Rust、Go、Python 和 Node.js host 应用作为 plugin 或者嵌入的函数。

与边缘容器应用场景最相关的是, WasmEdge 是一个符合 OCI 规范的 runtime,可以被 Docker 工具和 Kubernetes 管理和编排。本工作中我们为 seL4 和 WasmEdge 构建了一个 WebAssembly 管理代理。它允许 WebAssembly 字节码应用程序在 seL4 RTOS 上简单地被部署和执行。

官方上来讲, seL4 只支持 C/C++ 写的程序。通过 WasmEdge Runtime, 开发者现在可以使用任何 WebAssembly 语言开发 seL4 RTOS 应用程序,包括 Rust、Swift、AssemblyScript 和 JavaScript。这对于 seL4 的开发者体验来说是一个重大的提升。

源代码链接:https://github.com/second-state/wasmedge-seL4

整体设计

seL4 微内核可以作为 hypervisor 运行。它可以在同一硬件上启动 Linux 操作系统(称为 guest OS)并列运行。Linux guest OS有用于文件系统、networking、用户帐户、shell 和 CLI 的全套功能和工具,但不是实时的。 seL4 端是实时的,但是是 headless。 我们的方法是在 guest Linux 中运行 WasmEdge 代理( WasmEdge agent)。 将 WasmEdge 字节码文件上传并存储在 guest Linux 中,然后使用安装在 seL4 中的 WasmEdge runner 使用代理热部署和执行字节码。 架构如下。
边缘的容器化 — WasmEdge 与 seL4_第1张图片

这种代理和运行器架构能够将 guest Linux 的易用性与 seL4 的稳健性、安全性和实时性能相结合。

这种设计提出了一个有趣的可能性。 也许我们可以在 guest OS 中运行一个齐全完备的 Kubernetes pod 来管理和编排 seL4 上的 WasmEdge 应用程序。 这是 WasmEdge 积极研究的领域。

样本 WebAssembly 应用

WasmEdge 可以在 seL4 上运行任何 WebAssembly 字节码程序。本 demo 中的样本 WebAssembly 应用是从 C 和 Rust 源代码编译而来的。

  • nbody-c.wasm 是一个 C 语言写的算数上模仿 N-body 问题的程序。然后编译成 WebAssembly 字节码。
  • hello.wasm 是一个 Rust 程序,将字符串回显到控制台。

为 WasmEdge runner 补丁 seL4

seL4 的标准库不直接支持 WasmEdge runner。我们需要给这些库打补丁以添加、打开或更新一些重要功能。 我们使用这些补丁构建了 seL4 的定制版本。

  • 打补丁的 LLVM 编译器
  • 打补丁的 seL4 系统库
  • 打补丁的 guest Linux 库

模拟器 demo

build 脚本自动化用补丁库、WasmEdge runner、guest Linux OS (Ubuntu 20.04) 和 WasmEdge 代理构建 seL4 发行版(seL4 distribution)的过程。

build 脚本要求安装有一个带开发者工具的 Ubuntu 20.04 系统 。 点此查看系统要求的的 apt 软件包的完整列表。

一旦构建了定制的 seL4 发行版,我们就可以在 QEMU 模拟器中运行它。 我们可以登录 guest Linux OS 的命令 shell,上传并保存 WebAssembly 字节码文件,然后运行 wasmedge_emit 在 seL4 中部署和运行这些 WebAssembly 文件。

你可以根据 demo 指引完成全过程。也可以查看视频了解具体效果。

GitHub 操作日志显示成功构建任务的控制台输出,artifact 包含构建结果。 只需将 build artifact 下载到自己的 Ubuntu 20.04 机器上,就可以启动模拟器,在 seL4 上运行 WebAssembly 程序。

展望未来

本文演示了如何使用模拟器在 seL4 上管理和执行 WebAssembly 应用程序。 下一步是在真实硬件上运行 WasmEdge 应用程序。

WasmEdge 的主要特性之一是可扩展的。 从共享的原生库向 WasmEdge 添加 host function API 很容易,这样 WasmEdge WebAssembly 字节码程序可以很方便地访问硬件,例如 GPIO pin、相机、USB 连接器、I/O 板和 GPU。

请继续关注 seL4 上 WasmEdge 的更多应用场景 demo!

你可能感兴趣的:(runtime,WebAssembly,容器,运维)