#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), чтобы увидеть больше информации.
В общем, Траэфик и Рой были в порядке.