网站首页 > 技术文章 正文
WebAssembly(Wasm)最初是为浏览器创建的,现在在服务器端也越来越受欢迎。在我看来,WebAssembly 在云原生生态系统中变得流行的原因是它相对于容器的优势,包括体积更小、速度更快、安全性更强和可移植性更高。
本文我将简要介绍 WebAssembly 并解释其优势。然后我们将在后面的文章中讨论如何使用容器工具(包括低级容器运行时、高级容器运行时和 Kubernetes)执行 Wasm 模块。
什么是 WebAssembly?
WebAssembly 是一种通用的字节码技术,允许用各种语言编写的程序(如 Go、Rust 和 C/C++)被编译成字节码,可以直接在网络浏览器和服务器内部执行。
WebAssembly 是从头开始设计的,用来解决 JavaScript 的性能问题。使用 WebAssembly,开发人员可以将代码编译为低级二进制格式,以接近本机速度在现代网页浏览器中执行。
2019年3月,Mozilla 发布了 WebAssembly 系统接口(WASI),这是一个 API 规范,定义了 WebAssembly 模块与宿主环境之间的标准接口。WASI 允许 Wasm 模块安全地访问系统资源,包括网络、文件系统等。这极大地扩展了 WebAssembly 的潜力,使其不仅能够在浏览器中运行,还能在服务器上运行。
WebAssembly 的优势
WebAssembly 具有几个显着优势,超越了传统容器:
- 快速:Wasm 模块通常在毫秒内启动,比传统容器快得多,这对需要快速启动的工作负载(如无服务器函数)至关重要。
- 轻量级:与容器镜像相比,Wasm 模块通常占用更少的空间,并且需要更少的 CPU 和内存资源。
- 安全:Wasm 模块在严格的沙箱环境中运行,与底层主机操作系统隔离,减少潜在的安全漏洞。
- 可移植:Wasm 模块可以在各种平台和 CPU 架构上无缝运行,消除了为不同操作系统和 CPU 组合定制的多个容器镜像的需要。
你可以查看此表格,详细比较了 WebAssembly 和容器之间的差异:WebAssembly vs Linux Container:https://wasmedge.org/wasm_linux_container/。
在 Linux 容器中运行 Wasm 模块
在容器生态系统中执行 Wasm 模块的一种简单方法是将 Wasm 字节码合并到 Linux 容器镜像中。具体而言,容器内部的 Linux 操作系统可以被精简为仅包含支持 Wasm 运行时所需的组件。由于 Wasm 模块存储在标准容器中,它们可以与任何现有的容器生态系统无缝集成。
瘦身的 Linux 操作系统相比于常规 Linux 操作系统具有更小的攻击面。然而,这种方法仍然需要启动一个 Linux 容器。尽管 Linux 操作系统被裁剪了,但它仍然占据了容器镜像大小的 80%。
在支持 Wasm 的容器运行时中运行 Wasm 模块
将 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 都是不错的选择。有两种可能的方法:
- 一种是高级运行时仍依赖于低级运行时,调用低级运行时执行 Wasm 模块。
- 另一种方法是 containerd 有一个名为 runwasi 的子项目,可以开发一个 containerd-wasm-shim,直接与 Wasm 运行时(如 WasmEdge 和 Wasmtime)进行交互。这样 containerd 可以在不依赖低级运行时的情况下运行 Wasm 模块,而是直接调用 Wasm 运行时。这不仅缩短了调用路径,还提高了效率。
在 Kubernetes 上运行 Wasm 模块
WebAssembly 正推动云计算的第三波浪潮。作为容器编排领域的事实标准,Kubernetes 不断演进以利用 WebAssembly 带来的优势。
要在 Kubernetes 上运行 Wasm 工作负载,需要两个关键组件:
- 使用 Wasm 运行时引导的工作节点。可以通过集成高级容器运行时(如 containerd 和 CRI-O)与支持 Wasm 的低级运行时(如 crun 和 youki)来实现此设置。
- 映射到具有 WebAssembly 运行时的节点的 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 应用程序。通过结合这些技术,我们可以创建灵活、高性能、可扩展和安全的云原生应用。这种融合提供了创新的可能性,可以开发先进的无服务器架构、边缘计算解决方案,同时确保在不同环境中的兼容性和可移植性。
关于 WasmEdge
WasmEdge 是轻量级、安全、高性能、可扩展、兼容OCI的软件容器与运行环境。目前是 CNCF 沙箱项目。WasmEdge 被应用在 SaaS、云原生,service mesh、边缘计算、边缘云、微服务、流数据处理、LLM 推理等领域。
GitHub:https://github.com/WasmEdge/WasmEdge
官网:https://wasmedge.org/
??Discord 群:https://discord.gg/U4B5sFTkFc
文档:https://wasmedge.org/docs
猜你喜欢
- 2024-10-26 kubernetes1.25对接DELL分布式存储ISILON 9.4.0.14
- 2024-10-26 OpenShift 平台企业版 OCP 4.11.9 部署(基于KVM,CentOS, CoreOS)
- 2024-10-26 寻找 k3OS 替代方案?为边缘 K8s 选择容器操作系统
- 2024-10-26 Jenkins 基于 Kubernetes 的动态和静态节点
- 2024-10-26 开源容器镜像仓库工具-Harbor(开源镜像文件是什么)
- 2024-10-26 Kubernetes系列(四)Ingress(kube ingress)
- 2024-10-26 连载3の充分利用VSCODE编辑器(vscode作为文本编辑器)
- 2024-10-26 Kubernetes 集成 KubeEdge 需要注意的问题汇总
- 2024-10-26 Openshift 4.4 静态 IP 离线安装系列:准备离线资源
- 2024-10-26 教你将已越狱的iPhone还原至干净状态
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)