Я не могу найти никаких документов по используемому алгоритму балансировки нагрузки между репликами службы докера в режиме роя.
Я создал образ mynodeapp
на основе Dockerfile:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 8080
CMD [ "npm", "start" ]
npm
запускает следующее server.js
:
const LATENCY = 5000;
var app = require('express')();
app.get('/', (req,res)=>{
console.log('Sending response');
setTimeout( function() {
res.send('All ok');
}, LATENCY );
});
app.listen( 8080 );
Код просто отправляет All ok
после 5-секундной задержки. Кроме того, он выводит Sending response
на консоль.
Теперь я запускаю режим роя докеров:
docker swarm init --advertise-addr:eth0
и запускаем сервис с двумя репликами:
docker service create mynodeapp --replicas 2 --publish 8080:8080
Результат
root@man1:~# docker service ls
ID NAME REPLICAS IMAGE COMMAND
233z44bz6sx0 amazing_hypatia 2/2 mynodeapp
root@man1:~# docker ps
CONTAINER ID PORTS NAMES
1f36e0c9eb37 8080/tcp amazing_hypatia.1.453u2upnyf2nvtwxouopv4olk
f0fb099a5154 8080/tcp amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g
Теперь я открываю два терминала и смотрю логи обоих контейнеров:
docker logs amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f
а также
docker logs amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f
Когда я бегу
curl localhost:8080
Я получаю Sending response
один раз с одного терминала и другой раз с другого терминала. Таким образом, похоже, что используется циклическая балансировка нагрузки.
Но что такое настоящий алгоритм балансировки нагрузки?