Docker群模式下服务副本之间的networking请求负载均衡
在群集模式下,Docker服务副本之间的负载均衡algorithm找不到任何文档。
我创build了一个基于Dockerfile的图像mynodeapp:
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 );
代码在延迟5秒后才发送All ok
。 此外,它打印Sending response
到控制台。
现在,我开始docker swarm模式:
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
现在,我打开两个terminal并查看两个容器的日志:
docker logs amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f
和
docker logs amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f
当我跑步
curl localhost:8080
我从一个terminal获得一次Sending response
,另一个terminal从另一个terminal获得Sending response
。 因此, 似乎使用循环负载平衡。
但什么是真正的负载平衡algorithm?
该algorithm目前是一个简单的循环法。 已经有人build议启用最快的预期响应时间algorithm来解决请求被路由到另一个docker主机的问题,该服务也在本地运行,但是这还没有被实现。
从docker的群networking文档 :
群集负载均衡器自动将HTTP请求发送到服务的VIP,以执行一个活动的任务。 它使用循环法select将后续请求分发给其他任务。
关于使用最快的预期响应的意见是从一些我现在无法解决的dockercon 2016video。