我正在尝试将Redis集群配置到安装了Istio网格的Kubernetes上。Redis集群可以在没有Istio的情况下创建,并且每个Pods都被自动注入一个Istio代理(特使)。但是,安装了Istio并将Istio代理附加到每个Redis,因此Redis集群无法通过来自CLI的集群MEET命令正确地“满足”。
例如,我有Redis (0- 10919)和Redis Pod B( 10920 - 16383)。这是在它们之间尝试一个集群MEET命令(集群meet ClusterIPForRedisPodB 6379)之后的结果。
对于Redis Pod A,将更新集群信息并包括Redis Pod B:

相反,对于Redis Pod B,集群信息没有更新,也不包括Redis Pod A:

我能够发送卷曲和网猫之间的两个端口16379和6379的响应。此外,特使似乎也开放了这些港口。
发布于 2019-10-31 09:33:36
我复制了你的问题,并找到了解决你的问题的办法。
让我先解释一下你问题的原因。
Redis八卦协议是这样工作的:当您在redis1上键入redis1时,redis1会打开到redis2的tcp连接。通常情况下,当redis2接收到连接时,它会接受它,查找连接者的源ip地址,并打开到该地址的tcp连接,在这种情况下也打开到redis1的连接。(关于流言协议如何工作的更多信息,可以在redis文件或这篇文章中找到)
伊索部分来了。默认情况下,Istio将特使配置为典型的代理,并且可以在istio文档中阅读。

Istio是使用REDIRECT proxing并作为文档中的状态:
此模式在重定向过程中丢失源IP地址。
这是我们问题的根源。
redis2接收到连接时,它将其视为来自本地主机的连接。redis1的源IP地址已丢失,redis2现在无法打开与redis1的连接。
现在,我们有一些选择:
TPROXY (我尝试过,但无法使其工作)让我们仔细看看第二个选项,因为这是对我有用的选择。在redis.conf文件中,您可以找到以下部分:
集群码头/NAT支持 在某些部署中,Redis群集节点地址发现失败,因为地址是NAT或端口被转发(典型情况是Docker和其他容器)。 为了使Redis集群在这样的环境中工作,需要一个静态配置,使每个节点都知道其公共地址。以下两个选项用于此范围,它们是:
每个节点都指示其地址、客户端端口和集群消息总线端口。然后在总线分组的报头中发布信息,以便其他节点能够正确地映射发布信息的节点的地址。
如果不使用上述选项,则将使用普通的Redis群集自动检测。
请注意,在重新映射时,总线端口可能不在客户端端口+ 10000的固定偏移量处,因此您可以根据它们的重映射方式指定任何端口和总线端口。如果未设置总线端口,则将像通常那样使用固定偏移量10000 .
示例:
群组-宣布-ip 10.1.1.5
集群-公告-端口6379
集群-宣布-总线-端口6380
我们需要将cluster-announce-ip 变量设置为redis自己的ip地址.
您可以这样做,例如修改redis-cluster ConfigMap (它是从这篇文章修改的redis configmap ):
---
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-cluster
data:
update-node.sh: |
#!/bin/sh
REDIS_NODES="/data/nodes.conf"
sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
cp /conf/redis.conf /redis.conf # <------HERE-----
sed -i "s/MY_IP/${POD_IP}/" /redis.conf # <------HERE-----
exec "$@"
redis.conf: |+
cluster-enabled yes
cluster-require-full-coverage no
cluster-node-timeout 15000
cluster-config-file /data/nodes.conf
cluster-migration-barrier 1
appendonly yes
protected-mode no
cluster-announce-ip MY_IP # <------HERE-----还记得像这样更改容器的command以指向正确的redis.conf文件:
command: ["/conf/update-node.sh", "redis-server", "/redis.conf"]每个redis节点现在都会将这个地址作为自己的地址来做广告,因此其他redis节点现在将知道如何与其连接。
如果有帮助请告诉我。
https://stackoverflow.com/questions/58528831
复制相似问题