Рой докеров — Запросы не достигают службы на другом узле

#docker #docker-swarm #traefik

Вопрос:

Я настроил докер-рой с Traefik v2 в качестве обратного прокси-сервера и смог получить доступ к панели мониторинга без каких-либо проблем.

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

Я провел небольшое быстрое тестирование с пустым изображением Nginx и смог развернуть другой стек и получить ответ, если изображение находилось на том же узле. Другие стеки в рое, которые развертываются на нескольких узлах (но не включая узел Traefik), могут взаимодействовать друг с другом без проблем).

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

 version: '3.8'

services:
    test:
        image: nginx:latest
        deploy:
            replicas: 1
            placement:
                constraints:
                    - node.role==worker
            labels:
                - "traefik.enable=true"
                - "traefik.docker.network=uccser-dev-public"
                - "traefik.http.services.test.loadbalancer.server.port=80"
                - "traefik.http.routers.test.service=test"
                - "traefik.http.routers.test.rule=Host(`TEST DOMAIN`) amp;amp; PathPrefix(`/test`)"
                - "traefik.http.routers.test.entryPoints=web"
        networks:
            - uccser-dev-public

networks:
  uccser-dev-public:
    external: true
 

uccser-dev-public Сеть представляет собой наложенную сеть на всех узлах, без шифрования.

Если я добавил ограничение для указания узла Traefik, то запросы работали без проблем. Однако, если я переключу его на другой узел, я получу страницу Traefik 404.

Панель мониторинга Traefik показывает, что она видит службу.

Однако журналы доступа показывают следующее:

 proxy_traefik.1.6fbx58k4n3fj@SWARM_NODE    | IP_ADDRESS - - [21/Jul/2021:09:03:02  0000] "GET / HTTP/2.0" - - "-" "-" 1430 "-" "-" 0ms
 

Там просто пусто, и я не знаю, что делать дальше. Обычный журнал не показывает ошибок, которые я вижу.

Файл стека Traefik:

 version: '3.8'

x-default-opts:
  amp;default-opts
  logging:
    options:
      max-size: '1m'
      max-file: '3'

services:
  # Custom proxy to secure docker socket for Traefik
  docker-socket:
    <<: *default-opts
    image: tecnativa/docker-socket-proxy
    networks:
      - traefik-docker
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      NETWORKS: 1
      SERVICES: 1
      SWARM: 1
      TASKS: 1
    deploy:
      placement:
        constraints:
          - node.role == manager

  # Reverse proxy for handling requests
  traefik:
    <<: *default-opts
    image: traefik:2.4.11
    networks:
      - uccser-dev-public
      - traefik-docker
    volumes:
      - traefik-public-certificates:/etc/traefik/acme/
    ports:
      - target: 80 # HTTP
        published: 80
        protocol: tcp
        mode: host
      - target: 443 # HTTPS
        published: 443
        protocol: tcp
        mode: host
    command:
      # Docker
      - --providers.docker
      - --providers.docker.swarmmode
      - --providers.docker.endpoint=tcp://docker-socket:2375
      - --providers.docker.exposedByDefault=false
      - --providers.docker.network=uccser-dev-public
      - --providers.docker.watch
      - --api
      - --api.dashboard
      - --entryPoints.web.address=:80
      - --entryPoints.websecure.address=:443
      - --log.level=DEBUG
      - --global.sendAnonymousUsage=false
    deploy:
      placement:
        constraints:
            - node.role==worker
      # Dynamic Configuration
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.dashboard.rule=Host(`SWARM_NODE`) amp;amp; (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
        - "traefik.http.routers.dashboard.service=api@internal"
        - "traefik.http.services.dummy-svc.loadbalancer.server.port=9999" # Dummy service for Swarm port detection. The port can be any valid integer value.

volumes:
  traefik-public-certificates: {}

networks:
  # This network is used by other services
  # to connect to the proxy.
  uccser-dev-public:
    external: true
  # This network is used for Traefik to talk to
  # the Docker socket.
  traefik-docker:
    driver: overlay
    driver_opts:
      encrypted: 'true'
 

Есть какие-нибудь идеи?

Ответ №1:

Дальнейшее тестирование показало, что другие службы работали на разных узлах, поэтому я решил, что это, должно быть, проблема с моим приложением. Оказывается, у моего приложения Django все еще была куча настроек, настроенных для его предыдущего местоположения хостинга в отношении HTTPS. Поскольку он не передавал требуемые настройки, он отклонил запросы до того, как они были обработаны. Мне нужно было понизить уровень ведения журнала для gunicorn (WSGI), чтобы увидеть больше информации.

В общем, Траэфик и Рой были в порядке.