Redis Sentinel 不会自动发现新的从属实例

Redis Sentinel doesn't auto discover new slave instances

我已经在启用了 Sentinel 的 k8s 上部署了 redis helm chart

我用Sentinel设置了Master-Replicas topology,就是一主二从。每个 Pod 都是 运行 Redis 和 sentinel 容器成功:

NAME             READY   STATUS    RESTARTS   AGE     IP             NODE
my-redis-pod-0   2/2     Running   0          5d22h   10.244.0.173   node-pool-u
my-redis-pod-1   2/2     Running   0          5d22h   10.244.1.96    node-pool-j
my-redis-pod-2   2/2     Running   0          3d23h   10.244.1.145   node-pool-e

现在,我有一个 python 脚本连接到 redis 并通过将 pod 的 ip 传递给它来发现主机。

sentinel = Sentinel([('10.244.0.173', 26379),
                     ('10.244.1.96',26379),
                     ('10.244.1.145',26379)],
                  sentinel_kwargs={'password': 'redispswd'})

host, port = sentinel.discover_master('mymaster')
redis_client = StrictRedis(
            host=host,
            port=port,
            password='redispswd')

假设主节点在 my-redis-pod-0 上,当我 kubectl delete pod 模拟导致我丢失 pod 的问题时, Sentinel 将提升其中一个 slaves 为 master,而 kubernetes 将给我一个带有 redis 和 sentinel 的新 pod。

NAME             READY   STATUS    RESTARTS   AGE     IP             NODE
my-redis-pod-0   2/2     Running   0          3m      10.244.0.27    node-pool-u
my-redis-pod-1   2/2     Running   0          5d22h   10.244.1.96    node-pool-j
my-redis-pod-2   2/2     Running   0          3d23h   10.244.1.145   node-pool-e

问题是,我怎样才能告诉 Sentinel 自动将这个新 ip 添加 到列表中(无需更改代码)?

谢谢!

您可以不使用 IP,而是使用 dns 条目进行无头服务。

通过显式指定

创建无头服务
ClusterIP: None

然后你就可以使用下面的 dns 条目了,其中 redis-0 将是 master

#syntax
pod_name.service_name.namespace.svc.cluster.local

#Example
redis-0.redis.redis.svc.cluster.local
redis-1.redis.redis.svc.cluster.local
redis-2.redis.redis.svc.cluster.local

参考资料:

https://www.containiq.com/post/deploy-redis-cluster-on-kubernetes