EnvoyFilter

EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 来修改某些字段的值,添加特定的过滤器,甚至添加全新的 listener、cluster 等。这个功能必须谨慎使用,因为不正确的配置可能破坏整个网格的稳定性。与其他 Istio 网络对象不同,EnvoyFilter 是累加应用。对于特定命名空间中的特定工作负载,可以存在任意数量的 EnvoyFilter。这些 EnvoyFilter 的应用顺序如下:配置根命名空间中的所有 EnvoyFilter,其次是工作负载命名空间中的所有匹配 EnvoyFilter。

注意一

该 API 的某些方面与 Istio 网络子系统的内部实现以及 Envoy 的 xDS API 有很深的关系。虽然 EnvoyFilter API 本身将保持向后兼容,但通过该机制提供的任何 Envoy 配置应在 Istio 代理版本升级时仔细审查,以确保废弃的字段被适当地删除和替换。

注意二

当多个 EnvoyFilter 被绑定到特定命名空间的同一个工作负载时,所有补丁将按照创建顺序处理。如果多个 EnvoyFilter 的配置相互冲突,则其行为将无法确定。

注意三

要将 EnvoyFilter 资源应用于系统中的所有工作负载(sidecar 和 gateway)上,请在 config 根命名空间中定义该资源,不要使用 workloadSelector。

示例

下面的例子在名为 istio-config 的根命名空间中声明了一个全局默认的 EnvoyFilter 资源,在系统中的所有 sidecar 上添加了一个自定义的协议过滤器,用于 outbound 端口 9307。该过滤器应在终止 tcp_proxy 过滤器之前添加,以便生效。此外,它为 gateway 和 sidecar 的所有 HTTP 连接设置了 30 秒的空闲超时。

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-protocol
  namespace: istio-config # 如在 meshConfig 资源中定义的。
spec:
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      context: SIDECAR_OUTBOUND # 将会匹配所有 sidecar 中的所有 outbound listener
      listener:
        portNumber: 9307
        filterChain:
          filter:
            name: "envoy.filters.network.tcp_proxy"
    patch:
      operation: INSERT_BEFORE
      value:
        # 这是完整的过滤器配置,包括名称和 typed_config 部分。
        name: "envoy.config.filter.network.custom_protocol"
        typed_config:
         ...
  - applyTo: NETWORK_FILTER # HTTP 连接管理器是 Envoy 的一个过滤器。
    match:
      # 省略了上下文,因此这同时适用于 sidecar 和 gateway。
      listener:
        filterChain:
          filter:
            name: "envoy.filters.network.http_connection_manager"
    patch:
      operation: MERGE
      value:
        name: "envoy.filters.network.http_connection_manager"
        typed_config:
          "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
          common_http_protocol_options:
            idle_timeout: 30s

下面的例子启用了 Envoy 的 Lua 过滤器,用于处理所有到达 bookinfo 命名空间中的对 reviews 服务 pod 的 8080 端口的 HTTP 调用,标签为 app: reviews。Lua 过滤器调用外部服务internal.org.net:8888,这需要在 Envoy 中定义一个特殊的 cluster。该 cluster 也被添加到 sidecar 中,作为该配置的一部分。

下面的例子覆盖了 SNI 主机 app.example.comistio-system 命名空间的 ingress gateway 的监听器中的 HTTP 连接管理器的某些字段(HTTP 空闲超时和X-Forward-For信任跳数)。

下面的例子插入了一个产生 istio_operationId 属性的 attributegen 过滤器,该属性被 istio.stats fiter 消费。filterClass:STATS 对这种依赖关系进行编码。

下面的例子在 myns 命名空间中插入了一个 http ext_authz 过滤器。

myns 命名空间中的一个工作负载需要访问一个不接受初始元数据的不同 ext_auth服务器。由于 proto merge 不能删除字段,下面的配置使用 REPLACE 操作。如果你不需要继承字段,REPLACE 比 MERGE 更适合。

下面的例子为所有 inbound 的 sidecar HTTP 请求部署了一个 Wasm 扩展。

关于 EnvoyFilter 配置的详细用法请参考 Istio 官方文档

参考

最后更新于

这有帮助吗?