WebAssembly(Wasm)
最初是为浏览器创建的,现在在服务器端也越来越受欢迎。在我看来,WebAssembly 在云原生生态系统中变得流行的原因是它相对于容器的优势,包括体积更小、速度更快、安全性更强和可移植性更高。
本文我将简要介绍 WebAssembly 并解释其优势。然后我们将在后面的文章中讨论如何使用容器工具(包括低级容器运行时、高级容器运行时和 Kubernetes)执行 Wasm 模块。
WebAssembly
是一种通用的字节码技术,允许用各种语言编写的程序(如 Go、Rust 和 C/C++)被编译成字节码,可以直接在网络浏览器和服务器内部执行。
WebAssembly 是从头开始设计的,用来解决 JavaScript 的性能问题。使用 WebAssembly,开发人员可以将代码编译为低级二进制格式,以接近本机速度在现代网页浏览器中执行。
2019年3月,Mozilla 发布了 WebAssembly 系统接口(WASI),这是一个 API 规范,定义了 WebAssembly 模块与宿主环境之间的标准接口。WASI 允许 Wasm 模块安全地访问系统资源,包括网络、文件系统等。这极大地扩展了 WebAssembly 的潜力,使其不仅能够在浏览器中运行,还能在服务器上运行。
WebAssembly 具有几个显着优势,超越了传统容器:
你可以查看此表格,详细比较了 WebAssembly 和容器之间的差异:WebAssembly vs Linux Container
:https://wasmedge.org/wasm_linux_container/
。
在容器生态系统中执行 Wasm 模块的一种简单方法是将 Wasm 字节码合并到 Linux 容器镜像中。具体而言,容器内部的 Linux 操作系统可以被精简为仅包含支持 Wasm 运行时所需的组件。由于 Wasm 模块存储在标准容器中,它们可以与任何现有的容器生态系统无缝集成。
瘦身的 Linux 操作系统相比于常规 Linux 操作系统具有更小的攻击面。然而,这种方法仍然需要启动一个 Linux 容器。尽管 Linux 操作系统被裁剪了,但它仍然占据了容器镜像大小的 80%。
将 Wasm 模块嵌入到 Linux 容器中的优势在于允许与现有环境无缝集成,同时也可以从 Wasm 带来的性能改进中受益。然而,与直接在支持 Wasm 的容器运行时中运行 Wasm 模块相比,这种方法效率和安全性较低。
一般来说,容器运行时可以分为两个级别:高级运行时和低级运行时。
OCI
标准的实现,可以接收一个可运行的文件系统(rootfs)和一个配置文件(config.json)来执行隔离的进程。低级容器运行时直接管理和运行容器,比如 runc、crun、youki、gvisor 和 kata。Containerd
和 CRI-O
是两个流行的高级容器运行时。我们可以在低级和高级容器运行时中启用 Wasm 支持。
通过低级容器运行时直接运行 Wasm 模块时,有几种可用的选项,如 crun
和 youki
,这些选项内置支持 Wasm。
通过高级容器运行时运行 Wasm 模块时,CRI-O
和 containerd
都是不错的选择。有两种可能的方法:
runwasi
的子项目,可以开发一个 containerd-wasm-shim
,直接与 Wasm 运行时(如 WasmEdge
和 Wasmtime
)进行交互。这样 containerd 可以在不依赖低级运行时的情况下运行 Wasm 模块,而是直接调用 Wasm 运行时。这不仅缩短了调用路径,还提高了效率。WebAssembly 正推动云计算的第三波浪潮。作为容器编排领域的事实标准,Kubernetes 不断演进以利用 WebAssembly 带来的优势。
要在 Kubernetes 上运行 Wasm 工作负载,需要两个关键组件:
containerd
和 CRI-O
)与支持 Wasm 的低级运行时(如 crun
和 youki
)来实现此设置。RuntimeClass
对象。RuntimeClass 处理 Kubernetes 集群中存在多个容器运行时的问题,某些节点可能支持 Wasm 运行时,而其他节点可能支持常规容器运行时。您可以使用 RuntimeClass 将 Wasm 工作负载专门调度到具有 Wasm 运行时的节点。要在 Kubernetes 节点上启用 Wasm 支持,可以使用 Kwasm Operator 自动化过程,而不是手动安装具有 Wasm 运行时库的容器运行时。Kwasm(https://kwasm.sh/
) 是一个 Kubernetes Operator,它会自动为您的 Kubernetes 节点添加 WebAssembly 支持。Operator 使用 kwasm-node-installer(https://github.com/KWasm/kwasm-node-installer
) 项目来修改底层 Kubernetes 节点。
WebAssembly 提供了一种快速、高效和安全的代码执行方式,而 Kubernetes 则是一个强大的容器编排平台。Cloud Native WebAssembly
在服务器和云中使用 Wasm,利用 Kubernetes 等编排工具来部署和管理 Wasm 应用程序。通过结合这些技术,我们可以创建灵活、高性能、可扩展和安全的云原生应用。这种融合提供了创新的可能性,可以开发先进的无服务器架构、边缘计算解决方案,同时确保在不同环境中的兼容性和可移植性。
原文链接:https://www.cncf.io/blog/2024/03/12/webassembly-on-kubernetes-from-containers-to-wasm-part-01/