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
我已经在启用了 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