我已经在启用了 Sentinel 的 k8s 上部署了 redis helm chart。
我用Sentineltopology设置了Master-Replicas,就是一主两从。每个 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 来发现 master。
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 会将其他从节点之一提升为主节点,并且 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 到列表中(无需更改代码)?
谢谢!
您可以使用 DNS 条目来实现无头服务,而不是使用 IP。
无头服务是通过显式指定来创建的
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