Микросервисы обратного прокси с Docker и Traefik

У меня мало микросервисов, назовем их food-ms, receipt-ms, ingredients-ms и frontend, поскольку приложение React использует эти микросервисы. Каждый из них предоставляет API по адресу /api/[methods].

Я хотел бы создать среду для производства и разработки с использованием Docker и docker-compose со следующими свойствами:

  • Приложение должно быть доступно на одном хосте. В производственном хосте должен быть, например, http://food-app.test, для разработки он должен быть (в идеале) localhost

  • Каждый микросервис и интерфейс должны находиться на одном хосте, но на разных путях. Например, food-ms API должен быть в localhost/food/api, receipt-ms API должен быть в localhost/receipt/api и т. Д. Frontend должен находиться в localhost корневом / пути.

  • В идеале я хотел бы иметь возможность запускать некоторые службы вне контейнера для упрощения отладки, но при этом они будут иметь обратный прокси-сервер и доступны localhost/{service}/api.

Я нашел обратный прокси traefik и немного поэкспериментировал с ним, но застрял в проблемах:

  1. Как сделать приложение доступным в каком-то предсказуемом домене, например localhost. В настоящее время я могу отправлять запросы к конкретному серверу, указав странный хост в заголовке Host, например <container-name>.<network-name>.docker.localhost. Кажется, что интерфейсы, описанные в traefik.toml, не действуют.
  2. Как направлять запросы из одного интерфейса в разные серверы в зависимости от пути?
  3. Как направить запрос на внешний IP-адрес и порт (я хотел бы использовать это для запуска служб вне контейнера для отладки)? Должен ли я использовать для этого host сеть в докере?

Заранее спасибо.

Вот мой traefik.toml

defaultEntryPoints = ["http"]

[entryPoints]
    [entryPoints.http]
    address = ":80"

[file]

[frontends]
    [frontends.food]
    entrypoints = ["http"]
    backend="food"

    [frontends.receipts]
    entrypoints = ["http"]
    backend="receipts"

Кажется, что эти интерфейсы не применяются, потому что информационные панели не меняются, если я их рекомендую.


person STO    schedule 15.06.2018    source источник
comment
Извините, я не знаю о traefik, но предлагаю использовать обратный прокси-сервер nginx, который широко используется в качестве обратного прокси-сервера.   -  person Rohan J Mohite    schedule 15.06.2018


Ответы (3)


По прошествии некоторого времени я добился небольшого успеха в решении моей проблемы.

Во-первых, гораздо проще поэкспериментировать с traefik, работающим как локальное приложение, а не как docker-контейнер.

Итак, я установил traefik локально (brew install traefik) и запустил его с помощью следующей командной строки:

traefik --web --configfile=./docker/traefik-local.toml --logLevel=INFO

Существует устаревший, но рабочий аргумент --web, который пока что можно опустить.

Затем я создал файл TOML с конфигурацией

defaultEntryPoints = ["http"]
[entryPoints]
    [entryPoints.http]
    address = ":80"

[file]

[frontends]
    [frontends.fin]
        entrypoints = ["http"]
        backend="fin"
        [frontends.fin.routes.matchUrl]
            rule="PathPrefixStrip:/api/fin"
        [frontends.fin.routes.rewriteUrl]
            rule = "AddPrefix: /api"

    [frontends.proj]
    entrypoints = ["http"]
    backend="proj"
        [frontends.proj.routes.matchUrl]
            rule="PathPrefixStrip: /api/proj"
        [frontends.proj.routes.rewriteUrl]
            rule = "AddPrefix: /api"


[backends]
    [backends.fin]
        #
        [backends.fin.servers.main]
        url = "http://localhost:81"
    [backends.proj]
        #
        [backends.proj.servers.main]
        url = "http://localhost:82"

Названия сервисов отличаются от первоначального ответа, но идея должна быть ясной.

Прежде всего, есть обязательная директива [file] перед описанием внешних и внутренних интерфейсов. Без него не работает, ахх :(

Службы работают в контейнерах докеров и открывают порты 81 для fin и 82 для proj. Поскольку теперь traefik работает за пределами изолированной сети докеров, он поддерживает как собственно запущенное приложение, так и приложение в контейнере.

Затем описываются два интерфейса. Первоначально у меня также была проблема с правилами: PathPrefixStrip - это Matcher, но он также изменяет путь, удаляя префикс пути.

Итак, теперь он работает так, как я хочу, с локальным запуском, и должно быть намного проще заставить его работать в Docker.

person STO    schedule 15.06.2018

Ну, еще немного информации о том, как запускать все это в Docker.

Прежде всего, traefik имеет концепцию предоставления конфигурации, где он может получить всю информацию о бэкэндах, интерфейсах, правилах, сопоставлениях и т. Д.

Для Docker есть как минимум два способа: использовать метки для служб в docker-compose.yml или использовать file поставщик конфигурации.

Здесь я бы подумал об использовании поставщика конфигурации файлов. Чтобы использовать его, вам необходимо добавить раздел [file] и конфигурацию ниже в конфигурацию traefik или использовать отдельный файл.

Я использовал отдельный файл, включил и указал его, добавив --file --file.filename=/etc/traefik/traefik.file.toml аргументы командной строки.

Помните, что если вы используете Windows и docker-toolbox вам нужно добавить общую папку в Virtual Box и добавить сопоставление с этой папкой, это неудобно, да.

После этого все будет легко.

Для адресации служб в разделе [backends] конфигурации traefik используйте имена служб из docker-compose.yml. Чтобы открыть прокси, используйте сопоставление портов.

Вот мой docker-compose.yaml:

version: "3"
services:     

  financial-service:
    build:
      context: .
      dockerfile: ./docker/financial.Dockerfile

  project-service:
    build:
      context: .
      dockerfile: ./docker/project.Dockerfile

  traefik:
    image: traefik
    command: --web --docker --file --file.filename=/etc/traefik/traefik.file.toml --docker.domain=docker.localhost --logLevel=INFO --configFile=/etc/traefik/traefik.toml
    ports:
      - "80:80"
      - "8088:8080"
      # - "44:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      # On Windows with docker-toolbox:
      #    this should be mounted as a shared folder in VirtualBox.
      # Mount via VB UI, don't forget to restart docker machine.

      # - /rd-erp/docker:/etc/traefik/
      # On normal OS
      - ./docker:/etc/traefik/
    depends_on:
      - project-service
      - financial-service

Вот traefik.file.toml для Docker:

[frontends]
    [frontends.fin]
        entrypoints = ["http"]
        backend="fin"
        [frontends.fin.routes.matchUrl]
            rule="PathPrefixStrip:/api/fin"
        [frontends.fin.routes.rewriteUrl]
            rule = "AddPrefix: /api"

    [frontends.proj]
    entrypoints = ["http"]
    backend="proj"
        [frontends.proj.routes.matchUrl]
            rule="PathPrefixStrip: /api/proj"
        [frontends.proj.routes.rewriteUrl]
            rule = "AddPrefix: /api"


[backends]
    [backends.fin]
        #
        [backends.fin.servers.main]
        url = "http://financial-service"
    [backends.proj]
        #
        [backends.proj.servers.main]
        url = "http://project-service"

Следующим шагом будет запуск некоторых служб вне контейнера и возможность обратного прокси-сервера с локального хоста.

person STO    schedule 18.06.2018

И, наверное, последняя часть: подключение к службам, работающим на хост-машине, из Docker, а в нашем случае из контейнера traefik.

  1. Запустить службу на хост-машине
  2. В Docker 18.3+ используйте специальный домен host.docker.internal и не забудьте указать протокол и порт.

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

  3. Запустите docker-compose без службы, которую вы хотите отлаживать:

    docker-compose up --no-deps traefik financial-service

  4. Наслаждаться

Не забудьте удалить раздел [file] из traefik.toml, если вы используете конфигурацию в отдельном файле, предоставленном --file.filename, кажется, что раздел [file] имеет приоритет.

person STO    schedule 18.06.2018