几年前我第一次听到WebAssembly(Wasm)时很感兴趣。我可以将用Rust或C++写的代码在浏览器中运行,这让我大吃一惊。将现有的浏览器端计算从JS代码移植到Rust,可以提高性能。不用说,我对这项技术抱有很高的期望。遗憾的是,由于个人情况,我还没有太多的时间和机会来进一步探索这项技术。

我参加了我的同事Takaya Saeki在云原生Wasm Day的主题演讲,这是一个关于Wasm当前应用的很棒的演讲,特别是在服务网格领域。Tetrate是Wasm Day的钻石赞助商,这是KubeCon EU 2021的会前活动。

等等,什么?服务网格?我以为Wasm只适用于浏览器!

还不了解Wasm的我已经有点落伍了。他的演讲非常有启发性,让我快速了解了Wasm在浏览器之外的现状,特别是使用 Wasm 创建Envoy扩展。

现在,Wasm带来的是创建可移植代码的能力,这意味着用不同语言编写的代码可以在各种平台上运行,Wasm提供执行环境。不仅如此,它还提供了以下属性和好处(在其设计目标中概述的其他属性):

  • 安全:在沙盒中安全运行不受信任的代码

  • 开放:以一种通用的方式将程序与环境互通

  • 可移植:与架构无关

  • 多语言:由于能够从多种语言中编译出来

这些设计特点解决了以往工作中的不足之处,如NaCI、Seccomp、本地库格式、Java或Lua等语言。所有这些,同时保持前面提到的速度因素作为目标。

这些优点使Wasm成为甚至在浏览器以外环境中运行的软件的理想候选编译目标。这是通过其嵌入接口实现的,该接口随后产生了Wasm的各种实际接口。Takaya提到的两个案例是WASI和Proxy-Wasm嵌入式接口。在他的会议之前,我听了Lin Clark的演讲,他更详细地解释了WASIProxy-Wasm 嵌入接口。我的收获是,字节码联盟的人们正在大力推动重要基元的准备工作,这将提高运行在各种云原生系统中的应用程序的安全性和性能。我很确定,这将有利于云原生生态系统。

另一方面,Proxy-Wasm项目为社区提供了C++和Rust SDK,可以用来扩展Envoy代理功能,其中包括扩展代理的安全功能。这是通过使用Envoy作为参考实现,而Wasm提供可扩展接口来实现的。通过使用该方法,SDK用户可以安全地操作代理流量,以增加各种功能——同时保持安全、隔离的环境,以及Wasm启用的独立语言和动态负载的扩展。

从更高的层面来看,这为在Istio和Envoy驱动的服务网格环境中运行的应用程序创建安全扩展提供了可能。通过利用Proxy-Wasm,人们可以开始编写Envoy扩展——例如,创建一个自定义的AuthN或AuthZ进程,或者为特定场景创建一个自定义的日志记录器。这种创建安全扩展的能力将在未来许多组织的服务网格采用中发挥重要作用。

我不知道你怎么样,但这已经吊起了我的胃口。我迫不及待地想重新学习Wasm,并将其用于Envoy相关的实验!

参考阅读