概述
平台的微服务治理功能是基于开源组件 Istio 实现的,为了在 Istio 的基础上扩展平台的微服务治理能力,实现更为丰富的定制化服务治理需求,平台推出了 WASM 插件管理功能。
通过 WASM 插件可以把扩展的 Envoy Filter(WASM 提供)部署到服务网格纳管的集群下相应的 Envoy 中。通过这种过滤器扩展机制,可以轻松扩展 Envoy 的功能并为其在服务网格中的应用提供更为丰富的服务治理体验。例如,当您的应用希望通过 dubbo、soap、rmi 等协议进行互相调用,或是需要为您的应用定制服务治理能力时,均可通过 WASM 插件实现。
背景信息
WASM (WebAssembly)是基于栈式虚拟机的二进制指令集,能够部署在 Web 客户端和服务端的应用中。WASM 以沙盒方式运行,通过 Proxy-Wasm(WASM 插件) 扩展 Istio 代理(Envoy)。
使用 Wasm 扩展 Envoy 具有以下几个优势:
-
敏捷性:可以用 Istio 控制平面在运行时下发和重载扩展。可以快速的进行扩展开发、测试、发布,而无需重启 Envoy。
-
可维护性:不必更改 Envoy 自身基础代码库即可扩展其功能。这也方便 Envoy 社区迁移某些内置扩展到这个模型。
-
可靠性和隔离性:WASM 提供的 Filter 部署在具有资源限制(CPU、内存)的沙箱中,因此与 Envoy 进程本身是隔离的,即使当 WASM 的 Filter 出现问题导致崩溃时,它也不会影响 Envoy 进程。
-
安全性:WASM 提供的 Filter 通过预定义 API 与 Envoy 代理进行通信,因此扩展只能访问和修改有限数量的链接或者请求属性。此外,由于 Envoy 协调整个交互,因此它可以隐藏或清除扩展中的敏感信息(例如,HTTP 头中的 Authorization 和 Cookie,或者客户端的 IP 地址)。
-
灵活性:可以将超过 30 种编程语言编译为 WebAssembly,可以让各种技术背景的开发人员都可以用他们选择的语言来编写 Envoy 扩展,例如:C++、Go、Rust、Java、TypeScript 等。
Proxy-Wasm 架构
Envoy 代理与 WASM 提供的 filter 之间的所有交互都是通过 Proxy-WASM 实现的,Proxy-WASM 的架构如下图所示。
-
提供了筛选器服务提供程序接口(SPI),用于为 filter 构建 Proxy-Wasm 插件。
-
Envoy 中嵌入了 Sandbox V8 Wasm Runtime。
-
提供了 headers、trailers 和 metadata 的 host api。
-
为 gRPC 和 HTTP 调用提供了 Call Out API。
-
提供了 Stats 和 Logging API,用于实现监控功能并统计监控指标。