第 14 章:在请求路径上扩展 Istio

本文系统梳理了 Istio 在请求路径上扩展能力的核心原理与实践,涵盖 Envoy 过滤器链、EnvoyFilter 配置、Lua/Wasm 扩展等,帮助开发者实现自定义流量治理和协议增强。

Envoy 过滤器链与扩展机制

Envoy 作为 Istio 数据平面的核心代理,采用监听器(Listener)+ 过滤器链(Filter Chain)架构。每个监听器可配置多个网络过滤器(如 HTTP Connection Manager),而 HTTP Connection Manager 内部又可串联多个 HTTP 过滤器,实现请求/响应的多阶段处理。

常见 HTTP 过滤器包括 CORS、CSRF、防护、外部授权、速率限制、Lua、Wasm、Router 等。用户可通过 C++、Lua、Wasm 等方式自定义扩展,满足业务定制需求。

图 1: Envoy 过滤器链结构
图 1: Envoy 过滤器链结构

使用 EnvoyFilter 资源扩展数据平面

Istio 的 EnvoyFilter 资源允许用户直接修改底层 Envoy 配置,实现高级流量治理和协议增强。典型场景包括:

  • 注入 Tap 过滤器实现流量采样与调试
  • 配置速率限制、外部授权等高级功能
  • 插入自定义 Lua/Wasm 过滤器

注意事项:EnvoyFilter 属于高级用法,需熟悉 Envoy 配置结构,错误配置可能导致数据面异常。

Tap 过滤器调试示例

通过 EnvoyFilter 注入 Tap 过滤器,可采样 webapp 服务流量:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: tap-filter
  namespace: istioinaction
spec:
  workloadSelector:
    labels:
      app: webapp
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          portNumber: 8080
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.tap
          typed_config:
            "@type": "type.googleapis.com/envoy.extensions.filters.http.tap.v3.Tap"
            commonConfig:
              adminConfig:
                configId: tap_config

应用后可通过 15000 端口动态配置采样规则,实时抓取请求数据,便于调试和排障。

全局速率限制与外部服务集成

Envoy 支持通过 HTTP 过滤器调用外部速率限制服务(RLS),实现全局限流。典型流程:

  • 部署 Redis + ratelimit 服务,配置限流规则
  • 通过 EnvoyFilter 配置 HTTP 路由的 rate_limits 动作
  • 按请求头等属性分组限流,实现多租户、分级限流等场景
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: catalog-ratelimit-actions
  namespace: istioinaction
spec:
  workloadSelector:
    labels:
      app: catalog
  configPatches:
    - applyTo: VIRTUAL_HOST
      match:
        context: SIDECAR_INBOUND
        routeConfiguration:
          vhost:
            route:
              action: ANY
      patch:
        operation: MERGE
        value:
          rate_limits:
            - actions:
                - header_value_match:
                    descriptor_value: gold_request
                    headers:
                      - name: "x-loyalty"
                        exact_match: gold

Lua 过滤器实现自定义逻辑

Lua 过滤器允许在请求/响应路径上动态注入脚本,实现灵活的头部处理、A/B 测试、协议转换等。典型用法:

  • 在 envoy_on_request/envoy_on_response 中操作头部、调用外部服务
  • 通过 httpCall 实现异步请求
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: webapp-lua-extension
  namespace: istioinaction
spec:
  workloadSelector:
    labels:
      app: httpbin
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
        listener:
          portNumber: 80
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.lua
          typed_config:
            "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
            inlineCode: |
              function envoy_on_request(request_handle)
                -- 调用外部服务并添加头部
                local headers, test_bucket = request_handle:httpCall(
                  "bucket_tester",
                  {
                    [":method"] = "GET",
                    [":path"] = "/",
                    [":scheme"] = "http",
                    [":authority"] = "bucket-tester.istioinaction.svc.cluster.local",
                    ["accept"] = "*/*"
                  }, "", 5000)
                request_handle:headers():add("x-test-cohort", test_bucket)
              end

WebAssembly (Wasm) 动态扩展

Wasm 过滤器支持用 C++、Rust、AssemblyScript、TinyGo 等多语言开发高性能扩展模块,动态加载到 Envoy,无需重建代理。典型流程:

  • 使用 meshctl/wasme 工具初始化、构建、发布 Wasm 模块
  • 通过 WasmPlugin 资源声明式加载到目标工作负载
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: httpbin-wasm-filter
  namespace: istioinaction
spec:
  selector:
    matchLabels:
      app: httpbin
  pluginName: add_header
  url: oci://webassemblyhub.io/ceposta/istioinaction-demo:1.0

Wasm 适合实现高性能、复杂协议解析、深度包检测等场景,支持多语言开发和沙箱安全。

实践建议与常见问题

  • EnvoyFilter 适合高级定制,需充分测试和版本兼容性验证
  • Lua 适合轻量级逻辑,Wasm 适合高性能和复杂扩展
  • 速率限制、外部授权等需结合后端服务高可用设计
  • 建议逐步引入扩展,监控数据面稳定性

总结

  • Istio 支持通过 EnvoyFilter、Lua、Wasm 等机制灵活扩展数据平面能力
  • 可实现流量采样、速率限制、协议增强、A/B 测试等多种场景
  • 建议结合实际需求选择扩展方式,关注可维护性与性能影响

参考文献

  1. Envoy 官方文档 - envoyproxy.io
  2. Istio EnvoyFilter 说明 - istio.io
  3. Envoy Lua 过滤器 - envoyproxy.io
  4. WebAssembly Hub - webassemblyhub.io
  5. Envoy Wasm 扩展 - envoyproxy.io

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区