首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用Istio搜索网格在Kubernetes中创建Redis集群?

是否可以使用Istio搜索网格在Kubernetes中创建Redis集群?
EN

Stack Overflow用户
提问于 2019-10-23 18:16:33
回答 1查看 2.1K关注 0票数 0

我正在尝试将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的响应。此外,特使似乎也开放了这些港口。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的连接。

现在,我们有一些选择:

  1. 您可以尝试将代理模式更改为TPROXY (我尝试过,但无法使其工作)
  2. 使用redis内置配置变量

让我们仔细看看第二个选项,因为这是对我有用的选择。在redis.conf文件中,您可以找到以下部分:

集群码头/NAT支持 在某些部署中,Redis群集节点地址发现失败,因为地址是NAT或端口被转发(典型情况是Docker和其他容器)。 为了使Redis集群在这样的环境中工作,需要一个静态配置,使每个节点都知道其公共地址。以下两个选项用于此范围,它们是:

  • 群组-宣布-ip
  • 集群-宣布端口
  • 集群-通告-总线端口

每个节点都指示其地址、客户端端口和集群消息总线端口。然后在总线分组的报头中发布信息,以便其他节点能够正确地映射发布信息的节点的地址。

如果不使用上述选项,则将使用普通的Redis群集自动检测。

请注意,在重新映射时,总线端口可能不在客户端端口+ 10000的固定偏移量处,因此您可以根据它们的重映射方式指定任何端口和总线端口。如果未设置总线端口,则将像通常那样使用固定偏移量10000 .

示例:

群组-宣布-ip 10.1.1.5

集群-公告-端口6379

集群-宣布-总线-端口6380

我们需要将cluster-announce-ip 变量设置为redis自己的ip地址.

您可以这样做,例如修改redis-cluster ConfigMap (它是从这篇文章修改的redis configmap ):

代码语言:javascript
复制
---
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文件:

代码语言:javascript
复制
command: ["/conf/update-node.sh", "redis-server", "/redis.conf"]

每个redis节点现在都会将这个地址作为自己的地址来做广告,因此其他redis节点现在将知道如何与其连接。

如果有帮助请告诉我。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58528831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档