Запуск облака Spring (Zuul, Eureka и 2 rest backend-сервиса) с Kubernetes

У меня есть архитектура микросервисов с контейнерами Docker, и теперь я хочу перейти к развертыванию с использованием Kubernetes. Я не могу запустить приложение с Kubernetes. Сервер шлюза не подключается к запросу на обнаружение и пересылку службы.

В качестве демонстрационного приложения я создал 4 сервиса: - Сервис Zuul - Сервис Eureka - Сервис контактов - Сервис пользователей

Репозиторий Githube - https://github.com/dhananjay12/spring-microservice-k8s

Приложение отлично работает с docker-compose. Я создал образы и отправил их в Dockerhub.

Файлы K8s - https://github.com/dhananjay12/spring-microservice-k8s/tree/master/k8s

Для пересылки запроса я установил Ingress-nginx.

Я запустил службу, выполнив следующие действия:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

тогда

minikube addons enable ingress

Ingress-service.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: zuul-cluster-ip-service
              servicePort: 8050

Запрос поступает в zuul, но в логах появляются следующие ошибки:

Caused by: java.lang.RuntimeException: java.net.UnknownHostException: contactus-5448dd4d9c-5gj5r
    at rx.exceptions.Exceptions.propagate(Exceptions.java:57) ~[rxjava-1.3.8.jar!/:1.3.8]
    at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:463) ~[rxjava-1.3.8.jar!/:1.3.8]
    at rx.observables.BlockingObservable.single(BlockingObservable.java:340) ~[rxjava-1.3.8.jar!/:1.3.8]
    at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112) ~[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]
    ... 127 common frames omitted

Если я устанавливаю eureka.instance.preferIpAddress = true, я получаю следующее исключение:

com.netflix.zuul.exception.ZuulException: Forwarding error
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:189) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:164) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:112) ~[spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.3.1.jar!/:1.3.1]
    at org.springframework.web.servlet.mvc.ServletWrappingController.handleRequestInternal(ServletWrappingController.java:165) [spring-webmvc-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
    at org.springframework.cloud.netflix.zuul.web.ZuulController.handleRequest(ZuulController.java:44) [spring-cloud-netflix-zuul-2.0.0.RELEASE.jar!/:2.0.0.RELEASE]
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) [spring-webmvc-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) [spring-webmvc-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.7.RELEASE.jar!/:5.0.7.RELEASE]
    at or

Вероятно, это связано с тем, что службы должны быть зарегистрированы через имя модуля. Как справиться с такими ситуациями, чтобы каждая нисходящая служба регистрировалась через свой IP-адрес кластера?


person Dhananjay    schedule 25.12.2018    source источник
comment
Имя eureka-service - eureka-cluster-ip-service, но в ваших развертываниях оно использует eureka: 8761. Попробуйте изменить название службы eureka на eureka   -  person a.l.    schedule 25.12.2018
comment
Спасибо за улов. Сервис получает реестры.   -  person Dhananjay    schedule 25.12.2018
comment
Можете ли вы помочь мне с пересылкой запроса в сервис Zuul?   -  person Dhananjay    schedule 25.12.2018
comment
Вам не нужно регистрировать clusterIP в eureka. Я думаю, что вы почти у цели, на вашем месте я бы проверил информацию в регистре и вручную протестировал curl в контейнерах. и зуул, и твоя служба   -  person a.l.    schedule 26.12.2018


Ответы (1)


Как @ a.l. указал, что значение SPRING_EUREKA должно быть IP-адресом кластера:

value: http://eureka-cluster-ip-service:8761/eureka

Кроме того, все сервисы seekIpAddress должны быть истинными:

eureka:
  instance:
    preferIpAddress: true
person Dhananjay    schedule 27.12.2018