在Docker 1.12集群模式下,如果我在同一个节点上运行多个同一个服务的任务并发布相同的端口,则可以在这些任务之间进行任何形式的负载平衡吗?或者,拥有更多服务实例而不是节点数量的目的是什么? 例如。
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个任务将在同一节点上运行,其中一个将永远不会收到连接)。
谢谢。
不,即使在同一节点上运行多个容器,路由网格也确实在所有容器之间分配请求。
您不会在股票nginx图像中看到它,因为它配置了高保活设置,因此您的客户端在刷新时会不断返回相同的容器。
nginx
请尝试使用此自定义Nginx图像:
docker service create --name nginx --replicas 10 -p 80:80 sixeyed/nginx-with-hostname
(sixeyed / nginx-with-hostname是自动构建的,您可以在GitHub上检查源代码。)
指定了一个1秒钟的保持活动状态,以及一个自定义响应标头X-Host,该标头告诉您服务器的主机名-在这种情况下,它将是容器ID。
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将它们分配给所有任务。