我正在开发一个使用docker-swarm设置云架构的项目。我知道使用swarm我可以部署服务的副本,这意味着该图像的多个容器将运行以服务请求。
我还读到docker有一个内部负载均衡器来管理这个请求分配。
但是,我需要帮助来理解以下内容:
假设我有一个容器,它将服务公开为REST API或说它是一个Web应用程序。如果我在swarm中部署了多个容器(副本),并且我有其他容器(运行一些应用程序)与此HTTP / REST服务通信。
然后,当我编写那些 IP:PORT 组合的应用时,我会使用吗?是否有任何工作节点IP运行这些服务?即使在运行相同服务的其他工作人员/经理中,这样做是否会适当地分配负载?
或者我应该打电话给经理,而经理又适当地处理路由(即使经理节点没有运行此特定服务的容器)?
感谢。
答案 0 :(得分:22)
当我编写那些我使用IP:PORT组合的应用程序时?是不是 工作节点IP运行这些服务?
即使该节点上没有相关服务的副本,您也可以使用参与该群集的任何节点。
因此,您将使用Node:HostPort
组合。入口路由网格将请求路由到活动容器。
一张价值一万字的图片
这样做会照顾到适当分配负载 在其他工作人员/经理中运行相同的服务?
默认情况下,入口控制器会进行循环。
现在客户端应该使用dns循环来访问docker swarm节点上的服务。将发生经典的DNS缓存问题。为了避免这种情况,我们可以使用像HAproxy这样的外部负载均衡器。
答案 1 :(得分:0)
在 docker swarm 前面使用代理 (HAProxy) 的好处是,swarm 节点可以驻留在代理服务器可以访问的私有网络上,但这是不可公开访问的。这将使您的集群安全。
如果您使用 AWS VPC
,您可以创建一个私有子网并将您的 swarm 节点放置在私有子网中,并将代理服务器放置在可以将流量转发到 swarm 节点的公共子网中。
当您访问 HAProxy 负载均衡器时,它会将请求转发到 swarm 中的节点。 swarm routing mesh
将请求路由到活动任务。如果 swarm 调度器出于任何原因将任务分派到不同的节点,则无需重新配置负载均衡器。