如何在Docker-Swarm模式下完成负载平衡

时间:2017-02-28 14:09:48

标签: docker load-balancing docker-swarm-mode

我正在开发一个使用docker-swarm设置云架构的项目。我知道使用swarm我可以部署服务的副本,这意味着该图像的多个容器将运行以服务请求。

我还读到docker有一个内部负载均衡器来管理这个请求分配。

但是,我需要帮助来理解以下内容:

假设我有一个容器,它将服务公开为REST API或说它是一个Web应用程序。如果我在swarm中部署了多个容器(副本),并且我有其他容器(运行一些应用程序)与此HTTP / REST服务通信。

然后,当我编写那些 IP:PORT 组合的应用时,我会使用吗?是否有任何工作节点IP运行这些服务?即使在运行相同服务的其他工作人员/经理中,这样做是否会适当地分配负载?

或者我应该打电话给经理,而经理又适当地处理路由(即使经理节点没有运行此特定服务的容器)?

感谢。

2 个答案:

答案 0 :(得分:22)

  

当我编写那些我使用IP:PORT组合的应用程序时?是不是   工作节点IP运行这些服务?

即使该节点上没有相关服务的副本,您也可以使用参与该群集的任何节点。 因此,您将使用Node:HostPort组合。入口路由网格将请求路由到活动容器。

一张价值一万字的图片

enter image description here

  

这样做会照顾到适当分配负载   在其他工作人员/经理中运行相同的服务?

默认情况下,入口控制器会进行循环。

现在客户端应该使用dns循环来访问docker swarm节点上的服务。将发生经典的DNS缓存问题。为了避免这种情况,我们可以使用像HAproxy这样的外部负载均衡器。

enter image description here

答案 1 :(得分:0)

现有答案的重要附加信息

在 docker swarm 前面使用代理 (HAProxy) 的好处是,swarm 节点可以驻留在代理服务器可以访问的私有网络上,但这是不可公开访问的。这将使您的集群安全。

如果您使用 AWS VPC,您可以创建一个私有子网并将您的 swarm 节点放置在私有子网中,并将代理服务器放置在可以将流量转发到 swarm 节点的公共子网中。

当您访问 HAProxy 负载均衡器时,它会将请求转发到 swarm 中的节点。 swarm routing mesh 将请求路由到活动任务。如果 swarm 调度器出于任何原因将任务分派到不同的节点,则无需重新配置负载均衡器。

有关详细信息,请阅读https://docs.docker.com/engine/swarm/ingress/