Микросервисы Обнаружение сервисов с использованием Eureka и traefik с помощью docker compose

Траэфик для чайников вопрос. Я пытаюсь настроить облачные микросервисы Spring с помощью docker compose, используя traefik в качестве обратного прокси.

Моя цель - микросервисы должны общаться друг с другом через имя службы (например, service-registry-app), а traefik должен разрешить его по IP-адресу. Как только это заработает в локальном ящике, я хочу расширить его для работы на AWS ECS.

Я создал ana_network, используя

docker network create ana_network

конфигурация traefik:

Файл: docker-compose.yml

version: '2'

services:
  proxy:
    image: traefik
    command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG
    networks:
      - ana_network
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml

networks:
  ana_network:
    driver: bridge

конфигурация микросервисов:

Файл: docker-compose.yml

version: '2'

services:
  service-registry:
    image: sqshq/piggymetrics-registry
    restart: always
    networks:
      - web
    expose:
      - "8761"
    labels:
      - "traefik.backend=service-registry-app"
      - "traefik.frontend.rule=Host:service-registry-app.example.com"
    environment:
      CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD    
  config-server:
    image: sqshq/piggymetrics-config
    restart: always
    networks:
      - web
    expose:
      - "8888"
    depends_on:
      - service-registry
    environment:
       EUREKA_HOST: service-registry-app.example.com
       EUREKA_PORT: 8761
       CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

    labels:
      - "traefik.backend=config-server-app"
      - "traefik.frontend.rule=Host:config-server-app.example.com"    
networks:
  web:
    external:
      name: ana_network

Я могу получить доступ к приложению реестра служб с помощью curl

curl -H Host:service-registry-app.example.com http://172.21.0.2:8761

Но сервер конфигурации и шлюз api не могут получить доступ к реестру служб с указанной выше конфигурацией с помощью docker compose и traefik.

Какие изменения мне нужно сделать, чтобы все микросервисы могли обнаруживать друг друга, и как расширить их, чтобы они работали на ECS?

Edit1:

Исправлен отступ для переноса раздела сетей из сервисов в сети, это была опечатка.

Я новичок в контейнерах и распределенных системах, поэтому я могу задать несколько наивных очевидных вопросов, поэтому было бы здорово, если бы какой-либо traefik для чайников был очень полезным.

Ниже приведены 2 проблемы, с которыми я сталкиваюсь в настоящее время.

1) связь контейнера с контейнером - пример, как контейнер 2 (конфигурационный сервер в этом примере) должен взаимодействовать с контейнером 1 (сервис-реестр), по имени сервиса (например, сервис-реестр) или любым другим способом и как получить доступ к этим контейнерам из внешний мир (в данном случае реестр услуг)?

2) Расширение его, чтобы заставить его работать в ECS, следовательно, у каждого будет свое собственное определение задачи и он будет работать как служба внутри кластера ECS - в этом сценарии, как контейнеры должны взаимодействовать друг с другом с помощью traefik?


person menneni    schedule 19.02.2018    source источник
comment
Что пытается сделать веб-раздел в конце вашего второго файла Compose? Похоже, вы хотели определить сеть, но вместо этого определили службу.   -  person BMitch    schedule 21.02.2018
comment
Спасибо, что указали. Это была опечатка при вводе здесь. Все еще сталкиваюсь с той же проблемой, я обновил свой вопрос.   -  person menneni    schedule 26.02.2018


Ответы (1)


Кажется, что ваш контейнер в сеть контейнеров сломан в нескольких местах. С помощью файла compose traefik вы определяете сеть, но не помечаете ее как внешнюю, поэтому compose создаст ${project}_ana_network сеть, которую другие проекты не увидят. Исправьте это, отметив его как внешний с помощью:

networks:
  ana_network:
    external:
      name: ana_network

Во втором файле композиции вы определяете веб-службу, которая выглядит так, как будто вы пытаетесь определить веб-сеть, и это, по-видимому, вызвано неправильным отступом «сетей». Честно говоря, я не знаю, как это могло бы работать так, как написано, поскольку "веб-сеть" не существовала бы для использования другими вашими службами.

Для интеграции traefik я предпочитаю не определять имя серверной части, а указывать сетевое имя и порт, чтобы traefik знал, как подключиться к контейнеру, если вы когда-либо определяете несколько сетей или портов в контейнере.

Результат будет выглядеть так:

version: '2'

services:
  service-registry:
    image: sqshq/piggymetrics-registry
    restart: always
    networks:
      - web
    expose:
      - "8761"
    labels:
      - "traefik.frontend.rule=Host:service-registry-app.example.com"
      - "traefik.docker.network=ana_network"
      - "traefik.port=8761"
    environment:
      CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD    
  config-server:
    image: sqshq/piggymetrics-config
    restart: always
    networks:
      - web
    expose:
      - "8888"
    depends_on:
      - service-registry
    environment:
       EUREKA_HOST: service-registry-app.example.com
       EUREKA_PORT: 8761
       CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

    labels:
      - "traefik.backend=config-server-app"
      - "traefik.frontend.rule=Host:config-server-app.example.com"    

networks:
  web:
    external:
      name: ana_network

Наконец, я не настраивал установку Eureka, но если вы хотите, чтобы контейнеры общались напрямую через сеть контейнеров, я бы рекомендовал использовать:

EUREKA_HOST: service-registry

Указание адреса, указанного с помощью traefik, отправит запрос из докера на возврат через traefik, добавив ненужные переходы.

Если вам нужно установить для EUREKA_HOST внешнее имя, но все же вы хотите использовать контейнер для сети контейнеров, вы можете настроить сетевой псевдоним:

services:
  service-registry:
    ...
    networks:
      web:
        aliases:
        - "service-registry-app.example.com"
person BMitch    schedule 21.02.2018
comment
Исправлены отступы и обновлен вопрос с более подробной информацией. По-прежнему не удается получить доступ к другой контейнерной службе, пожалуйста, помогите. - person menneni; 28.02.2018
comment
Ответ выше рекомендовал больше, чем исправление опечатки. - person BMitch; 28.02.2018