2017-02-28 46 views
12

我正在使用docker-swarm建立一个云架构的项目。我知道,使用swarm,我可以部署服务的副本,这意味着该映像的多个容器将运行以服务请求。如何在Docker-Swarm模式下完成负载均衡

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

不过,我需要了解以下帮助:

说我有一个公开服务的REST API或者说,它的一个web应用程序的容器。如果我在群中部署了多个容器(副本),并且我有其他容器(运行某些应用程序)与此HTTP/REST服务交谈。

然后,当我写这些应用程序IP:端口组合使用?是否有任何工作节点IP正在运行这些服务?这样做是否会妥善分配负载,即使是在运行相同服务的其他工人/经理之间也是如此?

或者我应该调用管理器来反过来适当地维护路由(即使管理器节点没有运行此特定服务的容器)?

谢谢。

回答

14

当我写这些应用程序哪些IP:端口组合使用?工作节点IP的任何 是否运行这些服务?

即使在该节点上不存在所涉及的服务的副本,您也可以使用参与群集的任何节点。 所以你会使用Node:HostPort组合。入口路由网格将请求路由到活动容器。

其中一张价值一万个字

enter image description here

威尔这样采取适当分配负载甚至 除其他工作人员/管理运行同一服务的护理?

入口控制器默认会循环。

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

enter image description here

+1

你确定它总是循环?你能链接到这个事实吗?它让我感到奇怪的设计选择。可能产生大量不必要的网络流量,例如如果一个容器需要另一个容器的服务,并且在同一主机上有一个副本 - 应该给予副本优先级,以避免不必要的网络流量。 –

+0

@farhad:谢谢。我看到群集中的节点之间的负载平衡混乱。但是,假设我已经将容器隔离到跨节点设置的不同覆盖网络。负载平衡是否仍然发生?(1) 节点++ - >容器(A)_1,容器(A) Container(A)类型的两种服务都连接到三个不同的覆盖网络,每个覆盖网络只有C **,D&E在Node **上运行。 因此,当C,D或E试图通过自己的覆盖网络访问类型A的容器时,它会被处理吗? – Shabirmean

+1

@AssafLavie容器流量使用dns。 Swarm内部DNS将以循环顺序返回与服务名称匹配的所有活动容器记录。 Kubernetes通过pod概念处理这个问题。 –