Документация Docker для внешнего балансировщика нагрузки на хосты докеров в режиме роя (почему?)

При чтении документации по 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
0
задан 26 April 2017 в 10:19
2 ответа

Я думаю, что ваш подход звучит хорошо, и я не думаю, что есть какие-либо требования для внешнего LB. Мы ставим ELB перед нашим, но это больше для того, чтобы он оставался стандартным для других сервисов и чтобы у нас было центральное место, где мы делаем SSL.

0
ответ дан 5 December 2019 в 08:42

Swarm Mode включает в себя внутренний DNS и сетку маршрутизации для обеспечения обнаружения службы и пересылки запросов между узлами на тот, на котором запущена служба. Это означает, что все узлы будут прослушивать опубликованный порт (когда вы используете "входящий" режим по умолчанию), и этот запрос будет перенаправлен внутри между узлами роя.

Однако при доступе к службе извне по-прежнему рекомендуется использовать балансировщик нагрузки. для отправки запросов на один из множества узлов. Это для HA, так как любой узел может быть недоступен, а остальные перейдут к нему. Если вы отправляете все запросы только одному узлу и этот узел выходит из строя, вы не сможете получить доступ к своей службе, даже если другие узлы все еще доступны и обслуживают запросы.

В качестве альтернативы вы можете использовать настроенный циклический DNS для разрешения на несколько хостов докеров. Однако это не так идеально по нескольким причинам:

  • Для сбоя по-прежнему требуется тайм-аут, прежде чем большинство приложений попытается попробовать другой узел.
  • Частичный сбой, когда узел получает соединения, но сбой всех запросов приведет к сбоям (загрузка балансировщик может быть настроен для проверки работоспособности цели перед отправкой трафика)
0
ответ дан 5 December 2019 в 08:42

Теги

Похожие вопросы