最近公司项目准备迁移kubernetes,于是在测试的过程中遇到了Eureka Server常见的unavailable-replicas问题,对于Eureka 高可用部署出现副本不可用,也比较简单,其实就几个参数配置问题。以下两个参数必须设置为true(默认为true)(单节点部署的时候,设置成false):
eureka.client.registerWithEureka=true (eureka 实例之间互相发现)
eureka.client.fetchRegistry=true (eureka 实例之间信息同步)
主要分两种情况:
第一种情况,eureka.instance.preferIpAddress=true,这个时候应该配置eureka.client.serviceUrl.defaultZone=http://ip:8761/eureka/,http://ip:8761/eureka/,因为此时主机的hostname为IP地址,此时就会将hostname的值和serviceUrl里面的IP做比较,如果此时配置的是服务器的主机名称,就会导致两者不相等出现unavailable-replicas。
第二种情况,eureka.instance.preferIpAddress=false,这个时候应该配置eureka.client.serviceUrl.defaultZone=http://www.amd5.cn(可以是主机名、域名等非IP地址):8761/eureka/,http://amd5.cn:8761/eureka/。
此时还需要配置eureka.instance.hostname=${spring.application.name},如果你要自定义hostname,这里自己手动定义,比如eureka.instance.hostname=www.amd5.cn。
可以参考spring官网的文档https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html
eureka unavailable-replicas的详细分析可以参考https://www.cnblogs.com/lonelyJay/p/9940199.html 分析得比较详细。
随便参数就这么几个,但是发现实际使用中出现问题还是比较麻烦的。阿汤博客这里简单分享下自己使用过程中遇到的问题,希望对你有帮助。
因为kubernetes pod的ip是随时变换的,所以在在配置eureka.client.serviceUrl.defaultZone的时候,只能采用k8s内部域名,所以按照正常的配置一步一步部署,当部署好Eureka Server的时候,发现副本不可用,首先是怀疑自己参数配置有错误,于是仔细检查核对发现配置没问题,那为什么会出现unavailable-replicas这种情况呢,网上大部分资料都是说着几个参数的配置问题,基本没有其他情况会导致unavailable-replicas。
然后开怀疑是kubernetes部署或kubernetes内部网络问题导致,然后一一排查,不采用变量换成手动配置hostname,还是无果,最后尝试把eureka.instance.preferIpAddress改成true,手动填写docker容器的IP测试,此时副本状态为available-replicas。
现在慢慢有了点方向,初步判断eureka.instance.preferIpAddress配置没有生效,或有其他原因导致eureka自己获取的hostname并不是我配置hostname,导致了unavailable-replicas。于是我在两台物理机上部署了两个Eureka Server,然后采用eureka.instance.preferIpAddress=false的方式,发现也是unavailable-replicas。
然而可以排除kubernetes部署和配置的问题,问题应该出在eureka服务本身,于是本地debug测试,把配置清空以后,debug发现eureka.instance.preferIpAddress的值被强制设置了为了true,而官方默认配置为false。问题慢慢有了眉目,开始把eureka服务所有依赖去掉,只保留原生的打包部署测试,发现完全正常,如下图:
然后开始一个依赖,一个依赖添加,打包部署测试,终于在引入discovery-plugin-starter-eureka依赖打包部署以后,出现了unavailable-replicas,因为这个依赖包是开源项目的,于是去问了此开源项目的负责人,他回复是把eureka.instance.preferIpAddress强制设置了为true。
到此困扰了两天的问题,终于找到了原因,找到原因以后处理就比较简单了,要么不引用,要么改源码为false。
有时候遇到一些互联网找不到答案的问题,排查的思路比较重要,其次就是一定要动手一步步测试(这个过程很繁琐、纯体力活),只是靠冥想和推理,永远也得不到结果。
2020年8月9日 上午12:44 沙发
初来乍到,多多关照!