将 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
我有一个(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