0

我们有一个现有的 GKE 集群(1.16.9-gke.6),其中一些服务与 GCP Memorystore Redis 实例通信。但是,在这些 pod 上启用 Istio(版本 1.16.3)后,我们开始看到 redis 实例的连接被拒绝错误。由于我们刚刚开始使用 Istio,我们允许来自网格内部服务的所有外部流量,使用:

meshConfig:
 outboundTrafficPolicy:
      mode: ALLOW_ANY

如此一来,所有出站流量都会按照预期和观察到的 Kiali + Istio 代理日志进入 PassthroughCluster。

另外,我可以登录到我的app容器和istio代理容器和netcat成功到redis实例。

我还尝试在我们的 helm 图表模板中为 redis 实例添加一个服务条目:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: gcp-memorystore-redis
spec:
  # note, host field is ignored for tcp
  hosts:
    - gcp-memorystore-redis
  addresses:
    - {{ .Values.redis.cidr }}
  endpoints:
    - address: {{ .Values.redis.nodeAddress }}
  ports:
    - number: 6379
      name: tcp-redis
      protocol: TCP
  resolution: STATIC
  location: MESH_EXTERNAL

但是,我继续收到连接被拒绝错误。我们使用 Redisson Java 客户端库不确定这是否重要。

作为一种解决方法,我通过使用global.proxy.includeIPRanges和 set添加我们的 cidr ip 范围来绕过 Istio 代理enableProtocolSniffingForOutbound: false,这目前可以使用,但我真的希望将其配置为 ServiceEntry,因为我最终希望我的流量通过 Egress 网关路由。

在我们的应用程序中使用 ServiceEntry 指定 redis uri/nodeAddresses 的正确格式是什么。这似乎不起作用:redis://gcp-memorystore-redis:6379

感谢任何帮助!

4

1 回答 1

1

对于来到这里的其他人,我可以通过在启动应用程序容器之前添加建议的 hack https://github.com/istio/istio/issues/11130来解决此问题。类似地在 Proxy 容器上添加一个 preStop 钩子,如上所述:https ://github.com/istio/istio/issues/7136

values:
  global:
    proxy:
      lifecycle:
          preStop:
            exec:
              command: [
                "/bin/sh", "-c",
                "while [ $(netstat -plunt | grep tcp | grep -v envoy | wc -l | xargs) -ne 0 ]; do printf 'Waiting for App Server to shutdown'; sleep 1; done; echo 'App server shutdown, shutting down proxy...'"
              ]

将来,如果/当这个 PR: https://github.com/istio/istio/pull/24737被合并时,事情会稍微不那么糟糕。

于 2020-07-17T02:05:55.957 回答