You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Kubernetes工作负载配置Istio EnvoyFilter TCP代理遇阻求助

问题解决方法

你的核心问题是:当前EnvoyFilter试图往一个不存在的1234端口监听器上插入TCP代理过滤器,Istio不会自动为未声明的端口创建监听器,所以必须先显式创建这个监听器,再配置转发规则。

修正后的EnvoyFilter配置

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: psql
spec:
  workloadSelector:
    labels:
      app: psql
  configPatches:
  # 第一步:创建监听1234端口的出站监听器
  - applyTo: LISTENER
    match:
      context: SIDECAR_OUTBOUND
    patch:
      operation: ADD
      value:
        name: outbound_0.0.0.0_1234
        address:
          socket_address:
            protocol: TCP
            address: 0.0.0.0
            port_value: 1234
        filter_chains:
        - filters:
          - name: envoy.filters.network.tcp_proxy
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
              stat_prefix: db_tcp_proxy
              cluster: db_backend
  # 第二步:添加指向外部数据库的集群配置
  - applyTo: CLUSTER
    match:
      context: SIDECAR_OUTBOUND
    patch:
      operation: ADD
      value:
        name: db_backend
        type: STRICT_DNS
        connect_timeout: 0.5s
        lb_policy: ROUND_ROBIN
        load_assignment:
          cluster_name: db_backend
          endpoints:
          - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    protocol: TCP
                    address: testdb.lab.local
                    port_value: 5432

关键改动说明

  1. 新增监听器创建逻辑:第一个补丁通过applyTo: LISTENER和operation: ADD,直接创建监听0.0.0.0:1234的出站监听器,这是之前缺失的核心步骤。
  2. 合并过滤器配置:把TCP代理过滤器直接嵌入到新创建的监听器的过滤器链中,无需再用INSERT_BEFORE(因为原来没有对应监听器)。
  3. 保留原有集群配置:指向外部数据库的db_backend集群配置不变,确保流量能正确转发到目标地址。

验证步骤

  1. 应用修正后的配置:
    kubectl apply -f <your-envoyfilter-file>.yaml
    
  2. 检查监听器是否存在:
    istioctl proxy-config listener <psql-pod-name>.default | grep 1234
    
    应该能看到类似0.0.0.0:1234的监听器条目。
  3. 在容器内检查端口监听:
    kubectl exec -it <psql-pod-name> -- netstat -anp
    
    会看到istio-proxy进程正在监听1234端口。
  4. 测试数据库连接:
    kubectl exec -it <psql-pod-name> -- psql -h localhost -p 1234 -U test -W
    
    此时应该能正常连接到外部的testdb.lab.local数据库。

另外,你创建的psql Service对当前场景没有作用(因为目标是转发到外部DB,而非内部PostgreSQL实例),如果不需要可以删除。

内容的提问来源于stack exchange,提问作者Wanderer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:22:31