На Centos 7.4 я настраиваю рой, в котором я хочу запустить несколько маршрутизаторов, все доступные на порте 80/443.
Цель состоит в том, чтобы разместить несколько сред (тестовых / промежуточных ...) в одном рое, все симметрично.
Я использую Docker 17.12.0-ce и Traefik v1.4.6 в качестве маршрутизатора.
Основная идея состоит в том, чтобы иметь виртуальный IP-адрес для каждой среды и публиковать порты Traefik только на этом адресе. Это невозможно с Docker Swarm, поэтому мне приходится прибегать к тому, чтобы экземпляры Traefik прослушивали порты 81/82 и т. Д. И каким-то образом переносили трафик с VIP: 80 на: 81 /: 82.
Виртуальные IP-адреса для всех сред через менеджеры роя обрабатываются Keepalived.
Соответствующая конфигурация службы докеров для Traefik:
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 81,
"PublishMode": "ingress"
},
# netstat -anp|grep 81
tcp6 7 0 :::81 :::* LISTEN 4578/dockerd
firewalld настроен для разрешения трафика на порты 80, 81, 82 и т. д.
Доступ к серверным сервисам, предоставляемым Traefik, непосредственно через порт 81 на VIP работает.
Доступ к порту 80 на VIP, когда на нем ничего не настроено, приводит к отказу в соединении
Экземпляр докера Traefik работает на том же хосте, который я использую для следующих тестов.
Я сначала попробовал с базовым DNAT:
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=81:toaddr=127.0.0.1
Это привело к тайм-аутам, на сервере не было установлено соединение, и tcpdump сказал мне, что SYN игнорируются
Затем я попытался использовать более конкретный DNAT:
firewall-cmd --add-rich-rule='rule family=ipv4 forward-port port=80 protocol=tcp to-port=81 to-addr=127.0.0.1'
с такими же результатами.
Я обнаружил ГОРБ который кажется адаптированным к моему варианту использования и снабдил его
Обслуживание:
{
"host": "<VIP>",
"port": 80,
"protocol": "tcp",
"method": "rr",
"persistent": true,
"flags": "sh-port"
}
Бэкэнд для указанной службы:
{
"host": "<VIP>",
"port": 81,
"method": "nat",
"weight": 100,
"pulse": {
"type": "tcp",
"interval": "30s",
"args": null
}
}
Я проверил настройку с помощью ipvsadm, и она кажется правильной:
# ipvsadm -l -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP <VIP>:80 rr (flag-2)
-> <VIP>:81 Masq 100 0 0
в этом случае, хотя на сервере не было соединения, tcpdump показывал обмен SYN, SYNACK и ACK, а затем HTTP-запрос и его ACK.
Другой трафик не прошел, и время ожидания запроса на стороне клиента в конечном итоге истекло.
ipvsadm зарегистрировал соединение как активное.
Если я настрою HAProxy для прослушивания VIP: 80 и проксирования запросов через HTTP на 127.0.0.1:81, все будет работать, но я бы хотел избежать этого, поскольку он требует, чтобы все данные проходили через HAProxy, тратя ресурсы впустую и требует локальной настройки.
У меня нет идей, и я не знаю, как дальше устранять неполадки.
РЕДАКТИРОВАТЬ для разъяснения. У меня вопрос:
Можно ли маршрутизировать трафик с VIP: 80 на: 81 /: 82 и т. Д. Без использования HAProxy или другого процесса, который просто перекачивает данные на настоящий маршрутизатор (Traefik)?
1-й, ты жестяная банка используйте несколько IP-адресов на хосте, если у вас есть возможность добавлять IP-адреса в реальной сети. это делает работать в Swarm под Linux. Видеть документы macvlan и погуглите "macvlan swarm".
Во-вторых, вы используете оверлей и входящую сеть роя, верно?
В-третьих, большинство людей просто ставят Traefik (или мой любимый http://proxy.dockerflow.com) для прослушивания 80/443, и он направляет соответствующий сервис / стек в Swarm на основе заголовка хоста. Как спросил Флорин, почему вы не пробуете это?