在Docker 1.12 Swarm模式下,如果我在同一个节点上运行同一服务的多个任务并发布相同的端口,那么可以在任务之间进行任何类型的负载平衡吗?或者,目的是拥有比节点数更多的服务实例?
例如。
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个任务将在同一节点上运行,其中一个永远不会接收连接)。
感谢。
答案 0 :(得分:3)
不,路由网格确实在所有容器之间分发请求,即使多个容器在同一节点上运行也是如此。
您没有看到库存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。
我做了三个连续的请求,这些请求都由不同的容器提供服务:
> 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正在围绕所有任务分发它们。