为什么我的 TCP Istio EnvoyFilter 不工作?

Why is My TCP Istio EnvoyFilter Not Working?

我正在尝试通过 Envoy 过滤器设置 TCP idleTimeout,以便外部域 some.app.com 的出站连接在空闲 5 秒后将被终止:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: listener-timeout-tcp
  namespace: istio-system
spec:
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      context: SIDECAR_OUTBOUND
      listener:
        filterChain:
          sni: some.app.com
          filter:
            name: envoy.filters.network.tcp_proxy
    patch:
      operation: MERGE
      value:
        name: envoy.filters.network.tcp_proxy
        typed_config:
          '@type': type.googleapis.com/envoy.config.filter.network.tcp_proxy.v2.TcpProxy
          idle_timeout: 5s

但是,当我尝试应用此过滤器时出现以下错误:

Error from server: error when creating "filter.yaml": admission webhook "pilot.validation.istio.io" denied the request: configuration is invalid: envoy filter: missing filters

所以,我意识到 istio 1.2.5 不支持上面的 EnvoyFilter 配置,所以我修改了配置以使用旧版本:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: tcp-idle-timeout
spec:
  workloadSelector:
    labels:
      app: mecha-dev
  filters:
    - listenerMatch:
        listenerType: SIDECAR_OUTBOUND
        listenerProtocol: TCP
      filterName: envoy.tcp_proxy
      filterType: NETWORK
      filterConfig:
        idle_timeout: 5s

修改后创建了EnvoyFilter,但似乎对出站请求没有任何影响。此外,我找不到一种方法来将此过滤器限制为仅发送到外部服务的出站请求 some.app.com.

我的 EnvoyFilter 配置中是否缺少某些内容?另外,我们可以将此过滤器限制为仅 some.app.com 吗? listenerMatch 下有 address 选项,但如果外部服务的 IP 地址不断变化怎么办?

使用的 Istio 和 EnvoyProxy 版本:

ISTIO_VERSION=1.2.5
ENVOY_VERSION=1.11.0-dev

这是一个社区维基答案。随意扩展它。

正如评论中已经讨论的那样,Istio 1.2 版尚不支持 EnvoyFilter,实际上该版本自 2019 年 12 月起不再受支持。

我强烈建议升级到最新的 Istio 和 Envoy 版本。此外,升级后请注意您要使用的过滤器名称是 deprecated and replaced。您现在应该使用 envoy.filters.network.tcp_proxy 而不是 envoy.tcp_proxy.

请记住,有些东西被弃用是有原因的,保留旧版本迟早会给您带来更多麻烦。尽量保持最新状态。

可以在 latest docs 中找到更多详细信息。