Redis集群IP变更导致所有的BladeX的服务都down了!紧急

Blade 已结 2 1229
345779856
345779856 剑圣 2021-01-18 19:55

一、该问题的重现步骤是什么?
redis集群建立在k8s上,因为改了一个配置导至redis节点的IP变了,集群还是正常的, redis客户端连接正常;
但BladeX的所有服务都连接不上了,这些服务连接的还是最原始的那些redis节点IP,
由于连不上redis集群,所有的服务都罢工了,BladeX的所有服务都重启都这样结果,
不知道这个redis集群的IP是缓存在哪里的?要重启哪个服务才能生效?
说明:修改redis的容器编排参数前的系统访问是正常的;

修改前的redis集群节点IP:
# kubectl -n redis-ns get pod -o wide
-------------------------------------------------------------------------------------------------------------------
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE             NOMINATED NODE   READINESS GATES
redis-app-0    1/1     Running   0          23s   172.20.3.214   192.168.211.29   <none>           <none>
redis-app-1    1/1     Running   0          21s   172.20.1.225   192.168.211.31   <none>           <none>
redis-app-2    1/1     Running   0          20s   172.20.2.23    192.168.211.28   <none>           <none>
redis-app-3    1/1     Running   0          18s   172.20.3.215   192.168.211.29   <none>           <none>
redis-app-4    1/1     Running   0          16s   172.20.2.24    192.168.211.28   <none>           <none>
redis-app-5    1/1     Running   0          15s   172.20.1.226   192.168.211.31   <none>           <none>
-------------------------------------------------------------------------------------------------------------------
[root@k8s-master redis-k8s]# kubectl -n redis-ns get svc
----------------------------------------------------------------------------------------
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
redis-access-service   NodePort    10.68.23.253   <none>        6379:26379/TCP       4s
redis-headless         ClusterIP   None           <none>        6379/TCP,16379/TCP   24h
----------------------------------------------------------------------------------------

修改后的redis集群节点IP:
# kubectl -n redis-ns get pod -o wide
-------------------------------------------------------------------------------------------------------------------
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE             NOMINATED NODE   READINESS GATES
redis-app-0    1/1     Running   0          8h    172.20.3.101   192.168.211.29   <none>           <none>
redis-app-1    1/1     Running   0          8h    172.20.1.116   192.168.211.31   <none>           <none>
redis-app-2    1/1     Running   0          8h    172.20.2.144   192.168.211.28   <none>           <none>
redis-app-3    1/1     Running   0          8h    172.20.3.100   192.168.211.29   <none>           <none>
redis-app-4    1/1     Running   0          8h    172.20.2.143   192.168.211.28   <none>           <none>
redis-app-5    1/1     Running   0          8h    172.20.1.115   192.168.211.31   <none>           <none>
-------------------------------------------------------------------------------------------------------------------
[root@k8s-master redis-k8s]# kubectl -n redis-ns get svc
----------------------------------------------------------------------------------------
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
redis-access-service   NodePort    10.68.23.253   <none>        6379:26379/TCP       4s
redis-headless         ClusterIP   None           <none>        6379/TCP,16379/TCP   24h
----------------------------------------------------------------------------------------

#spring配置
spring:
  redis:
    ##redis 单机环境配置
    ##将docker脚本部署的redis服务映射为宿主机ip
    #host: 10.68.23.253:26379
    #port: 6379
    password: admin@HaRedisCluster1212
    database: 0
    ssl: false
    ##redis 集群环境配置
    cluster:
      nodes: 10.68.23.253:6379
      commandTimeout: 5000

错误信息,BladeX的所有服务都连接不上,BladeX的所有服务连接的还是最原始的那些redis节点IP, BladeX的所有服务都重启都这样.
redis   DOWN
error    org.springframework.data.redis.RedisConnectionFailureException:
Redis connection failed; nested exception is io.lettuce.core.RedisConnectionException:
Unable to connect to 172.20.3.215:6379

error    org.springframework.data.redis.RedisConnectionFailureException:
Redis connection failed; nested exception is io.lettuce.core.RedisConnectionException:
Unable to connect to 172.20.3.214:6379


二、你期待的结果是什么?实际看到的又是什么?
虽然redis节点的IP改变了,但k8s暴露的redis的服务的IP是不变的,为啥BladeX服务连接的还是改变前的redis节点IP呢


三、你正在使用的是什么产品,什么版本?在什么操作系统上?
BladeX企业版v2.7.1;系统运行在k8s集群上面;

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  •  admin
    admin (最佳回答者)
    2021-01-18 21:09

    看你的描述好像是nacos配置了10.68.23.253:6379的ip,但服务启动去连接的还是172.20.3.215:6379?

    这有几个点需要去排查一下:

     1. 看看nacos是否有缓存,可以通过curl命令调用nacos对应的api,看看你的配置文件实际请求后获取到的redis地址是多少

     2. 看下172.20.3.215在服务内部是否有配置,导致直接覆盖了nacos的配置

     3. 如果以上两者都没问题,那尝试给redis地址配置一个域名,再启动服务看看报错提示是域名还是之前的ip


    如果以上都不行,则进入下一步排查
     1. 重新新开一个纯服务,连接nacos看看取到的redis地址是多少,以此来排除是否naocs缓存问题

     2. 如果新服务打印出来的是域名,则说明是之前推送构建的服务有问题,如果打印出来的还是ip,则说明是nacos有问题

     3. 找到问题后再进行下一步问题排查


    总结:

    redis,数据库这一类服务不推荐也用k8s部署,推荐单独高可用部署,暴露出一个固定的地址,推荐用域名。这样不论后期迁移还是故障排除,都只需要处理redis这一类外置服务就行而不需要再去改动微服务的配置了

    0 讨论(1)
  • 2021-01-19 11:20

    应该是redis集群的问题,redis集群的机制就是需要固定IP地址,但k8s上建立redis集群时使用的是redis的POD地址,而k8s上的POD的IP随时都可能变的,所以只能把redis集群从k8s上移出来了。

    1 讨论(0)
提交回复