本文原发自 The New Stack
作者:Michael Yuan,WasmEdge Maintainer
原文链接:https://thenewstack.io/cloud-native-webassembly-applications-are-already-here/
2021 年 7 月,计算机协会编程语言特别兴趣小组将其享有盛誉的编程语言软件奖(Programming Language Software Award )颁给了 WebAssembly,高度肯定了 WebAssembly 作为“自 JavaScript 以来第一种在 Web 浏览器中广泛采用的新语言”的成就。而今年也标志着 WebAssembly 在 Web 浏览器之外的爆炸性增长,尤其是在服务器端和云原生环境中。
到 2021 年为止,云原生计算基金会已经正式接受了至少三个 WebAssembly 项目,包括 WasmEdge Runtime,一个云原生 WebAssembly runtime;wasmCloud,一个 WebAssembly 应用程序框架;Krustlet,一个在 Kubernetes pods 中运行 WebAssembly 程序的工具。同时,许多现有的 CNCF 项目开始采用 WebAssembly。
由于云原生社区对 WebAssembly 的兴趣日益增长, KubeCon+CloudNativeCon 于 10 月在洛杉矶举办了一场专门的 Cloud Native Wasm Day 活动。超过 300 名开发人员注册并付费参加了为期一天的活动。我(指作者)是活动的策划委员会成员,并亲自参加了活动。
活动以 Microsoft Azure 的 Ralph Squillace 和 Cosmonic 的 Liam Randall 的主题演讲开始。 Squillace 和 Randall 都是云计算老兵。他们的主题演讲讨论了云计算架构的演变,并为 WebAssembly 作为云原生 runtime 的兴起进行了背景介绍。
WebAssembly 是一个轻量级、快速、安全和多语言的函数“容器”。WebAssembly 将由 Kubernetes 和 Docker 开拓的云原生编程模式,从大型数据中心引入边缘计算和微服务领域。
从这场大会中,可以显然看出,云原生 WebAssembly 应用程序已经被各种规模的企业采用。随着应用程序的出现,我们也看到了一个蓬勃发展的框架、工具和 runtime 生态。
由于 Kubernetes 已成为所有云原生应用程序事实上的“控制面板”,因此 WebAssembly 必须被 Kubernetes 支持才能真正意义上得到采用。服务器端的云原生 WebAssembly 不仅需要 WASI 访问操作系统函数,还需要与 Kubernetes 集成。我们需要在 Kubernetes 集群中与其他容器(例如 containerd、Docker 和 cri-o)并排运行 WebAssembly 工作负载。在这次大会上,我们看到了两种领先的方法。
Krustlet 项目从 Kubernetes pod 运行 WebAssembly 项目。 Wasm day 大会上,我们看到几项使用 krustlet 的demo。同时,大会期间 Microsoft Azure AKS 宣布了一项基于 krustlet 的 WebAssembly 服务。
WasmEdge 的 crunw 项目是另一种方法。它是 Kubernetes 容器 runtime(如 runc 和 crun)的直接替代品。crunw runtime 可以自动检测容器镜像是用于 WasmEdge 还是 containerd/Docker,然后启动和管理相应的 runtime/容器。它使 WebAssembly 程序成为 Kubernetes 集群中的一等公民。
WebAssembly 程序不仅仅是由 Kubernetes 管理和控制的工作负载。他们还可以扩展 Kubernetes 本身。 SUSE 的 Rafael Fernández López 向我们介绍了 Kubewarden 项目,该项目为 Kubernetes 提供了一个基于 WebAssembly 的策略引擎。
应用程序框架构建在 Kubernetes 之上,为应用程序提供通用服务。一个很好的例子是 Dapr,它由微软创建,很快将成为 CNCF 孵化项目(翻译本文时,Dapr 已经是 CNCF 孵化项目)。 Dapr 利用 sidecar 模式为附加到这些 sidecar 的微服务应用程序提供常用服务,例如服务发现和调用、弹性重试、日志记录和跟踪、监控、秘密存储、连接安全等。这些 sidecar 应用程序(微服务)可以由 Kubernetes 管理。 Dapr 现在支持基于 WebAssembly 的 sidecar 应用程序。
wasmCloud 项目是一个基于 actor 的应用程序框架,专门为 WebAssembly 设计。来自 Red Badger 的 Stuart Harris 和 Aayush Attri 讲解了他们如何使用由 Kubernetes 管理的 wasmCloud 集群在欧洲银行内部实施大型应用程序。
服务网格建立在应用程序框架之上。它们提供附加功能,例如通过代理进行流量路由和拆分。 Envoy Proxy 是基于 WebAssembly 的服务网格扩展的早期采用者。 蚂蚁金服的 MOSN 是一个服务网格,可管理超过 200,000 台服务器的大型集群。
MOSN 团队的 Jason Song 在会上做了一个闪电演讲,讨论在服务网格中运行 WebAssembly 函数来代替传统容器。 MOSN 的代理支持 proxy-wasm 规范作为一种扩展机制。 MOSN 的 sidecar 框架,称为 Layotto,支持用 WebAssembly 编写的微服务。 Jason 现场演示了如何使用 Kubernetes 在 MOSN 和 Layotto 在电商应用中部署和管理 WebAssembly 函数。
至此,我们已经了解了 WebAssembly 在云原生基础设施中的应用。 那么业务逻辑应用呢?WebAssembly 使业务应用程序可以轻松支持第三方插件或扩展。 集中托管的云原生应用程序(例如 SaaS)可以使用 WebAssembly runtime 安全有效地执行任何用户提交的代码功能。
Suborbital 的 Connor Hicks 非常清楚地解释了为什么响应式嵌入式函数比传统的 webhooks 或“本地集成”(即定制模板)更适合扩展和定制 SaaS。 Suborbital 是一个应用程序框架,可以轻松地将 WebAssembly 函数嵌入到 SaaS 中。
Shopify 是使用嵌入 WebAssembly 函数扩展和定制相关 SaaS 的开拓者。很明显,开发者们确实希望使用 JavaScript 而不是 Rust 或 C/C++ 来编写这些函数。 Shopify 的 Saúl Cabrera 就如何在 WebAssembly 上运行和优化 JavaScript 程序进行了演讲。
此类别中,我们看到了 WebAssembly runtimes 如 WasmEdge,支持高级的JavaScript特性,例如 ES6 模块、 async 网络、 以及 Rust/JavaScript互动。
Bailey Hayes 和 Carl Sverre 讲了 SingleStore 如何使用 WebAssembly 来执行用户定义的函数嵌入到云数据库中。它允许数据存储和计算保持紧密联系,并提高效率。在他们的演讲中,该团队展示了如何在大型数据集上使用 AI 模型执行实时情感分析。
作为早期采用者,该团队还参与了标准化工作,提出了 WASI-data 规范,以支持数据库和 WebAssembly runtime 之间的标准双向通信协议。
正如 Liam Randall 在他的主题演讲中所讨论的那样,WebAssembly 的最大应用机会可能在边缘,在边缘网络和边缘设备上。
Dan Mihai Dumitriu 介绍了索尼物联网应用部门 Midokura 如何在传感器设备上部署 WebAssembly 应用程序。 WebAssembly 占用空间小和性能高,使其能够在小型设备上作为用户应用程序的安全沙箱运行。来自 Microsoft 的 Kate Goldenring 和来自伯南布哥联邦大学的 Rodrigo Farias Rodrigues Lemos 展示了 Akri,一个运行 Krustlet 的 WebAssembly 应用程序,用于发现物联网设备并将它们作为资源提供给一个 Kubernetes 集群。
实际上,CNCF 现在有至少3个 “K8s用在边缘上”的项目 KubeEdge、 SuperEdge和 OpenYurt。和刚刚提到的 K8s 集成一起,WebAssembly 在物联网设备上的未来可期。
如今的边缘网络上的一个重要应用是 AI 推理。又轻又快的 WebAssembly runtimes 能让 AI 推理计算离边缘上的传感器和数据源更近。大会中有两个演讲是和 AI 推理特别相关的。
来自 Layer5 的Shivay Lamba 和来自 Hackerrank 的 Mritunjay Sharma 讲了如何使用 WasmEdge 的 Tensorflow 和 Tensorflow Lite API 扩展来做图像识别,可以以毫秒的速度识别每个图像。该 API 对 Rust 和 JavaScript 开发者都可用。
来自微软的 Radu Matei 讨论了 WASI-NN 规范,该规范提供了一个标准 API,可以将任何 AI 推理库合并到 WebAssembly 中。 WasmEdge Tensorflow 扩展正被调整到适用 WASI-NN。
随着 WebAssembly 应用增多,开发者纷纷参与进来提高 WebAssembly 本身和相关工具。大会上有两个引人注意的 WebAssembly 生态进展: Bindle 和 Grain。
Bindle 为 WebAssembly 模块和 artifacts 提供包管理系统。 正如我们从 NPM、Docker Hub、Go 和 Rust crate 的成功所看到的,包管理可以促进协作,并使开发者能够基于彼此的工作做开发。 来自 Microsoft Azure 的 Matt Butcher 和来自 Cosmonic 的 Taylor Thomas 就 Bindle 是如何设计的以及如何使用进行了演讲。 我们期待这项重要技术得到更多地采用。
Grain 是一个 WebAssembly 优先的编程语言。 静态类型和编译型编程语言可以最有效地利用 WebAssembly 的轻量级 runtime。 但是,Rust 和 C/C++ 等静态类型语言对于初学者来说并不容易。 来自 Grain 项目的 Oscar Spencer 讨论了 Grain 如何设计为一种易于使用的编程语言,可以编译成高效的 WebAssembly 字节码。 这个项目还处于早期,但非常有潜力。
2021 年是云原生 Wasm 应用起飞的元年。随着 WebAssembly 几乎被纳入所有领先的云原生项目,我们可以看到,未来的一年, WebAssembly 应用会普遍部署在云上。 你还在等什么呢?