Как маршрутизировать с traefik на один docker swarm сервис, выставляющий два порта? - PullRequest
1 голос
/ 06 января 2020

RabbitMq обслуживает управление GUI через порт 15672, и клиенты подключаются к брокеру сообщений через порт 5672

Моя среда:
docker swarm Версия сервера: 19.03.5
изображение: "traefik: v2.0.2"
изображение: rabbitmq: management-alpine

Я могу просмотреть страницы управления Rabbit MQ по адресу https://mq.mydom.comexample С этим ниже как частью Мой compose.yml для docker стека развертывания

  mq:
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.mq-service.rule=Host(`mq.mydom.comexample`)"
        - "traefik.http.services.mq-service.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq-service.entrypoints=websecure"
        - "traefik.http.routers.mq-service.tls.certresolver=mytlschallenge"

Теперь я также wi sh для подключения к брокеру сообщений RabbitMq в той же службе, но я не понимаю синтаксиса traefik. Пробовал вариации без успеха. Вот один из вариантов, который может показать, чего я хотел бы достичь:

  mq:
    deploy:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.mq-service.rule=Host(`mq.mydom.comexample`)"
        - "traefik.http.services.mq-service.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq-service.entrypoints=websecure"
        - "traefik.http.routers.mq-service.tls.certresolver=mytlschallenge"
        # so far same as above

        - "traefik.http.routers.mq-connect.rule=Host(`mq-connect.mydom.comexample`)"
        - "traefik.http.services.mq-connect.loadbalancer.server.port=5672"

просмотр https://mq.mydom.comexample или https://mq-connect.mydom.comexample оба ответа 404 страница не найдена

te lnet mq.mydom.comexample 443
te lnet mq-connect.mydom.comexample 443
оба связаны с: Escape-символ is ' ^] '.

Как мне указать маршрутизацию traefik, что я хочу?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Подводя итог, это теперь работает для меня (большое спасибо).

version: "3.7"

  traefik:
    image: "traefik:v2.0.2"
    command:
      - "--api.insecure=true"
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.rabbitmq.address=:5672"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
     # testing: Letsencrypt would close us out for 24hrs if too many bad requests are made!
     #- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.mytlschallenge.acme.email=postmaster@mydomain"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
      - "--log=true"
      - "--log.filepath=/var/log/traefik.log"
    ports:
      # https
      - "443:443"
      # traefik dash
      - "8080:8080"
      # rabbit mq message broker
      - "5672:5672"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  mq:
    hostname: xyz_mq
    image: rabbitmq:3.8.2-alpine
    environment:
      - RABBITMQ_DEFAULT_VHOST=prod_vhost
      - RABBITMQ_DEFAULT_USER=prod_user
      - RABBITMQ_DEFAULT_PASS=abcdef123
    deploy:
      labels:
        - "traefik.enable=true"

        # web browser access to RabbitMq management GUI
        - "traefik.http.routers.mq.rule=Host(`mq.mydomain`)"
        - "traefik.http.services.mq.loadbalancer.server.port=15672"
        - "traefik.http.routers.mq.entrypoints=websecure"
        - "traefik.http.routers.mq.tls.certresolver=mytlschallenge"
        - "traefik.http.routers.mq.service=mq"

        # AMQPS - SSL terminated by traefik
        - "traefik.tcp.routers.mq-connect.rule=HostSNI(`mq-connect.mydomain`)"
        - "traefik.tcp.services.mq-connect.loadbalancer.server.port=5672"
        - "traefik.tcp.routers.mq-connect.entrypoints=rabbitmq"
        - "traefik.tcp.routers.mq-connect.tls.certresolver=mytlschallenge"
        - "traefik.tcp.routers.mq-connect.service=mq-connect"
    volumes:
      - rabbitmq:/var/lib/rabbitmq
      - ./rabbitmq_plugins:/etc/rabbitmq/enabled_plugins
    stop_grace_period: 5m

volumes:
  rabbitmq:
1 голос
/ 06 января 2020

Я провел еще несколько исследований, касающихся Traefik V2. Решение для нескольких конечных точек заключается в явном названии ваших сервисов. Вот пример:

  whoami:
    image: "containous/whoami"
    container_name: "simple-service"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.service=whoami"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
      - "traefik.http.routers.altwhoami.rule=Host(`alt.docker`)"
      - "traefik.http.routers.altwhoami.entrypoints=web"
      - "traefik.http.routers.altwhoami.service=altwhoami"
      - "traefik.http.services.altwhoami.loadbalancer.server.port=80"

Итак, чтобы исправить вашу реализацию traefik, вам нужно добавить traefik.http.routers.whoami.service = service-name метки.

Надеюсь, это поможет.

Редактировать:

Для маршрутизации AMQP через traefik необходим TCP-маршрутизатор. Я создал небольшой рабочий пример для rabbitmq:

version: "3.3"
services:
  traefik:
    image: "traefik"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.rabbitmq.address=:5672"
    ports:
      - "80:80"
      - "8080:8080"
      - "5672:5672"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  rabbitmq:
    image: "rabbitmq:management-alpine"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.rabbitmq.rule=Host(`rabbitmq.docker`)"
      - "traefik.http.routers.rabbitmq.entrypoints=web"
      - "traefik.http.routers.rabbitmq.service=rabbitmq"
      - "traefik.http.services.rabbitmq.loadbalancer.server.port=15672"

      - "traefik.tcp.routers.ingress.rule=HostSNI(`*`)"
      #- "traefik.tcp.routers.ingress.rule=HostSNI(`ingress.docker`)"
      - "traefik.tcp.routers.ingress.entrypoints=rabbitmq"
      #- "traefik.tcp.routers.ingress.tls=true"
      #- "traefik.tcp.routers.ingress.tls.passthrough=true"
      - "traefik.tcp.services.ingress.loadbalancer.server.port=5672"

Это перенаправит трафик TCP c через порт 5672 через traefik в ваш контейнер (убедитесь, что вы правильно настроили конфигурацию traefik).

Вы можете заметить довольно открытое правило HostSNI(*). Если вы хотите ограничить это правило одним хостом / доменом, вам нужно включить поддержку TLS в rabbitmq, чтобы traefik правильно отфильтровал эти запросы.

Проверьте закомментированные строки в информации о конвертации трафик в поддержку tls. Вы можете либо разрешить traefik обрабатывать TLS, либо напрямую передать его в rabbitmq.

...