作者:易立
Knative 是在 Kubernetes 基础之上的 Serverless 计算的技术框架,可以极大简化 Kubernetes 应用的开发与运维体验。在 2022 年 3 月成为 CNCF 孵化项目。Knative 由两个主要部分组成:一个是支持 HTTP 在线应用的 Knative Serving,一个是支持 CloudEvents 和事件驱动应用的 Knative Eventing。
Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时。
从 WASM、WASI 到 WAGI
WebAssembly(简称 WASM)是一个新兴的 W3C 规范。它是一个虚拟指令集体系架构(virtual ISA),其初始目标是为 C/C++等语言编写的程序,可以安全和高效地运行在浏览器中。在 2019 年 12 月,W3C 正式宣布 WebAssembly 的核心规范成为Web标准, 大大推进了 WASM 技术普及。今天,WebAssembly 已经得到了 Google Chrome、Microsoft Edge、Apple Safari、Mozilla Firefox 等流浏览器的全面支持。而更加重要的是,WebAssembly 作为一个安全的、可移植、高效率的虚拟机沙箱,可以在任何地方、任何操作系统,任何 CPU 体系架构中安全地运行应用。
Mozilla 在 2019 年提出了 WebAssembly System Interface(WASI),它提供类似 POSIX 这样的标准 API 来标准化 WebAssembly 应用与文件系统,内存管理等系统资源的交互。WASI 的出现大大拓展了 WASM 的应用场景,可以让其作为一个虚拟机运行各种类型的服务端应用。为了进一步推动 WebAssembly 生态发展,Mozilla、Fastly、英特尔和红帽公司携手成立了字节码联盟(Bytecode Alliance),共同领导 WASI 标准、WebAssembly 运行时、工具等工作。后续微软,谷歌、ARM 等公司也成为其成员。
WebAssembly 技术仍然在持续快速演进中,2022 年 4 月,W3C 公布了 WebAssembly 2.0 的第一批公共工作草案,这也成为其成熟与发展的重要标志。
WASM/WASI 作为一种新兴的后端技术,具备的的原生安全、可移植、高性能,轻量化的特点,非常适于作为分布式应用运行环境。与容器是一个一个独立隔离的操作系统进程不同,WASM 应用可以在一个进程内部实现安全隔离,支持毫秒级冷启动时间和极低的资源消耗。如下图所示:
图片来源:cloudflare
目前 WASM/WASI 还在发展初期,还有很多技术限制,比如不支持线程,无法支持低级 Socket 网络应用等等,这极大限制了 WASM 在服务器端的应用场景。社区都在探索一个能够充分适配 WASM 的应用开发模型,扬长避短。微软 Deislabs 的工程师从 HTTP 服务器发展的历史中汲取灵感,提出了 WAGI - WebAssembly Gateway Interface 项目 [ 1] 。没错 WAGI 的概念就是来自于互联网的上古传奇,CGI。
CGI 是“公共网关接口”(Common Gateway Interface)的简称,是 HTTP 服务器与其它程序进行交互的一种规范。HTTP Server 通过标准输入、输出接口