几年前我第一次听到 WebAssembly(Wasm)时很感兴趣。我可以将用 Rust 或 C 写的代码在浏览器中运行,这让我大吃一惊。将现有的浏览器端计算从 JS 代码移植到 Rust,可以提高性能。不用说,我对这项技术抱有很高的期望。遗憾的是,由于个人情况,我还没有太多的时间和机会来进一步探索这项技术。
我参加了我的同事 Takaya Saeki 在云原生 Wasm Day 的主题演讲,这是一个关于 Wasm 当前应用的很棒的演讲,特别是在服务网格领域。Tetrate 是 Wasm Day 的钻石赞助商,这是 KubeCon EU 2021 的会前活动。
等等,什么?服务网格?我以为 Wasm 只适用于浏览器!
还不了解 Wasm 的我已经有点落伍了。他的演讲非常有启发性,让我快速了解了 Wasm 在浏览器之外的现状,特别是使用 Wasm 创建 Envoy 扩展。
现在,Wasm 带来的是创建可移植代码的能力,这意味着用不同语言编写的代码可以在各种平台上运行,Wasm 提供执行环境。不仅如此,它还提供了以下属性和好处(在其设计目标 [1] 中概述的其他属性):
• 安全:在沙盒中安全运行不受信任的代码• 开放:以一种通用的方式将程序与环境互通• 可移植:与架构无关• 多语言:由于能够从多种语言中编译出来
这些设计特点解决了以往工作中的不足之处,如 NaCI、Seccomp、本地库格式、Java 或 Lua 等语言。所有这些,同时保持前面提到的速度因素作为目标。
这些优点使 Wasm 成为甚至在浏览器以外环境中运行的软件的理想候选编译目标。这是通过其嵌入接口 [2] 实现的,该接口随后产生了 Wasm 的各种实际接口。Takaya 提到的两个案例是 WASI 和 Proxy-Wasm 嵌入式接口。在他的会议之前,我听了 Lin Clark 的演讲,他更详细地解释了 WASI[3] 和 Proxy-Wasm 嵌入接口 [4]。我的收获是,[字节码联盟](Bytecode Alliance) 的人们正在大力推动重要基元的准备工作,这将提高运行在各种云原生系统中的应用程序的安全性和性能。我很确定,这将有利于云原生生态系统。
另一方面,Proxy-Wasm 项目为社区提供了 C 和 Rust SDK,可以用来扩展 Envoy 代理功能,其中包括扩展代理的安全功能。这是通过使用 Envoy 作为参考实现,而 Wasm 提供可扩展接口来实现的。通过使用该方法,SDK 用户可以安全地操作代理流量,以增加各种功能 —— 同时保持安全、隔离的环境,以及 Wasm 启用的独立语言和动态负载的扩展。
从更高的层面来看,这为在 Istio 和 Envoy 驱动的服务网格环境中运行的应用程序创建安全扩展提供了可能。通过利用 Proxy-Wasm,人们可以开始编写 Envoy 扩展 —— 例如,创建一个自定义的 AuthN 或 AuthZ 进程,或者为特定场景创建一个自定义的日志记录器。这种创建安全扩展的能力将在未来许多组织的服务网格采用中发挥重要作用。
我不知道你怎么样,但这已经吊起了我的胃口。我迫不及待地想重新学习 Wasm,并将其用于 Envoy 相关的实验!
参考阅读
•How to get started with Envoy extensions: Wasm and GetEnvoy (article/video)[5]•A brief history of WebAssembly (video)[6]•Effortless Envoy and WASM with GetEnvoy[7]•GetEnvoy Extension Toolkit[8]•GetEnvoy Github Repository[9]•Go SDK for WebAssembly-based Envoy extensions[10]•Proxy-Wasm spec[11]
引用链接
[1]
设计目标: https://webassembly.github.io/spec/core/intro/introduction.html
[2]
嵌入接口: https://webassembly.github.io/spec/core/appendix/embedding.html
[3]
WASI: https://wasi.dev/
[4]
Proxy-Wasm 嵌入接口: https://github.com/proxy-wasm
[5]
How to get started with Envoy extensions: Wasm and GetEnvoy (article/video): https://www.tetrate.io/blog/how-to-get-started-with-envoy-extensions-wasm-and-getenvoy/
[6]
A brief history of WebAssembly (video): https://www.youtube.com/watch?v=VndErzeYgvw
[7]
Effortless Envoy and WASM with GetEnvoy: https://www.youtube.com/watch?v=mauuUWrxpdk
[8]
GetEnvoy Extension Toolkit: http://www.getenvoy.io/
[9]
GetEnvoy Github Repository: https://github.com/tetratelabs/getenvoy
[10]
Go SDK for WebAssembly-based Envoy extensions: https://github.com/tetratelabs/proxy-wasm-go-sdk
[11]
Proxy-Wasm spec: https://github.com/proxy-wasm/spec