gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:20:01 26 4
gpt4 key购买 nike

我正在尝试在安装了 Istio Mesh 的 Kubernetes 上配置 Redis 集群。 Redis 集群可以在没有 Istio 的情况下创建,并且每个 Pod 都会自动注入(inject) Istio 代理(Envoy)。但是,在安装了 Istio 并将 Istio 代理附加到每个 Redis Pod 后,Redis 集群无法通过 CLI 中的 CLUSTER MEET 命令正确“会面”。

例如,我有 Redis Pod A(插槽 0 - 10919)和 Redis Pod B(插槽 10920 - 16383)。这是在它们之间尝试 CLUSTER MEET 命令后的结果(集群满足 ClusterIPForRedisPodB 6379)。

对于 Redis Pod A,集群信息已更新并包含 Redis Pod B:

Redis Pod A

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

Redis Pod B

我能够在端口 16379 和 6379 的两个 Pod 之间发送 curl 和 netcat 响应。此外,Envoy 似乎也打开了这些端口。

最佳答案

我已经复制了您的问题并找到了解决您问题的方法。

让我首先解释一下导致您出现问题的原因。

Redis gossip 协议(protocol)的工作原理如下:当您输入cluster meet <ip> <port>时在redis1上,redis1 打开到 redis2 的 tcp 连接。正常情况下,当redis2收到连接时,它会接受它,并查找连接者的源IP地址并且还打开到该地址的 tcp 连接,在这种情况下是到 redis1。(更多关于八卦协议(protocol)在redis中如何工作的信息可以在 redis documentation 中找到,或在 this article )

这是istio部分。Istio 默认将 envoy 配置为典型代理,正如您可以读到的 istio documentation :

interception mode

Istio 默认使用 REDIRECT代理并如文档中所述:

This mode loses source IP addresses during redirection

这是我们问题的根源。

redis2 当收到连接时,它会将其视为来自本地主机。 Envoy 丢失了 redis1 的源 IP 地址,并且 redis2 现在无法打开返回到 redis1 的连接。

现在,我们有一些选择:

  1. 您可以尝试将代理模式更改为TPROXY (我试过了,但没能成功)
  2. 使用redis内置配置变量

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

CLUSTER DOCKER/NAT support

In certain deployments, Redis Cluster nodes address discovery fails, because addresses are NAT-ted or because ports are forwarded (the typical case is Docker and other containers).

In order to make Redis Cluster working in such environments, a static configuration where each node knows its public address is needed. The following two options are used for this scope, and are:

  • cluster-announce-ip
  • cluster-announce-port
  • cluster-announce-bus-port

Each instruct the node about its address, client port, and cluster message bus port. The information is then published in the header of the bus packets so that other nodes will be able to correctly map the address of the node publishing the information.

If the above options are not used, the normal Redis Cluster auto-detection will be used instead.

Note that when remapped, the bus port may not be at the fixed offset of clients port + 10000, so you can specify any port and bus-port depending on how they get remapped. If the bus-port is not set, a fixed offset of 10000 will be used as usually.

Example:

cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380

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

您可以这样做,例如修改 redis-cluster配置映射是这样的(它是从 this article 修改的 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 节点现在知道如何与其连接。

请告诉我是否有帮助。

关于kubernetes - 是否可以使用 Istio 搜索网格在 Kubernetes 中创建 Redis 集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58528831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com