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

时间:2021-04-28 07:07:33

标签: kubernetes istio envoyproxy istio-sidecar

我正在尝试通过 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 吗? address 下有 listenerMatch 选项,但如果外部服务的 IP 地址不断变化怎么办?

使用的 Istio 和 EnvoyProxy 版本:

ISTIO_VERSION=1.2.5
ENVOY_VERSION=1.11.0-dev

1 个答案:

答案 0 :(得分:1)

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

如评论中所述,Istio 1.2 版尚不支持 EnvoyFilter,实际上该版本自 2019 年 12 月起不再受支持。

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

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

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