场景

最近公司项目准备迁移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。

扩展

  • 因为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服务本身

Logo

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

更多推荐