【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

云原生的下一步,或从 WebAssembly 在边缘取代 Docker 开始

  • 2021-12-14
  • 本文字数:6945 字

    阅读完需:约 23 分钟

云原生的下一步,或从WebAssembly在边缘取代Docker开始

过去几年,云计算的边界不断向边缘侧延伸。作为云原生技术事实标准的 Kubernetes+容器组合,自然也被很多人考虑部署到边缘侧,以提高边缘应用部署的效率和便利性,降低边缘应用与硬件之间的耦合度。不过 Kubernetes+容器组合并非万用良药,对于边缘计算场景来说,它们还是太重了。

 

边缘设备通常硬件资源有限,没有足够的资源部署运行完整的 Kubernetes。其他问题还有:很多边缘设备基于 ARM 架构,但大部分 Kubernetes 发行版不支持 ARM 架构;边缘设备所处环境复杂,无法保证稳定可靠的网络连接,而 Kubernetes 不支持离线运行,等等。为了解决包含但不限于以上 Kubernetes 在边缘计算场景下的挑战,更好地将 Kubernetes 从云端延伸到边缘,业内已经诞生了多个基于原生 Kubernetes 优化的开源项目,比如华为开源的 KubeEdge、阿里开源的 OpenYurt、腾讯开源的 SuperEdge、Rancher 开源的 K3s 等,并且这四个项目都已经被云原生计算基金会(下文简称 CNCF)接收。

 

而传统容器方案比如 Docker,问题与 Kubernetes 类似,它还是一个相对重的容器运行时,镜像大小很容易就达到一两百 MB 以上,对于资源不足的硬件——边缘场景有不少内存和磁盘空间小于 1GB 的微型设备,Docker 也不是一个理想的选择。

 

边缘计算不仅需要更轻量的 Kubernetes,也需要更轻量、更快的容器方案,WebAssembly 就是近几年出现的一个新选择。

 

2021 年,云原生社区对 WebAssembly 的兴趣愈发浓厚,WebAssembly 在云原生方向也十分活跃。到目前为止,CNCF 已经正式接收了至少三个 WebAssembly 项目,包括:WasmEdgeRuntime,一个云原生 WebAssembly runtime;wasmCloud,一个 WebAssembly 应用程序框架;Krustlet,一个在 Kubernetes pods 中运行 WebAssembly 程序的工具。其中,WasmEdge 和 Kruslet 通过两种不同的方式,做到了让 Kubernetes 集群中的 WebAssembly 工作负载可以与传统容器(例如 containerd、Docker 和 CRI-O)并列运行,用户可以使用与管理 Docker 应用程序完全相同的工具来管理 WebAssembly 应用程序。

 

而说到 WebAssembly 最初与 Docker、云原生产生关联,就不得不提 Docker 联合创始人 Solomon Hykes 在 2019 年 3 月份发布的一条推文。他在推文中表示:如果 WASM(WebAssembly)和 WASI(WebAssembly System Interface, WASM 系统接口)在 2008 年就已经存在,那就没有必要创建 Docker 了。



这条推文在社区里引起了很大的反响,有赞同者,但更多的是质疑:WebAssembly 这个发源于浏览器的东西,怎么突然就能在服务端取代 Docker 了呢?随后 Solomon 又发布了一条推文解释道:WebAssembly 不会取代 Docker,但是可以想象未来 WebAssembly 应用容器将与 Linux 容器、Windows 容器在 Docker 中并列运行。如今,Solomon 说的未来已经成为现实,只不过他原话中的 Docker 替换成 Kubernetes 更准确。



Crun是 Kubernetes 社区里最流行的容器运行与管理工具,由红帽软件发起,一开始只支持基于 Linux 的应用容器。但最近 crun 项目已经正式支持 WasmEdge,能同时运行与管理 WasmEdge 容器镜像与 Linux 容器镜像。通过 crun 的底层支持,目前 WebAssembly 已经融入到了整个 Kubernetes 生态中,开发者可以使用 Kubernetes、Containerd、CRIO 、Docker Hub 来管理 WebAssembly 镜像。

 

那么,WebAssembly 是如何从前端走向后端的?WasmEdge 在其中扮演什么样的角色?未来在庞大的云原生生态中,WebAssembly 又会占据什么样的位置?InfoQ 近日有幸专访了 WasmEdge 项目创始人 Michael Yuan,请他跟我们聊聊他对于 WebAssembly 的思考,以及 WasmEdge 的发展历程和定位。

WebAssembly 从浏览器走向云原生

 

Michael 有一个虽然可能引发争论但很有意思的理论,他认为,后端的技术每隔十年左右总要重新发明一次轮子。1999-2000 年 Java 给后端带来了革命性的变化,十年后主角换成了 JavaScript,原本 JavaScript 一直是前端语言,但自Node.js诞生后越来越多人也在后端使用 JavaScript 了。这背后的逻辑在于,开发者需要一个轻量级且容易理解的技术,但后端类软件每发展到一定阶段之后都会变得相当复杂,这个时候就会有开发者想重造一个复杂度没那么高的新轮子出来,每十年左右就会有一个这样的周期。2019 年正好是一个新十年周期的开始,而 WebAssembly 就是 Michael 认为的这一个十年周期的新轮子,在他看来,WebAssembly 也会从前端转移到后端然后把后端革命掉。

 

WebAssembly 发源于浏览器端,最初主要设计来改善 JavaScript 的 Native 性能和代码执行效率。2019 年 12 月 5 日,WebAssembly 经过万维网联盟(W3C)推荐,与 HTML、CSS 和 JavaScript 一起,成为了 Web 的第四种语言。

 

关于 WebAssembly 技术演变过程,可查阅笔者早前策划的文章:


《WebAssembly 如何演进成为“浏览器第二编程语言”?》

 

2021 年 7 月,计算机协会编程语言特别兴趣小组将其享有盛誉的编程语言软件奖(Programming Language Software Award)颁给了 WebAssembly,高度肯定了 WebAssembly 作为“自 JavaScript 以来第一种在 Web 浏览器中广泛采用的新语言”的成就。

 

不过 Michael 认为 WebAssembly 更大的市场在后端。虽然 WebAssembly 在浏览器里确实发挥了重要作用,但没有达到“必要”的程度,“有了最好,但没有也能用”。WebAssembly 在前端完成的最重要也最有意义的一件事情,是在 Google、Apple、Mozilla、微软这样的大厂和 W3C 这样的组织联合推动下,实现了很好的标准化,这是后来的技术很难去跟 WebAssembly 竞争的地方。也正因为已经通过浏览器端做好了标准化,WebAssembly 才有可能从前端走向后端,才可能在后端做更多的事情。

 

Michael 认为现在 WebAssembly 想要解决的问题,跟它刚诞生时想要解决的问题是一致的。这个核心问题就是要在一个大型应用程序里,给开发者提供一个可以写扩展的机会。一开始是在浏览器里面可以写应用,这就是对浏览器的一种扩展,只是原来只能用 JavaScript 写,现在有了一个新方法,可以用 C++写、可以用 Rust 写,然后编译成 WebAssembly 去运行。

 

而今天的 WebAssembly 应用依然延续着这个想法。比如在边缘计算场景,或者在 SaaS 应用场景,都是有一个操作系统或应用程序,以前这个系统外部开发者是进不去的,如果要安全地运行外部开发者提交的代码,一个方法就是把代码装在 Docker 里运行。但是 Docker 又太重了,有了 WebAssembly 就可以打开一个口子,把任何一个软件都变成平台。这也是目前流行的一个大趋势,即“软件平台化”。

 

所以 WebAssembly 除了是一种编程语言,也被视作一个轻量级、快速、安全和多语言的函数“容器”,和 Docker 属于不同抽象层次。如何理解?

 

Michael 表示容器相关技术可以分为三个抽象层次,其中虚拟机是在计算机层面的抽象;应用容器如 Docker 是在操作系统层面的抽象;WebAssembly 则是在操作系统进程层面的抽象,它与 JVM、V8 都属于高级语言虚拟机,抽象程度最高。

 

在一般操作系统上面能干的事情在 Docker 里面都能干,但 WebAssembly 不是,它展现出来的是一个执行环境,只能执行编译好的字节码应用,不起操作系统的作用。所以它需要的工具链最复杂,但相应地也能带来性能的巨大提升。根据 WasmEdge 团队的测试结果,在冷启动上 WebAssembly 能做到比 Docker 快 100 倍;在执行时间上,WebAssembly 比 Docker 快 10%-50%。在 Docker 只作为执行环境的场景,即把程序写好了放到 Docker 里执行,执行完之后就关闭 Docker,没有用户互动的情况,就是 WebAssembly 能够完全取代 Docker 的一个应用场景。而边缘计算里有大量这样的场景,这也是 WasmEdge 这个开源项目瞄定的目标场景。

 

借助 WebAssembly 这样的方案,就能在边缘场景跨平台地、轻量级地、快速地用云原生理念和云原生工具去部署应用程序。Michael 表示,Kubernetes+Docker 这套方法在边缘侧推进遇到了很大阻力,而 WebAssembly 是在正确时间出现的一个正确的解决方案。

WasmEdge 的生态定位

 

最初决定要做一个 WebAssembly 方向的开源项目时,Michael 和团队成员就想好了要做 WebAssembly Runtime。当时市场上已有的 WebAssembly Runtime 都有两个问题。一个问题是都聚焦在浏览器场景,其中一个非常突出的例子是谷歌的 V8。V8 堪称工程奇迹,它是一个非常复杂、工程化程度非常高的软件,内置一个 WebAssembly Runtime。但 V8 是专为谷歌浏览器优化的,它永远不可能把里面的 WebAssembly 单拆出来,而是必须要和 JavaScript 整套绑在一起,导致体积增加了几十倍。但浏览器需要 JavaScript,后端不需要,后端需要的只是 WebAssembly 这块,但 V8 又不会把它单独拿出来。因此这类 Runtime 并不能很好地满足后端的使用需求。另一个问题是,其他的 WebAssembly Runtime 都是标准驱动的,跟随 WebAssembly 标准,在扩展方面做的不太好。

 

由于一开始团队还不能确定未来具体的应用场景,因此只是想做一个比较轻量级、易扩展、能够针对各种应用场景优化的开源 WebAssembly Runtime。最初在给项目取名字这件事上也比较随意,直接沿用了创业公司的名字 Second State,将开源项目命名为 Second State VM,即 SSVM。直到今年项目被 CNCF 纳入托管之前,由于 CNCF 要求开源项目的名字里不能有公司的商标,团队才开始考虑给项目换个名字。这时候团队对于这个项目的定位已经有了更清晰的规划,就是要将它用在应该使用 Docker 而 Docker 用不起来的地方,即把云原生这套理念和工具应用到边缘计算场景,这也是 WasmEdge 这个名字的由来。

 

如今业界已经围绕 WebAssembly 构建起了一个非常庞大的生态,Runtime 可以说是整个生态中最底层的基础设施(下图是以 WasmEdge 为例描绘的 WebAssembly 生态图)。其中最有代表性的项目包括 WasmEdge、V8、Wasmtime、WAMR 等,不同 Runtime 各有各的应用场景和优化点。

 


Runtime 提供了一个运行代码的地方,但如果每行代码都要从头写的话,对于开发者来说太麻烦了,所以开发者一般会使用框架。在 Runtime 之上还会有运行这些框架的应用服务器,这样的应用服务器在 Java 非常常见,比如 WildFly(Jboss)、ColdFusion、Apache Tomcat、Apache TomEES 等等,JavaScript 也有 Node.js 与 Deno 两个应用服务器。WebAssembly 现在已经有了 wasmCloud 与 Suborbital 两家创业公司,未来势必将涌现出更多应用服务器。

 

Runtime 之下则是各种各样的操作系统和硬件架构,每一个 WebAssembly Runtime 都会支持一些自己认为比较重要的硬件和操作系统的组合。Runtime 的东西向则是编译器和工具链,因为 WebAssembly 是字节码,就需要上游生态的支持,比如要将 Rust 编译成 WebAssembly,就需要 Rust 编译器的支持。由于标准化做得好,目前很多编译器项目和编程语言的编译器针对 WebAssembly 的编译工具链都已经有了很好的支持。

 

对于当前的 WebAssembly 生态,还有一个很多人会好奇的问题:我们需要这么多 Runtime 吗?

 

Michael 表示,现在还是需要的,因为还处在一个百花齐放的阶段,最后哪个 Runtime 能赢还不一定。他认为,从长期来看,最终 Runtime 应该会收敛为 2-3 个,从分布式集群的运维角度考虑,对于很多应用场景,特别是像区块链这样的场景,还是需要有多个 Runtime 的。

 

“其实现在市场已经收敛得差不多了,能够数得上号的 Runtime 基本也就四个:WasmEdge、Wasmtime、Wasmer 和 WAMR(WebAssembly Micro Runtime)。我觉得肯定还会继续淘汰,直到剩下最后的 2-3 个。”

 

当然还有一个可能性,就是未来所有 Runtime 都把功能做的差不多,大家都趋于标准化了。不过 Michael 表示,虽然有很多标准化的扩展,但不是每个 Runtime 都会选择去做,因为大家有不同的侧重点。还是以 V8 为例,现在很多在后端做的扩展,V8 就不想做,因为这些在浏览器场景没有意义,做了这些除了增加潜在 Bug 以外,没有什么其他好处。

 

WasmEdge 目前的重点是推动 WebAssembly 更快地整合到后端生态里面,进而往云原生和边缘计算方向走得更远、更快。前不久,团队与 FutureWei合作为 seL4 和 WasmEdge 构建了一个 WebAssembly 管理代理,使 WebAssembly 字节码应用程序能在 seL4 RTOS 上简单地被部署和执行,这样一来在如自动驾驶汽车、无人机这样的边缘设备上也可以方便地运行应用程序容器。

 

此外,如本文开头所述,crun 目前已经合并了WasmEdge的贡献,在读取容器镜像时能够自动检测它到底是用于 WasmEdge 还是 containerd/Docker,然后启动和管理相应的 runtime/容器,这样一来 WebAssembly 就能够无缝融入现有的 K8s 生态。而且开发者对此是无感知的,开发者用 WebAssembly 编写的应用程序编译后推到 Docker Hub 里面,就能用 K8s 生态中的工具直接管理了。

 

这是 WasmEdge 向边缘云原生走出的第一步,接下来团队会在边缘场景寻找更多用户案例,在得到充分验证之后,再考虑把 WebAssembly 移到数据中心来取代现有的基础设施的可能性。

取代 Docker 的可能性

 

两年前,WebAssembly 以超乎预料的发展速度闯入大家的视线,一度被视为Web新技术浪潮的主角,当时很多人认为2020 年会是一个 WebAssembly 应用百花齐放的年份。但 2020 年一场突如其来的疫情,让 WebAssembly 在很多方面的发展都放慢了脚步,不过社区并没有停下对新方向的探索和尝试。2021 年,WebAssembly 迎来了 Web 浏览器之外的爆炸性增长,尤其是在服务器端和云原生环境。

 

Michael 认为,当前 WebAssembly 正处在一个类似 Java 在 2001-2002 年的阶段。后端应用刚刚开始,虽然很多人还是会觉得这个东西可以放到后端有些奇怪,但认真研究之后也能认可这个思路是 make sense 的。大家对于 WebAssembly 的兴趣也非常浓厚,即使不一定有需求,也有很强烈的想法要试试看有什么办法可以把 WebAssembly 用起来。Michael 觉得这是一个非常有意思的阶段,“生态早期就是这样,Rust 语言一开始也是一样。就是有事没事,以前用 C++写的,现在用 Rust 重写。社区对这个东西有兴趣,然后大家都在找这个东西能有什么用。”

 

在他看来,这是一个行业发展的前奏。早期开发者可能不知道自己的应用场景是什么,但他就是要用这个技术。如果行业没有这个过程的话,就不会有人去推动技术向前走,技术其实是起不来的。这也是他看好 WebAssembly 发展的原因之一,但他同时也坦言,WebAssembly 要真正做到应用的爆发、甚至能够挣到钱,还需要一段时间。“就像在 2001-2002 年之后又过了几年,才开始有围绕 Java 的项目赚到钱。”

 

据 Michael 介绍,自从加入 CNCF 之后,WasmEdge 项目的社区活跃度有了很明显的提升。相较于在 GitHub 上有多少颗 Star,团队更看重有多少外部开发者在参与开源项目的贡献和讨论。目前 WasmEdge 社区中已经有上百个 Second State 公司以外的开发者给项目提交 Issue,贡献代码的开发者也有数十人。这其中既有来自华为、红帽、微软、蚂蚁集团等大厂的开发者,也有来自如 YOMO 这样的创业公司的开发者。

 

此外,在社区层面的合作上,现在也已经有很多基于 Kubernetes 的产品与 WasmEdge 展开合作,比如 Linkerd、KubeEdge、SuperEdge、OpenYurt 等。同样是以将云原生从数据中心延伸到边缘端为目标,KubeEdge、SuperEdge、OpenYurt 与 WasmEdge 之间其实能形成很好的互补,如果说 KubeEdge+Docker 是轻量级+重量级的解决方案,那么 KubeEdge+WasmEdge 就是轻量级+轻量级的解决方案。

 

在技术演进上,WasmEdge 不是一个标准驱动的项目,这跟同为 WebAssembly Runtime 类型的 Wasmtime 有很大的不同。WasmEdge 更多是一个由应用场景驱动的项目,即需求来自于社区伙伴在使用过程中遇到的问题,由社区来指导项目的技术研发方向,因此对于社区交流和互动也会更加看重。

 

对于 WebAssembly 在新一年的发展,Michael 做了一个相对乐观的预测。在他看来,WebAssembly 将会在边缘端得到广泛应用,今天在边缘很多想用 Docker 但又用不了的场景,会被 WebAssembly 给吃掉,尤其是在 KubeEdge 这样的框架的加持下。“在边缘端取得成功之后,它就会像农村包围城市,重新进到数据中心里面去。”

 

对于 WasmEdge,Michael 非常希望它能够使最后成功的 2 个 Runtime 中的一个。“说实话,我觉得很大概率最后会是 Wasmtime 和我们。两个项目各自聚焦不同的方向,Wastime 聚焦于 Fastly 那套和标准化,我们聚焦于满足边缘计算和边缘设备的需求。”他补充表示,WasmEdge 现在是 CNCF 的项目,而不是 Second State 的项目,Second State 只是为项目提供了一些开发者。他希望,更多对 WebAssembly 感兴趣的人能够聚合到 WasmEdge 项目里来,大家一起把这个项目建设好,最终推动 WebAssembly 生态更好的发展,这也是团队决定将项目捐赠给 CNCF 的初衷和期望。“我们第一是希望 WebAssembly 社区能做好,社区好了之后,才能够把 WasmEdge 做大,WasmEdge 做大,我们才能够有前途,这家公司才会有前途。”

 

采访嘉宾介绍:

 

Michael Yuan,毕业于德克萨斯大学奥斯汀分校,获得博士学位,在开发和商业化开源软件方面拥有丰富的经验。Michael 是 JBoss 的早期员工,被 Red Hat 收购之后,作为产品经理见证了世界上第一个成功的开源商业模式。Michael 著有 5 本国际知名出版社出版的技术书籍。2019 年 Michael 发起了 WasmEdge 项目,提供下一代云原生和边缘计算的执行环境。

 

WasmEdge 项目地址:https://github.com/WasmEdge/WasmEdge

 


每一位开源参与者、每一个开源项目都可以成为舞台上的主角。

 

新的一波开源浪潮正在席卷中国,【开源聚光灯】是 InfoQ 重点打造的开源主题栏目,旨在通过新闻、系列访谈、用户调查、迷你书、视频等形式深入观察开源运动,围绕开源的价值和开源开发模式,与投身开源的每一个个体共同探讨开源发展现状,照亮每一个开源舞台上的参与者。

 

如果你有开源故事或对开源的深刻观点想要分享、或开源项目想要寻求报道,欢迎联系微信 caifangfang842852(请注明姓名和来由)。

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2021-12-14 12:3613452
用户头像
蔡芳芳 InfoQ主编

发布了 778 篇内容, 共 488.6 次阅读, 收获喜欢 2745 次。

关注

评论 2 条评论

发布
用户头像
外国人也知道“农村包围城市”吗?

2021-12-31 10:30
回复
用户头像
不错
2021-12-28 10:36
回复
没有更多了
发现更多内容

评委拍案叫绝、项目惊喜不断,这是一届怎样的 Hackathon ?丨TiDB Hackathon 2021 回顾

PingCAP

Java开发Redis面试题分享

@零度

redis Java 开发

新能力让数据多端协同更便捷,数据跨端迁移更高效!|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

最佳实践:青藤云安全发布国内首个K8S ATT&CK攻防矩阵

青藤云安全

Golang:定时器的终止与重置

恒生LIGHT云社区

golang 定时器 语言 Go 语言

Ubuntu 基于Nginx1.8的Golang环境搭建(Ubuntu 20.04 + Nginx1.8 + Golang 1.17 )

Owen Zhang

golang nginx ubuntu

微服务分布式架构中,如何实现日志链路跟踪

华为云开发者联盟

微服务 日志 分布式架构 logback 链路跟踪

从内存管理原理,窥探OS内存管理机制

华为云开发者联盟

cpu 内存 内存管理 应用程序 OS

2021关键词:重新起航

faiting

数据结构算法 盘点 2021

发挥好数字人民币促“双碳”作用

CECBC

阿里云何川:开放兼容的云,计算巢帮助合作伙伴云化升级

阿里云弹性计算

弹性计算 年度峰会 计算巢

深入解析Kafka的offset管理

编程江湖

kafka

如何打造一款三消类游戏

Shopee技术团队

算法 前端 游戏 Shopee Candy

C语言-数组

DS小龙哥

C语言

区块链,元宇宙时代的“基础设施”

CECBC

Ubuntu LNMPR环境搭建(Ubuntu 20.04 + Nginx1.8 + PHP 7.3 + Mysql8.0 + Redis5.0)

Owen Zhang

ubuntu LNMPR

在Mac上运行Rainbond,10分钟快速安装

北京好雨科技有限公司

『征文精选』技术翻译与术语管理技术:专业人说专业话

SphereEx

数据库 翻译 ShardingSphere 征文 SphereEx

2021 OceanBase 年度报告 | 用技术让海量数据的管理和使用更简单!

OceanBase 数据库

开源 年度报告 oceanbase 成绩单

C语言-语句(if,for,while,switch,goto,return,break,continue)

DS小龙哥

C语言

城墙上的“云镜派”,如何守护云上资产安全?

白洞计划

Hadoop中mapreduce作业日志是如何生成的

华为云开发者联盟

hadoop hdfs mapreduce YARN 作业日志

C语言-函数的定义、声明、传参

DS小龙哥

C语言

Hyperf结合PhpOffice/PhpSpreadsheet实现Excel&CSV文件导出导入

Owen Zhang

php hyperf php扩展 PhpOffice/PhpSpreadsheet

缓存一致性最佳实践

得物技术

缓存 分布式 数据 一致性 实践

企业管理系统可视化权限功能设计

雯雯写代码

可视化 权限 企业管理系统

在Windows上运行Rainbond,10分钟快速安装

北京好雨科技有限公司

跨平台技术实战!百度文库跨平台技术快速落地全过程

百度Geek说

跨平台 PC 百度文库

大搜车面向复杂业务场景的研发运维体系治理实践

阿里云弹性计算

弹性计算 运维峰会 研发运维

C语言-函数的可变形参(不定形参)

DS小龙哥

C语言

抢占先机!为何说区块链通证经济象征未来?

CECBC

云原生的下一步,或从WebAssembly在边缘取代Docker开始_语言 & 开发_蔡芳芳_InfoQ精选文章