一、该问题的重现步骤是什么?
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集群上面;
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
看你的描述好像是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这一类外置服务就行而不需要再去改动微服务的配置了
应该是redis集群的问题,redis集群的机制就是需要固定IP地址,但k8s上建立redis集群时使用的是redis的POD地址,而k8s上的POD的IP随时都可能变的,所以只能把redis集群从k8s上移出来了。
扫一扫访问 Blade技术社区 移动端