大家好!今天,我想和大家聊聊服务网格环境中的强大武器——Istio和Wasm(WebAssembly)。使用Istio,您可以控制和观察服务间的通信。如果再结合Wasm,您就可以随心所欲地扩展Envoy代理的功能。这就像在智能手机上安装您想要的应用程序一样!📱
但是,您是如何部署这些强大的Wasm模块的呢?您是否还在使用EnvoyFilter直接注入配置?当然,这是可行的,但如果操作不当,这可能是一种危险的方法,甚至可能导致整个服务瘫痪。
今天,我们将深入探讨为什么WasmPlugin资源比EnvoyFilter更安全、更明智。

💣 如同定时炸弹的方法:EnvoyFilter
EnvoyFilter是Istio中一个非常强大但难以驾驭的功能。它允许您在非常低的级别直接修改Envoy代理的配置。打个比方,这就像打开汽车引擎,直接更换零件或改变线路。🔧
为什么危险?
EnvoyFilter字面上是直接“修补(patch)”Envoy的配置(configuration dump)。在这里,一个小小的失误就可能导致整个代理停止运行,或者引发意想不到的网络故障。
- 配置复杂性: 您需要完全理解Envoy的内部配置结构。必须精确地指定Wasm过滤器应该插入到过滤器链的哪个位置,以及以何种格式插入。
- 拼写错误和结构错误: YAML配置中一个缩进错误,或者一个字段名称的拼写错误,都可能导致Istio无法正确解析配置,从而破坏整个工作负载的Envoy代理。😱
- 版本依赖性: 当Istio或Envoy版本升级,内部配置结构发生变化时,原来正常工作的EnvoyFilter可能会突然引发错误。
使用EnvoyFilter部署Wasm的示例
以下是使用EnvoyFilter注入Wasm过滤器的示例。看看代码有多么复杂和冗长。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: my-wasm-filter-example
namespace: my-app
spec:
workloadSelector:
labels:
app: my-product-api
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.wasm
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
config:
name: "my_wasm_module"
root_id: "my_root_id"
vm_config:
vm_id: "my_vm_id"
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/envoy/wasm/my_module.wasm"
configuration:
"@type": "type.googleapis.com/google.protobuf.StringValue"
value: |
{
"message": "Hello from Wasm!"
}
光是看着就让人头晕目眩,不是吗?applyTo、match、patch等需要注意的地方太多了,如果不了解Envoy的内部结构,甚至很难编写。
✨ 安全优雅的方法:WasmPlugin
为了解决EnvoyFilter的危险性和复杂性,WasmPlugin资源应运而生。WasmPlugin是为Wasm模块部署这一特定目的而创建的高级抽象API。
再次以汽车为例,这就像在设计精良的导航屏幕上设置目的地,而不是直接操作引擎。这样更简单、更安全!
为什么它安全又好用?
WasmPlugin只简洁地接收部署Wasm模块所需的信息。复杂的Envoy配置修补由Istio自动处理。
- 简单明了的API: 您只需输入Wasm模块的URL、所需的配置值等基本信息。用户无需了解Envoy的内部运作。
- 降低错误风险: 配置简单,大大减少了人为失误的可能性。Istio会在内部执行验证,防止部署错误的配置。✅
- 出色的可移植性和可重用性: WasmPlugin资源本身是独立的,可以轻松地重新应用于不同的环境或工作负载。
使用WasmPlugin部署Wasm的示例
如果用WasmPlugin实现相同的任务会怎样?请看下面的代码。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: my-wasm-plugin-example
namespace: my-app
spec:
selector:
matchLabels:
app: my-product-api
url: oci://my-registry/wasm/my_module:1.0.0
pluginConfig:
message: "Hello from Wasm!"
是不是变得难以置信地简单了?🤩
- selector: 选择要应用到哪些工作负载。
- url: 指定要部署的Wasm模块的位置(例如,OCI镜像)。
- pluginConfig: 方便地填写要传递给Wasm模块的配置。
无需复杂的patch逻辑,只需声明“部署什么(What)”,Istio就会自动处理“如何部署(How)”。
🎯 全局比较:EnvoyFilter vs. WasmPlugin
| 项目 | EnvoyFilter 😥 | WasmPlugin ✨ |
|---|---|---|
| 抽象级别 | 低(Low-level) | 高(High-level) |
| 使用目的 | 修补所有Envoy配置的通用工具 | Wasm模块部署专用 |
| 安全性 | 低(配置错误可能导致整个代理故障) | 高(提供安全抽象) |
| 复杂性 | 非常高 | 非常低 |
| 推荐使用 | 当需要WasmPlugin无法实现的特殊Envoy配置时,作为最后手段使用 | Wasm模块部署的标准和推荐方法 |
总而言之,使用EnvoyFilter部署Wasm模块就像用锤子修理手表。虽然可能,但当有更安全、更合适的工具(WasmPlugin)时,就没有必要冒险了。
为了稳定的服务运行,从现在开始,请务必使用WasmPlugin来部署Wasm模块!您的服务网格将变得更加坚固。💪
发表回复