使用 Wasm Filter 扩展数据面
更新时间:2026-04-21
概述
WebAssembly(简称 Wasm)是一种高效的二进制代码格式,它允许开发者将编写的指令集加载到 Envoy 过滤器链中,从而扩展服务网格的数据面能力。这种方式实现了 Envoy 核心与扩展组件之间的解耦,避免用户为了扩展功能而修改 Envoy 源代码或编译定制版本的 Envoy。此外,Wasm 还具有动态加载和运行时安全隔离等优势。本文介绍如何通过将 Wasm Filter 挂载到 ConfigMap、在命名空间级别完成注入并创建 EnvoyFilter,扩展服务网格数据面的能力。
步骤一:构建 Wasm 文件并挂载至 ConfigMap 中
- 以下以名为
wasm-example-filter.wasm的 Wasm 文件为例。 - 创建
ConfigMap,将 Wasm Filter 存储到ConfigMap中。
Bash
1# 创建名为 wasm-example-filter 的 ConfigMap,并将 wasm-example-filter.wasm 注入其中
2kubectl create cm wasm-example-filter --from-file=wasm-example-filter.wasm
步骤二:命名空间级别 Wasm 注入
- 通过
ConfigMap将 Wasm Filter 挂载到工作负载上。 - 服务网格 CSM 提供命名空间级别的 Wasm 注入能力。可以通过为命名空间添加标签
sidecar-injection-wasm-configmap={ConfigMap 文件名}的方式开启命名空间注入,将指定ConfigMap中的内容挂载到该命名空间下的所有工作负载中。文件会被挂载到istio-proxy容器的/var/local/lib/wasm-filters目录下。 - Pod 重新创建后,可以在
istio-proxy的/var/local/lib/wasm-filters目录下查看到wasm-example-filter.wasm文件。
Bash
1# 为 test 命名空间开启 Wasm 注入,将名为 wasm-example-filter 的 ConfigMap 挂载到 sidecar 容器中
2kubectl label namespace test sidecar-injection-wasm-configmap=wasm-example-filter
说明: 正在运行中的 Pod 重启后才会生效。
步骤三:创建 EnvoyFilter
- 目前已经将编译后的 Wasm 文件挂载到 sidecar 容器中,但此时 Envoy 并不知道该文件的用途。因此,需要创建
EnvoyFilterCRD 资源对象,将 Wasm Filter 添加到对应工作负载的 Envoy filter chain 中,使其生效。 - 例如,可以使用下面的配置将 Wasm 插件挂载到 Envoy 中:
YAML
1# my-envoyfilter.yaml
2apiVersion: networking.istio.io/v1alpha3
3kind: EnvoyFilter
4metadata:
5 name: my-envoyfilter
6spec:
7 workloadSelector:
8 labels:
9 app: app1 # 表示只对 app1 这个 Pod 进行过滤
10 configPatches:
11 - applyTo: HTTP_FILTER
12 match:
13 context: SIDECAR_INBOUND # 仅对入站流量进行过滤
14 listener:
15 filterChain:
16 filter:
17 name: envoy.filters.network.http_connection_manager
18 subFilter:
19 name: envoy.filters.http.router
20 patch:
21 operation: INSERT_BEFORE # 在 router 之前插入
22 value:
23 name: mydummy
24 typed_config:
25 "@type": type.googleapis.com/udpa.type.v1.TypedStruct
26 type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
27 value:
28 config:
29 configuration:
30 "@type": type.googleapis.com/google.protobuf.StringValue
31 value: dummy
32 root_id: "regex_replace"
33 vm_config:
34 code:
35 local:
36 filename: /var/local/lib/wasm-filters/wasm-example-filter.wasm
37 runtime: envoy.wasm.runtime.v8
38 vm_id: myvmdummy
- 应用上述资源对象。
Bash
1kubectl apply -f my-envoyfilter.yaml
- 至此,Wasm Filter 部署完成。
评价此篇文章
