При чтении документации по Docker Swarm 1.12 есть раздел, в котором описывается, как настроить HAProxy для балансировки нагрузки трафика на узлы роя.
https://docs.docker.com/engine/swarm/ingress/#/configure-an-external-load-balancer
Если я понимаю Docker Swarm> 1.12, нет необходимости настраивать балансировщик нагрузки таким образом, потому что Swarm имеет внутренний балансировщик нагрузки и DNS.
Не было бы правильным подходом использовать обратный прокси-сервер для имени службы (псевдоним DNS) и позволить балансировщику нагрузки Swarm делать эту работу?
Например, в nginx вы могли бы сделать:
location /somepath/ {
proxy_read_timeout 900;
proxy_pass http://service-name/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Мое предположение заключается в том, что служба развертывается в оверлее частной сети, а служба, которая должна быть доступна извне, развертывается в частной сети и в прокси-сети, где также развертывается служба nginx или haproxy.
docker service create
--name recurrence-service \
--replicas 3 \
--network my-service \
--network proxy \
mycompany/my-web-server
Я думаю, что ваш подход звучит хорошо, и я не думаю, что есть какие-либо требования для внешнего LB. Мы ставим ELB перед нашим, но это больше для того, чтобы он оставался стандартным для других сервисов и чтобы у нас было центральное место, где мы делаем SSL.
Swarm Mode включает в себя внутренний DNS и сетку маршрутизации для обеспечения обнаружения службы и пересылки запросов между узлами на тот, на котором запущена служба. Это означает, что все узлы будут прослушивать опубликованный порт (когда вы используете "входящий" режим по умолчанию), и этот запрос будет перенаправлен внутри между узлами роя.
Однако при доступе к службе извне по-прежнему рекомендуется использовать балансировщик нагрузки. для отправки запросов на один из множества узлов. Это для HA, так как любой узел может быть недоступен, а остальные перейдут к нему. Если вы отправляете все запросы только одному узлу и этот узел выходит из строя, вы не сможете получить доступ к своей службе, даже если другие узлы все еще доступны и обслуживают запросы.
В качестве альтернативы вы можете использовать настроенный циклический DNS для разрешения на несколько хостов докеров. Однако это не так идеально по нескольким причинам: