我们有一个现有的gke集群(1.16.9-gke.6),其中一些服务与gcp memorystore redis示例通信。然而,在这些pod上启用istio(版本1.16.3)之后,我们开始看到redis示例的连接被拒绝错误。由于我们刚刚开始使用istio,我们允许所有来自mesh内服务的外部通信,使用:
meshConfig:
outboundTrafficPolicy:
mode: ALLOW_ANY
这样,所有出站流量都将进入passthroughcluster,正如预期和观察到的kiali+istio代理日志一样。
另外,我可以成功地登录到我的app container和istio proxy container,netcat到redis示例。
我还尝试在我们的helm chart模板中为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
但是,我继续得到连接拒绝错误。我们使用redissonjava客户机库,不确定这是否重要。
作为一种解决方法,我通过使用添加cidr ip范围来绕过istio代理 global.proxy.includeIPRanges
并设置 enableProtocolSniffingForOutbound: false
,现在可以使用,但我真的希望将其配置为serviceentry,因为我最终希望我的流量通过出口网关路由。
使用serviceentry在应用程序中指定redisuri/nodeaddresses的正确格式是什么。这似乎不起作用: redis://gcp-memorystore-redis:6379
谢谢你的帮助!
1条答案
按热度按时间wf82jlnq1#
对于其他来这里的人,我可以通过添加黑客建议来解决这个问题https://github.com/istio/istio/issues/11130 在启动应用程序容器之前。类似地,在代理容器上添加一个prestop钩子,如前所述:https://github.com/istio/istio/issues/7136
将来,如果/当本pr:https://github.com/istio/istio/pull/24737 合并后,事情就不会那么麻烦了。