我们有一个现有的 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
感谢任何帮助!