Docker 1.12 Swarm Mode — задачи балансировки нагрузки одной и той же службы на одном узле

В Docker 1.12 Swarm Mode, если у меня есть более одной задачи одной и той же службы, работающей на одном узле и публикующей один и тот же порт, можно ли выполнить какой-либо баланс нагрузки между задачами? Или какова цель наличия большего количества экземпляров службы, чем количество узлов?
Например.

node swarm init
node service create --name web --replicas=2 --publish=80:80 nginx

Теперь, если я открою браузер и получу доступ к http://localhost/ (многократно обновляя страницу), кажется, что все соединения обрабатываются такая же задача, как может показаться, если сделать:

docker logs [container1]
docker logs [container2]

PS: хорошо, я знаю, что нет смысла иметь рой из одного узла, но то же самое, кажется, происходит, если у меня есть 10 узлов в рое (с сервисом, масштабированным до 10 реплик), а затем я теряю один из этих узлов (2 задачи сервиса будут запущены на одной ноде и одна из них никогда не получит соединения).

Спасибо.


person Eduardo Sousa    schedule 22.09.2016    source источник


Ответы (1)


Нет, сетка маршрутизации распределяет запросы между всеми контейнерами, даже если несколько контейнеров работают на одном узле.

Вы не видите этого в стандартном образе nginx, потому что он настроен с высоким параметром поддержания активности, поэтому ваш клиент продолжает возвращаться к тому же контейнеру при обновлении.

Вместо этого попробуйте этот собственный образ Nginx:

docker service create --name nginx --replicas 10 -p 80:80 sixeyed/nginx-with-hostname

(sixeyed/nginx-with-hostname — это автоматическая сборка, вы можете проверить исходный код на GitHub.)

Там указано 1-секундное подтверждение активности и настраиваемый заголовок ответа X-Host, который сообщает вам имя хоста сервера — в этом случае это будет идентификатор контейнера.

Я сделал три последовательных запроса, и все они были обслужены разными контейнерами:

> curl -k http://my-swarm.com/ | grep X-Host
X-Host: 5920bc3c7659 

> curl -k http://my-swarm.com/ | grep X-Host    
X-Host: eb228bb39f58 

> curl -k http://my-swarm.com/ | grep X-Host
X-Host: 891bafd52c90  

Все эти контейнеры работают на узле менеджера в рое из 2 узлов. Другие запросы обслуживаются контейнерами на воркере, поэтому Docker распределяет их по всем задачам.

person Elton Stoneman    schedule 22.09.2016