Istio Wasm,还在用EnvoyFilter吗? 😥 保护您服务的最安全部署方法

大家好!今天,我想和大家聊聊服务网格环境中的强大武器——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模块!您的服务网格将变得更加坚固。💪



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注