最近把redis-cluster集群迁移到了k8s上后发生了一个问题,当一个pod重启后,java程序报错,连不上redis服务器。我们查看集群状态后发现,当pod重启后,pod的ip发生了改变(我们并没有固定redis-cluster的pod的ip),去非重启pod使用cluster nodes查看集群信息,一切正常,但在重启pod节点查看集群信息,发现集群信息中使用的还是重启前的pod的ip。也就是说,当pod重启后,该pod中的redis实例通知了集群中其他成员更新了Cluster topology,但自身却没有更新,截图如下:

这是redis集群信息,大家注意redis-0的ip地址,我们重启redis-0后,redis-0的ip地址如下:

pod启动了47s,其他都是25m,证明重启了,重启后ip地址为172.255.211.7,我们进去redis-0查看集群信息:

发现还是使用重启前的pod的ip,并没更新,再去其他redis节点查看集群信息:

发现集群信息正常,那怎么让他通知自己也更新Cluster topology呢?

参考:https://github.com/antirez/redis/issues/4289这个issue,在启动参数中加入选项

--cluster-announce-ip

最后yaml文件中启动参数如下:


          - "/etc/redis.conf"
          - "--protected-mode"
          - "no"
          - "--cluster-announce-ip"
          - "$(POD_IP)"

再重启pod节点,问题解决。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐