#docker #docker-compose #traefik #bad-gateway #health-check
#docker #docker-compose #traefik #bad-gateway #проверка работоспособности
Вопрос:
Я изучаю основы Traefik, но не могу заставить проверку работоспособности работать. У меня есть четыре сервера, которые являются контейнерами docker. Вращение работает хорошо, при обновлении страницы localhost каждый раз отображается другой сервер. Даже запуск нескольких запросов с помощью Apache Benchmark и их мониторинг с помощью ctop показывает правильный баланс рабочей нагрузки. Проблема возникла, когда я остановил один из серверов. Предполагается, что Traefik должен обнаружить автономный сервер и перенаправить на один из активных серверов, но вместо этого, когда ротация достигает автономного сервера, отображается сообщение «Bad Gateway», поэтому проверка работоспособности вообще не работает. Я попытался воспроизвести примеры документации, но уверен, что я что-то упускаю.
Это мой файл docker-compose.yml:
version: '2.4'
services:
traefik:
image: asn/traefikv1
build: traefikv1/
ports:
- "80:80"
- "8080:8080" # Web GUI
volumes:
# Traefik static config file
- ./traefikv1/traefik.toml:/etc/traefik/traefik.toml
wwwserver:
build: .
image: phpwebapp
ports:
# Random external port for HTTP direct access
- "80"
- "8080"
scale: 4
mem_limit: 50m
mem_reservation: 25m
volumes:
- ./html:/var/www/html
depends_on:
- mariadb
mariadb:
image: mariadb:latest
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=notesdb
- MYSQL_USER=usuario
- MYSQL_PASSWORD=secreto
ports:
- 3306:3306
И это мой traefik.toml, где определена проверка работоспособности:
# Enable API and dashboard (:8080)
[api]
# Enable logs
[traefikLog]
[accessLog]
# Configure timeouts
[respondingTimeouts]
[file]
#Manual frontend/backend configuration
[frontends]
[frontends.frontend1]
passHostHeader = true
entryPoints = ["http"]
backend = "wwwservers"
[backends]
[backends.wwwservers]
# Define www servers
[backends.wwwservers.servers.server1]
url = "http://pruebastraefik_wwwserver_1:80"
[backends.wwwservers.servers.server2]
url = "http://pruebastraefik_wwwserver_2:80"
[backends.wwwservers.servers.server3]
url = "http://pruebastraefik_wwwserver_3:80"
[backends.wwwservers.servers.server4]
url = "http://pruebastraefik_wwwserver_4:80"
[backends.wwwservers.loadBalancer.healthCheck]
path = "/health"
interval = "10s"
timeout = "3s"
port= 80
Ответ №1:
Я думаю, что вам не хватает меток для ваших служб в файле компоновки. Также обратите внимание, что версия 2.4 является так называемой экспериментальной, я предлагаю вам переключиться на 2.3.
В глубине я считаю, что это происходит: самое главное, что вам не хватает ярлыков в службах создания докеров. Кроме того, файл TOML работает со службой traefik, а не с www-сервером, который вы хотите маршрутизировать. Такие теги, как «бэкэнды» и «интерфейсы», должны быть включены в соответствующий тег traefik, на мой взгляд, traefik их игнорирует.
Кроме того, кажется, что опция масштабирования создаст дополнительные контейнеры для запуска службы на том же хосте (?). Похоже, вы пытаетесь контролировать свои службы, определяя, что пытается обслуживать каждый масштабируемый узел.
Я запускаю несколько доменов и служб через роевой кластер, и traefik является моей основной точкой входа и управляет сетью кластера. Я пишу отдельные файлы стека с тегом «deploy» и дочерним тегом «labels», который включает все правила traefik для каждой службы в стеке, очень похожие на руководство по быстрому запуску на сайте, только с несколькими файлами compose и добавленным тегом deploy для режима docker swarm. Удачи