wasm

使用wasm扩展envoy

envoy wasm 介绍

WebAssembly是一种沙盒技术,可用于扩展Istio代理(Envoy)。Proxy-Wasm沙箱API取代了Mixer作为Istio中的主要扩展机制。

WebAssembly沙箱目标:

  • 效率 -扩展增加了低延迟,CPU和内存开销。

  • 功能 -扩展可以执行策略,收集遥测和执行有效载荷突变。

  • 隔离 -一个插件中的编程错误或崩溃确实会影响其他插件。

  • 配置 -使用与其他Istio API一致的API配置插件。扩展名可以动态配置。

  • Operator -可以扩展扩展并将其部署为仅日志,失败打开或失败关闭。

  • 扩展开发人员 -该插件可以用几种编程语言编写。

istio社区基于官方envoy的基础上fork 了https://github.com/istio/envoy,在wasm分支以实现istio wasm支持,当前官方envoy暂未支持wasm

架构

  • 筛选器服务提供程序接口(SPI),用于为筛选器构建Proxy-Wasm插件。

  • Envoy中嵌入了Sandbox V8 Wasm Runtime。

  • headers, trailers 和 metadata的host api。

  • 调出用于gRPC和HTTP调用的API。

  • Stats和Logging API,用于度量和监视

扩展envoy

通过js生成wasm实现envoy header的修改

代码实现

使用 solo.io提供的proxy-runtime 通过js来实现wasm逻辑

修改package.json

修改依赖为 proxy-runtime的本地路径

该示例判断配置的header value是否存在,不存在设置则添加 hello: worldheader, 设置则为 hello: configvalue 通过逻辑实现:

编译

配置envoy

我们配置了一个返回admin接口的listener,在filter中添加了我们的 add_header wasm plugin

测试访问

我们将编译好的文件通过volume挂在进容器

通过curl测试访问:

可以看到返回的header已经包含 hello: what ever you want

Last updated

Was this helpful?