将 eureka 与 kubernetes 问题集成

integrate eureka with kubernetes issue

我有一个(spring boot/spring 云)应用程序(微服务 'MS' 架构)使用 netflix 工具构建,我想将它部署在 kubernetes 集群上(一个主机和 2 个小兵)以从其编排事实中获益。

顺便说一下,我在集群上创建了一个 kube-dns 服务,我还尝试用 3 pods 挂载一个 eureka 服务(名为 eurekaservice)。 从另一边看,我 运行 一个具有下一个 eureka 配置的微服务:

client:
  serviceUrl:
    defaultZone: http://eurekaservice:8761/eureka/

好消息是集群上的每个 eureka pod 都会收到有关新安装的 MS 实例的通知。坏消息是,当 MS 出现故障时,只有一个 eureka pod 收到通知,而其他的则没有。 另一件事是,当我看到 MS 日志文件时,在挂载时,它显示了下一个错误:

Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: 2016-12-01 06:01:54.469 ERROR 1 --- [nio-8761-exec-1] c.n.eureka.resources.StatusResource: Could not determine if the replica is available

Dec 01 09:01:54 ctc-cicd3 docker-current[1465]:
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: java.lang.NullPointerException: null
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at com.netflix.eureka.resources.StatusResource.isReplicaAvailable(StatusResource.java:90)
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at com.netflix.eureka.resources.StatusResource.getStatusInfo(StatusResource.java:70)
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at org.springframework.cloud.netflix.eureka.server.EurekaController.status(EurekaController.java:63)
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at sun.reflect.GeneratedMethodAccessor92.invoke(Unknown Source)
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Dec 01 09:01:54 ctc-cicd3 docker-current[1465]: at java.lang.reflect.Method.invoke(Method.java:606)


Dec 01 09:02:16 ctc-cicd3 docker-current[1465]: 2016-12-01 06:02:16.918  WARN 1 --- [nio-8761-exec-8] com.netflix.eureka.InstanceRegistry      : DS: Registry: lease doesn't exist, registering resource: MS - gateway-bbn50:MS:8090
Dec 01 09:02:16 ctc-cicd3 docker-current[1465]: 2016-12-01 06:02:16.919  WARN 1 --- [nio-8761-exec-8] c.n.eureka.resources.InstanceResource    : Not Found (Renew): MS - gateway-bbn50:MS:8090
Dec 01 09:02:16 ctc-cicd3 docker-current[1465]: 2016-12-01 06:02:16.927  INFO 1 --- [nio-8761-exec-5] com.netflix.eureka.InstanceRegistry      : Registered instance id 12.16.64.2 with status UP
Dec 01 09:02:17 ctc-cicd3 docker-current[1465]: 2016-12-01 06:02:17.061  INFO 1 --- [io-8761-exec-10] com.netflix.eureka.InstanceRegistry      : Registered instance id 12.16.64.2 with status UP
Dec 01 09:02:46 ctc-cicd3 docker-current[1465]: 2016-12-01 06:02:46.932  WARN 1 --- [nio-8761-exec-9] com.netflix.eureka.InstanceRegistry      : DS: Registry: lease doesn't exist, registering resource: MS - gateway-bbn50:MS:8090

我认为导致问题的原因是副本无法看到彼此。

我该如何解决这个问题!!

这里的问题是 Eureka 是一个有状态的应用程序,你不能仅仅通过增加副本的数量来扩展它。

查看 Eureka "peer awereness" 文档:http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html

您似乎想用 Kubernetes 发现替换 Eureka 发现,这是另一个答案(来自 http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html):

首先在 Ribbon 中禁用 eureka 支持:

ribbon:
  eureka:
   enabled: false

然后在您的网关中为您希望通过网关访问的每个微服务添加这样的配置 属性(您可以使用配置服务器加载这些属性)。

app1:   
  ribbon:
    listOfServers: app1-k8s-service-name
app2:   
  ribbon:
    listOfServers: app2-k8s-service-name

那么您的网关应该能够正确地将调用路由到您的微服务。

由于您禁用了 eureka,因此仅使用 zuul 代理:

server.ribbon.listOfServers=localhost:9090,localhost:9091,localhost:9092 server.ribbon.eureka.enabled=假

如果您在 k8s (kubernetes) 上部署,请使用服务名称

ribbon: 
  eureka: 
    enabled: false

zuul:
  routes:
    organization-proxy:
      serviceId: organization-service
      path: /organization/**


organization-proxy:   
  ribbon:
    listOfServers: organization