Назад | Перейти на главную страницу

Публикация сервисов Docker Swarm на определенных IP-адресах

На 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 на основе заголовка хоста. Как спросил Флорин, почему вы не пробуете это?