Проблема регистрации экземпляра сервера и клиента Netflix Eureka в Docker swarm - PullRequest
0 голосов
/ 12 июня 2019

Мы пытаемся развернуть Netflix Eureka Server на контейнере Docker, который является приложением Spring Boot. Мы внедряем его в качестве службы докера с роем Docker для оркестровки контейнеров. Все работает нормально, когда мы напрямую создаем контейнер и запускаем приложение. Сервер Eureka регистрирует все клиентские приложения с правильными IP-адресами. Но когда мы создаем и разворачиваем его как сервис Docker, оно регистрирует приложение с неправильным IP-адресом.

Мы опробовали приведенное ниже решение согласно весенней документации, обновили значения свойств в наших файлах конфигурации.


spring: 
   cloud:
     inetutils:
       ignoredInterfaces:
          - docker0
          - veth.*

eureka:
  instance:
    preferIpAddress: true

Пробовал и эти решения:

https://github.com/spring-cloud/spring-cloud-netflix/issues/1820

https://github.com/spring-cloud/spring-cloud-netflix/issues/2084

Пока мы запускаем службу докера, контейнеру назначается один IP-адрес, скажем, 172.16.1.3, а службе, запущенной внутри докера, назначается новый IP-адрес 172.16.1.4, из-за этой проблемы клиентское приложение регистрирует себя с IP-адресом контейнера в Eureka. сервер. Но это доступно с 172.16.1.4.

Так почему для запуска docker в качестве службы назначаются два IP-адреса?

Здесь сервер Eureka работает на IP-адресе 10.255.53.172, но, как мы видим на втором изображении, он показывает другой IP-адрес в Instance Info

Экземпляр Eureka зарегистрирован с IP-адресом контейнеров, но он доступен с помощью IP-адреса его службы в сети

1 Ответ

0 голосов
/ 15 июня 2019

Мы используем эту конфигурацию на производстве, используя режим роя Docker:

Конфигурация сервера Eureka

# Defines the Eureka server that is used by the Netflix OSS components to use as the registry
# for server discovery
eureka:
  instance:
    hostname: ${HOST_NAME:localhost}
    appname: eureka-cluster
    # enable to register multiple app instances with a random server port
    instance-id: ${spring.application.name}:${random.uuid}
    leaseRenewalIntervalInSeconds: 10
    leaseExpirationDurationInSeconds: 20

Конфигурация клиента Eureka

eureka:
  client:
    registerWithEureka: ${REGISTER_WITH_EUREKA:true}
    fetchRegistry: ${FETCH_REGISTRY:false}
    serviceUrl:
      defaultZone: ${EUREKA_DEFAULT_ZONE:http://localhost:8761/eureka/}
  instance:
    hostname: ${HOST_NAME:${spring.application.name}}  # work on swarm
    preferIpAddress: ${PREFER_IP_ADDRESS:false}
    # enable to register multiple app instances with a random server port
    instance-id: ${spring.application.name}:${random.uuid}
    leaseRenewalIntervalInSeconds: ${LEASE_RENEWAL_INTERVAl_IN_SECONDS:10}
    leaseExpirationDurationInSeconds: ${LEASE_EXPIRATION_DURATIONIN_SECONDS:20}

Определение сервиса Swarm

  rd-service:
      image: my-eureka-server-microservice-image
    ports:
    - "8763:8763"
      networks:
      - backend

  client-service:
    image: my-eureka-client-microservice-image
    networks:
    - backend
    networks:
    environment:
    - "EUREKA_DEFAULT_ZONE=http://rd-service:8763/eureka"
    - "REGISTER_WITH_EUREKA=true"
    - "FETCH_REGISTRY=true"

networks:
  backend:
    external: true

Важное замечание: Службы должны находиться в той же наложенной сети Docker, которая используется в службе Docker сервера eureka.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...