Envoy Gateway 实战:使用 Wasm 扩展增强网关功能
什么是 Wasm 扩展
WebAssembly(简称 Wasm)是一种可移植、体积小、加载快且兼容性好的二进制指令格式。在 Envoy Gateway 中,Wasm 扩展允许开发者在不修改 Envoy Gateway 二进制文件的情况下,通过自定义代码来扩展网关的功能,实现对 HTTP 请求和响应的定制化处理。
Wasm 扩展的优势
- 安全隔离:Wasm 运行在沙箱环境中,与主程序隔离
- 多语言支持:可以使用 C++、Rust、AssemblyScript 或 TinyGo 等语言编写
- 热更新:无需重启网关即可更新扩展逻辑
- 高性能:接近原生代码的执行效率
准备工作
在开始之前,请确保已经完成以下准备工作:
- 已安装 Envoy Gateway 并部署示例清单
- 能够通过 HTTP 查询到示例后端服务
- 验证网关状态正常:
kubectl get gateway/eg -o yaml
Wasm 扩展类型
Envoy Gateway 支持两种类型的 Wasm 扩展:
- HTTP Wasm 扩展:从远程 URL 获取 Wasm 模块
- 镜像 Wasm 扩展:将 Wasm 模块打包为 OCI 镜像,从镜像仓库获取
实战示例:添加自定义响应头
下面我们通过一个实际例子,展示如何使用 Wasm 扩展在响应中添加自定义头 x-wasm-custom: FOO。
方法一:HTTP Wasm 扩展
这种方式直接从 HTTP URL 获取 Wasm 模块。
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyExtensionPolicy
metadata:
name: wasm-test
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: backend
wasm:
- name: wasm-filter
rootID: my_root_id
code:
type: HTTP
http:
url: https://example.com/path/to/envoy_filter_http_wasm_example.wasm
sha256: 79c9f85128bb0177b6511afa85d587224efded376ac0ef76df56595f1e6315c0
关键参数说明:
targetRefs: 指定扩展应用的目标资源name: Wasm 过滤器名称rootID: Wasm 模块的根 IDurl: Wasm 模块的下载地址sha256: 用于验证 Wasm 模块完整性的校验值
方法二:镜像 Wasm 扩展
这种方式从 OCI 镜像仓库获取 Wasm 模块。
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyExtensionPolicy
metadata:
name: wasm-test
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: backend
wasm:
- name: wasm-filter
rootID: my_root_id
code:
type: Image
image:
url: example-registry.com/testwasm:v0.0.1
配置 Wasm 扩展参数
可以通过 config 字段向 Wasm 扩展传递配置参数:
wasm:
- name: wasm-filter
rootID: my_root_id
code:
type: Image
image:
url: example-registry.com/testwasm:v0.0.1
config:
parameter1:
key1: value1
key2: value2
parameter2: value3
使用环境变量配置
Wasm 扩展还可以共享 Envoy 进程的环境变量,这在需要传递敏感信息时特别有用:
wasm:
- name: wasm-filter
rootID: my_root_id
code:
type: Image
image:
url: example-registry.com/testwasm:v0.0.1
env:
hostKeys:
- SECRET_API_KEY
- CONFIG_VALUE
验证扩展效果
应用配置后,可以通过以下命令验证扩展是否生效:
- 确保设置了
GATEWAY_HOST环境变量 - 发送测试请求:
curl -i -H "Host: www.example.com" "http://${GATEWAY_HOST}"
如果配置正确,响应中应该包含自定义头:
x-wasm-custom: FOO
清理资源
完成测试后,可以删除 Wasm 扩展策略:
kubectl delete envoyextensionpolicy/wasm-test
最佳实践
- 版本控制:为 Wasm 模块使用明确的版本标签
- 完整性校验:HTTP 方式下载时务必提供 sha256 校验值
- 性能测试:在生产环境部署前进行充分的性能测试
- 错误处理:在 Wasm 代码中实现完善的错误处理逻辑
总结
通过 Wasm 扩展,Envoy Gateway 获得了极大的灵活性,开发者可以根据业务需求定制网关行为,而无需修改核心代码。无论是简单的头部修改,还是复杂的业务逻辑,Wasm 扩展都能提供安全高效的解决方案。
希望本文能帮助你理解并开始在 Envoy Gateway 中使用 Wasm 扩展。随着 Wasm 生态的不断发展,这种扩展方式将在云原生网关领域发挥越来越重要的作用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



