docker 集群模式下服务副本之间的网络请求负载平衡

Load balancing of network requests between replicas of services in docker swarm mode

我找不到任何关于集群模式下 docker 服务副本之间负载平衡算法的文档。

我根据 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集群模式:

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,另一次从另一个终端收到。所以它 似乎使用了循环法 负载平衡。

但什么是真正的负载均衡算法?

算法目前很简单round-robin。有人建议启用最快的预期响应时间算法,以解决请求路由到另一个 docker 主机的问题,服务也在本地 运行,但这尚未实现。


来自docker's swarm networking docs

The swarm load balancer automatically routes the HTTP request to the service’s VIP to an active task. It distributes subsequent requests to other tasks using round-robin selection.

关于使用最快预期响应的评论来自一些 dockercon 2016 视频,我现在无法打开这些视频。