EKS容器(Istio Sidecar)连接ElastiCache Redis Cluster 5.0遇MOVED循环错误求助
解决Istio Sidecar下连接ElastiCache Redis Cluster的MOVED错误循环问题
嘿,这个问题我之前帮朋友排查过,其实核心原因就是Redis Cluster的重定向机制和Istio Sidecar的路由规则没匹配上。咱们先理清楚为啥会出现MOVED循环,再一步步解决。
为啥会出现MOVED循环?
Redis Cluster的配置端点只是个入口,当你客户端连上去后,集群会返回MOVED指令,让客户端去连接具体的分片主节点或副本节点。但你现在只给配置端点加了ServiceEntry和VirtualService,Istio的Sidecar根本不知道那些分片节点的存在——客户端收到MOVED后想连新节点,Sidecar直接拦下来了,自然就陷入循环了。
一步步解决问题
1. 先把所有ElastiCache节点的域名找全
你得把Redis Cluster里所有节点的域名都列出来,包括:
- 你已经配置的那个配置端点
- 分片的主节点域名
- 分片的两个副本节点域名
最简单的方式是去AWS控制台的ElastiCache页面,找到你的集群,查看“节点”标签页就能看到所有节点的端点。或者用AWS CLI命令快速导出:
aws elasticache describe-cache-clusters --cache-cluster-id redis-cluster-test --show-cache-node-info --region euw1
从输出里把所有CacheNodeEndpoint.Address对应的域名抄下来就行。
2. 更新ServiceEntry,把所有节点加进去
原来的ServiceEntry只包含了配置端点,现在要把所有节点域名都加到hosts里,而且记得把resolution改成DNS——因为Istio需要解析这些域名到具体的IP地址:
kind: ServiceEntry metadata: name: redis-test-cluster spec: hosts: - redis-cluster-test.XXXX.clustercfg.euw1.cache.amazonaws.com - redis-cluster-test-0001-001.XXXX.euw1.cache.amazonaws.com - redis-cluster-test-0001-002.XXXX.euw1.cache.amazonaws.com # 把你找到的所有分片主节点、副本节点域名都加在这里 ports: - number: 6379 name: tcp protocol: TCP resolution: DNS location: MESH_EXTERNAL
3. 修正VirtualService的配置(这个很关键!)
你之前的VirtualService用了http配置,但Redis是基于TCP协议的啊!这完全不对,得改成tcp路由:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: redis-test-cluster spec: hosts: - redis-cluster-test.XXXX.clustercfg.euw1.cache.amazonaws.com - redis-cluster-test-0001-001.XXXX.euw1.cache.amazonaws.com - redis-cluster-test-0001-002.XXXX.euw1.cache.amazonaws.com tcp: - timeout: 30s route: - destination: host: redis-cluster-test.XXXX.clustercfg.euw1.cache.amazonaws.com port: number: 6379 # 如果需要针对不同节点做特殊路由,这里可以加更多destination条目
4. 应用配置并重启Sidecar
把修改后的配置应用到集群:
kubectl apply -f serviceentry.yaml kubectl apply -f virtualservice.yaml
然后重启你的应用Pod,让Sidecar重新加载新的配置:
kubectl rollout restart deployment <你的应用部署名称>
额外要注意的点
- 检查下Istio的
AuthorizationPolicy或者Sidecar配置,别把到这些Redis节点6379端口的出站流量给拦了。 - 如果你的Redis Cluster开了传输加密,记得把端口改成6380,ServiceEntry和VirtualService里的端口也要对应改过来。
内容的提问来源于stack exchange,提问作者Marti Markov
相关产品推荐
相关产品推荐

