策划 | 蔡芳芳
“容器已成为新常态,WebAssembly 是未来。”
—— CNCF 2022 年年度调查紧张创造

本文原文为 CNCF 委托 Second State 撰写,中文译文译者为 Miley Fu 和 Vivian Hu,均在 Second State 事情。
原文作者:Chris Aniszczyk、Vivian Hu 、Michael Yuan
原文链接:
https://www.cncf.io/blog/2023/09/06/introducing-the-wasm-landscape/
WebAssembly(Wasm) 最初是为了在网页浏览器中运行编译的 C/C++ 代码而创建的一个安全沙箱,但它正在做事器端得到越来越多的关注和发展势头。在云端,Wasm 供应了一个轻量、快速、安全、跨措辞、跨平台的运用程序运行时,可用于各种由用户提交的事情负载。它正在快速成为云原生技能栈的一个关键部分。
随着 Wasm 在云原生项目、产品和做事中的采取,CNCF 与 Wasm 社区互助创建了一个 Wasm 生态全景图,以更好地理解 Wasm 生态的范围。正如最初的云原生全景图帮助勾画了环绕云原生技能的大量生态,我们相信随着生态的发展和增长,Wasm 也须要同样的全景图。
Wasm 全景图初版在 WasmCon 会议上发布,包括 11 个种别和 120 个项目或产品,代表总经济代价 594 亿美元。Wasm 全景图分为两大领域:Dev(运用程序开拓)和 Ops(运用程序支配)。
Wasm 全景图链接:https://landscape.cncf.io/wasm
运用程序开拓Wasm 运用程序开拓须要自己的编程措辞和干系工具生态,例如编译器、框架、库、工具和运行时。
编程措辞当开拓者创建运用程序时,他们从选择一种编程措辞开始!
Wasm 的特点之一是它能够运行用各种不同编程措辞编写的运用程序。然而,这并不虞味着所有编程措辞都是平等的。
事实上,Wasm 全景图中有 4 类编程措辞。
编译措辞一等公民是可以直接编译为 Wasm 字节码并在 Wasm 运行时运行而无需任何依赖的措辞。C 、 C++ 、 Zig 和 Rust 都属于这一组。他们生产最快和最小的 Wasm 运用程序。
让我们以 Rust 为例。安装 Rust 措辞后,你所须要做的便是添加 wasm32-wasi 目标。
托管 (Managed) 措辞托管措辞仍旧是编译措辞。但编译器输出须要“托管运行时”才能正常运行。托管运行时最常见的任务是垃圾网络(或 GC)。
对付 Kotlin 和 Dart 这样的措辞,Wasm GC 功能就足够了。WasmEdge、Wasmtime 和 v8 等领先的 Wasm 运行时最近添加了 Wasm GC 支持。
对付 Go 来说,编译器将必要的运行时二进制文件嵌入到编译后的 Wasm 字节码中。这增加了 Wasm 运用程序的大小,但仍旧供应了良好的开拓者体验。
对付繁芜的托管措辞,例如 Java 和 .Net (例如 C#),我们须要将它们的托管运行时(例如 JVM)与 Wasm 中的字节码运用程序一起编译和运行。这常日是一种不轻量的方法。
脚本措辞JavaScript、Ruby、PHP 和 Python 等脚本措辞也可以在 Wasm 中运行。这里的方法是将脚本措辞阐明器(常日用 C 编写)编译为 Wasm。然后基于 Wasm 的阐明器程序就可以实行脚本了。
例如, VMware Labs 的 WebAssembly Laungage Runtimes 项目已将 Python 和 PHP 阐明器移植到 Wasm。
WasmEdge QuickJS 项目供应了一个 JavaScript 阐明器以及一个支持 JavaScript 中的 node.js API 的 Wasm 库。
来源:WasmEdge QuickJS 文档
“编译为 Wasm”的措辞
末了但并非最不主要的是针对 Wasm 目标进行优化的新一代编译措辞。他们仍处于非常早期的阶段。但如果做得好,他们有潜力成为 Wasm 全景图中真正的一等公民。
Moonbit 和 Grain 是该种别中的两个领先示例。它们采取 Go 和 Rust 中的当代措辞功能进行设计,并针对高效的 Wasm 编译和实行进行了优化。
Moonbit 虽然还处于早期阶段,但它配备了从动态代码补全到在线 IDE 的一整套工具。
运行时一旦源代码被编译成 Wasm 字节码,你将须要 Wasm 运行时来实行它们。Wasm 运行时供应了常日与 Wasm 干系的所有功能和优点,例如沙箱安全性、速率和跨平台可移植性。它们位于全景图的中央。
在这个云原生 Wasm 全景图中,我们将重点关注做事器端盛行的 Wasm 运行时。我们有 WasmEdge (CNCF 沙箱)、 Wasmtime/lucet 、 Wamr、 WAVM 、Wasmer、 wasm3 、 Lunatic 、 wazero 、 Wasmer 和 V8 。
WasmEdge(CNCF 沙箱)是一个轻量级、高性能且可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中央化运用程序。Wasmtime 是一个独立的仅用于 WebAssembly 和 WASI 的 wasm 优化运行时。WebAssembly Micro Runtime (WAMR) 是一种轻量级的独立 WebAssembly (Wasm) 运行时,具有占用空间小、高性能和高度可配置的功能,适用于从嵌入式、物联网、边缘到可信实行环境 (TEE)、智能合约、云原生等运用程序。WAVM 是一个 WebAssembly 虚拟机,设计用于非浏览器运用程序。Wasm3 是一个快速的 WebAssembly 阐明器和最通用的 WASM 运行时。Lunatic 是一个受 Erlang 启示的 WebAssembly 运行时。wazero 是一个用 Go 编写的符合 WebAssembly 的阐明器。Wasmer 是一个 WebAssembly 运行时,使轻量级容器能够在任何地方运行。V8 是 Google 开源的高性能 JavaScript 和 WebAssembly 实行引擎。运用框架
Wasm 运行时类似于操作系统。库和框架为运用程序开拓者供应了所需的高等且易于利用的组件。
WasmEdge 运行时的独特之处在于它支持超出 Wasm 标准的高等 POSIX API,它许可许多盛行的 Rust 和 JS 运用程序框架,例如 tokio、hyper、reqwest、warp、node.js,以及 MySQL / Postgres / Redis / Kafka /ElasticSearch 客户端库,在 WasmEdge 中运行。然而,对付所有其他 Wasm 运行时,运用程序框架须要供应基本功能,例如 HTTP / HTTPS 网络和数据库访问。
在全景图的这部分中,我们涵盖了 Spin、WasmCloud (CNCF 沙箱)、SpiderLightning、 WasmEdge plug-ins、Dapr SDK for WasmEdge、Homestar、Ambient、WASIX、Extism、Timecraft、vscode-wasm 和 WasmEx 。
Spin 是一个盛行的运用程序框架和组件库,用于构建 WebAssembly 微做事和 Web 运用程序。它与 wasmtime 运行时一起利用。WasmCloud 许可利用 WebAssembly 参与者和能力供应者进行大略、安全、分布式运用程序开拓。SpiderLightning 是一组 WIT 接口,它抽象了分布式运用程序能力和运行时 CLI,用于运行利用这些能力的 Wasm 运用程序。虽然 WasmEdge 支持用于 HTTP 和数据库访问的盛行 Rust 运用程序框架,但它还可以通过支持 TLS 网络、zlib、OpenCV、ffmpeg、PyTorch、Tensorflow 和大型措辞模型 (LLM) 推理等框架和库的 plugin 来进一步补充。用于 WasmEdge 的 Dapr SDK 是用 Rust 实现的实验性 Dapr SDK。它许可基于 WasmEdge 的微做事通过 Dapr sidecar 访问 100 多个企业做事。Homestar 是 IPVM 的 Rust 实现和运行时。Ambient 是一个用于构建高性能多人游戏和 3D 运用程序的运行时,由 WebAssembly、Rust 和 WebGPU 供应支持。WASIX 是 WASI 的超集。Extism 是通用插件系统。由 WebAssembly 供应支持。Timecraft 是一个软件运行时,它实行具有沙箱、任务编排和韶光旅行能力的 WebAssembly 模块。vscode-wasm 是一个 WASI 实现,它利用 VS Code 的扩展主机作为实现 API。Wasmex 是针对 Elixir 的快速、安全的 WebAssembly 和 WASI 运行时。边缘 / 裸金属
Wasm 的一个关键特性是跨平台可移植性,这意味着能够跨不同操作系统和 CPU 架构实行相同的字节码运用程序。在 JVM 时期,操作系统仅限于类 Unix 系统(例如 Linux)、Windows 和 MacOS。然而,Wasm 可以在边缘和物联网打算中常用的非传统系统上运行。
Docker 和 Linux 容器从来都不是跨平台的。例如,容器镜像必须与主机 CPU 匹配。
Genode 是一个免费的开源的软件操作系统 (OS) 框架,由微内核抽象层和一组用户空间组件组成。SeL4 RTOS 是高可靠、高性能的操作系统微内核,经由全面的形式化验证,且不影响性能。Flatcar Container Linux 是一个轻量级、精简版的 Linux 发行版,专为容器设计。它是 Wasm 运行时的绝佳 host。Unikraft 是一个快速、安全且开源的 Unikernel 开拓套件。AI 推理
随着人工智能事情负载在云数据中央越来越受欢迎,Wasm 越来越多地用作重量级、繁芜且缓慢的 Python 堆栈的替代方案。WASI NN 规范定义了 Wasm 运行时应如何与本机 AI/ML 库(例如 PyTorch 和 TensorFlow)交互,以利用 Rust 等高性能措辞进行 AI 推理。
Wasmtime、WasmEdge 和 WAMR 是支持 WASI NN 的 Wasm 运行时。
例如,WasmEdge 运行时支持 OpenVINO 、 Pytorch 、 Tensorflow 、 TensorFlow Lite 和 MMGL/Llama2 作为推理后端,以及 OpenCV 、 ffmpeg 作为预处理器或后处理器。同时也支持 mediapipe、document AI、llama2 等多种模型。
嵌入式函数Wasm 可以安全地实行用户定义或社区贡献的代码作为软件产品中的嵌入式函数(或插件)。
在 Wasm 全景图的这一部分中,我们展示了选择并集成 Wasm 作为插件机制的软件产品。最长的种别是数据库和数据流运用程序,个中的 Wasm 用于实行用户定义函数(UDF)。
Libsql、OpenGauss 和 Singlestore 等数据库以及 Open Policy Agent、InfinyOn、YoMo、eKuiper 和 Redpanda 等行列步队正在利用 Wasm 来实行 UDF。Envoy、Istio、APISIX、KubeWarden 和 NGINX 等流量代理正在利用 Wasm 在数据平面中实行自定义逻辑。OpenFunction 和 Knative 等 FaaS 平台许可将 Wasm 函数嵌入到 Kubernetes Pod 中。
Libsql 是 SQLite 的开源、开放贡献分支。它的目标是将 SQLite 带入做事器端。OpenGauss 是一款高性能、高安全、高可靠的企业级开源关系数据库。SingleStore 是分布式 SQL 数据库,旨在为数据密集型运用程序供应支持。Open Policy Agent 是一个开源的通用策略引擎。InfinyOn 是可组合的统一数据流平台。YoMo 是一个开源流媒体 serverless 框架,用于构建低延迟地理分布式系统。eKuiper 是一款边缘轻量级物联网数据剖析 / 流媒体软件。Redpanda 是一个大略、强大且经济高效的流数据平台,它与 Kafka® API 兼容,同时肃清了 Kafka 的繁芜性。Envoy 是一个开源边缘和做事代理,专为云原生运用程序而设计。Istio 是一个开源做事网格,可以透明地分层到现有的分布式运用程序上。Apache APISIX 是一个动态、实时、高性能的 API 网关。Kubewarden 是 Kubernetes 的策略引擎。其义务是简化策略即代码的采取。Nginx 是一个 Web 做事器,也可以用作反向代理、负载均衡器、邮件代理和 HTTP 缓存。OpenFunction 是一个云原生开源 FaaS(函数即做事)平台。工具链
末了,开拓者依赖工具将措辞、框架、库和运行时拼凑成事情运用程序。工具链的成熟度是衡量全体开拓者生态成熟度的主要指标。在 Wasm 全景图,我们先容了用于构建 Wasm 运用程序的主要工具。
Cargo:从 Rust 源代码构建 Wasm 运用程序。它供应了当代的依赖管理工具和源代码 repo。LLVM:理论上,任何有 LLVM 后真个措辞都可以编译成 Wasm。Binaryen:WebAssembly 的编译器和工具链根本举动步伐库Emscripten:利用 LLVM 和 Binaryen 将 C 和 C++ 编译为 WebAssembly 。wasm-pack:将 Rust 编译为 Wasm,可以在浏览器中或 Node.js 中与 JavaScript 交互wasm-bindgen:促进 Wasm 模块和 JavaScript 之间的高等交互Wabt:WebAssembly 的一套工具,包括 wat2wasm、wasm2wat、wasm2c 等。Witc:编译器为 .wit 文件天生代码Wit bindgen:WIT 和组件模型的客户措辞绑定天生器Asyncify :一个 JavaScript 包装器,旨在与 Binaryen 的 Asyncify 功能一起利用。运用程序支配
创建 Wasm 运用程序后,下一步是在生产中支配和扩展它。云原生全景图中有大量的工具、框架和做事来管理运用程序支配。个中许多都集成了 Wasm 支持。
编排与管理Wasm 容器可以通过 Docker、containerd 和 Kubernetes 等现有容器工具进行无缝管理。有两种方法可以将 Wasm 运用程序作为“容器”进行管理。这两种方法都可以让你构建并走运行 Linux 容器和 Wasm 容器的 Kubernetes 集群。
方法 #1 是在容器管理堆栈的根本上利用 OCI 运行时,例如 crun 和 youki 。crun 根据镜像的目标操作系统和 CPU 平台检测 OCI 镜像是 wasm 还是 Linux。如果镜像的目标是 wasi/wasm,crun 将绕过 Linux 容器设置过程,只利用 WasmEdge 来运行它。基于 crun,我们可以得到全体 Kubernetes 堆栈来运行 Wasm 镜像,包括 CRI-O (CNCF 项目)、 containerd(CNCF 项目) 、Podman、kind、K8s (CNCF 项目)、 OpenYurt (CNCF 项目)、 SuperEdge (CNCF 项目)、 KubeEdge (CNCF 项目)。
方法 #2 是利用 containerd-shim(例如 runwasi )在 containerd 中运行 Wasm 运用程序。当 containerd 吸收到镜像时,它会检讨镜像的目标平台,如果镜像是 wasi/wasm,它会路由到 runwasi 实行,如果镜像是 x86 或 arm,它会路由到 runc。
在 Kubernetes 的根本上,我们还先容了一些新兴工具来帮助管理生产 Wasm 事情负载。
Kuasar 是另一个支持多种类型沙箱的容器运行时,包括 microVM、Linux 容器、运用程序内核和 WebAssembly 运行时。
Kwasm 是一个 Kubernetes Operator,它为你的 Kubernetes 节点添加了 WebAssembly 支持。它可与基于 Ubuntu/Debian 和 Containerd 确当地和托管云 K8s 发行版合营利用,
container2wasm 是一个容器到 wasm 镜像转换器,可以在 WASM 上运行容器。
托管(Hosted)平台如果你不想麻烦地运行自己的做事器和 Kubernetes 集群,那么托管平台是将 Wasm 运用程序支配和扩展为做事的绝佳选择。
Flows.network 是一个用于 AI 原生事情流程自动化的 serverless Wasm 平台。Fermyon Cloud 是支配和管理利用 Spin 框架编写的 serverless Wasm 函数。Cosmonic 是支配在 WasmCloud 上的基于 Wasm 的 Actor 做事。Cloudflare Workers 是 Cloudflare 边缘网络上由 v8 支持的 Wasm 和 JavaScript serverless 函数运行时。Fastly @Edge Function 是支配在 Fastly 边缘网络上的 serverless Wasm 函数平台。AKS:支持在 Azure Kubernetes Service (AKS) 中创建 WASI 节点池以运行 WebAssembly (WASM) 事情负载Taubyte 是一个用于运行运用程序的云原平生台,尤其是 Wasm 运用程序。Golem Cloud 是一个打算平台,许可开拓者在 Wasm 中构建和支配长期运行、有状态的 serverless 事情线程。去中央化平台
基于区块链的智能合约平台是去中央化的云打算网络。你的云运用程序(即智能合约)不是由中央 Operator 运行所有事情负载,而是由网络中的节点实行。由于智能合约不受信赖并且必须非常频繁地实行(每台打算机每秒数百次),因此 Wasm 是该运用处景的空想实行引擎。事实上,险些所有领先的智能合约区块链网络都采取了 Wasm。
PolkadotNEARDfinityGEARFilecoinRippleEOSCosmWasmQuai Network调试和可不雅观测性
调试和可不雅观测性是主要的生产功能,使运维团队能够持续监控运用程序并向开拓团队供应有用的反馈。这是 Wasm 全景图中目前有所缺少的部分。我们估量这个领域会随着 Wasm 越来越多地支配在生产中而成长壮大。
WASI logging 是用于发出日志的 Wasm 规范。它得到领先的 Wasm 运行时(例如 wasmtime 和 WasmEdge)的支持。Modsurfer 为运营和开拓团队供应了第一个记录系统 + 诊断运用程序,用于搜索、浏览、验证、审核和调查 Wasm 二进制文件。Artifacts
Artifacts repo 是全景图中的主要元素。它们供应集中且始终可用的位置来存储、创造、验证、下载、跟踪多个已发布版本的 Wasm 包。它们不仅是便利的工具,而且对付软件供应链安全也至关主要。
Docker Hub 是创建、管理和交付团队容器运用程序的地方。如果你在 Docker Hub 上上传纯 Wasm 镜像,则镜像的操作系统 / 架构将被标记为 wasi/wasm。Harbor 是一个开源的可信云原生 registry 项目,用于存储、署名和扫描内容。它支持 Wasm 工件。Warg 是一个 WebAssembly 组件 registry。wapm 是 WebAssembly 的包管理器。crates.io 是 rust 的 crate registry,它是最常用的 Wasm 措辞。帮助我们构建 Wasm 全景图
Wasm 全景图是社区的努力,随着 Wasm 采取的兴起,Wasm 全景图也在快速发展。我们打算随时更新最新进展。然而,我们只有在全体 Wasm 社区的帮助下才能做到这一点。
如果有任何想要添加或更新的内容,请提交 PR!
可以参考此 PR 添加你的项目名称、logo、网站、GitHub repo 链接和 crunchbase。
Wasm 全景图提交 PR 参考链接:https://github.com/cncf/landscape/pull/3475
本文转载来源:
https://www.infoq.cn/article/hpFZUbqEe90LsT6iXbB9