【问题标题】:How is load balancing done in Docker-Swarm modeDocker-Swarm 模式下的负载均衡是如何完成的
【发布时间】:2017-07-19 13:17:02
【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    当我编写这些应用程序时,我使用哪个 IP:PORT 组合?有没有 运行这些服务的工作节点 IP 的数量?

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

    一图胜千言

    这样做是否会适当地分配负载,甚至 在其他运行相同服务的工人/经理中?

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

    现在客户端应该使用 dns round robin 来访问 docker swarm 节点上的服务。会出现经典的 DNS 缓存问题。为避免这种情况,我们可以使用 HAproxy 等外部负载均衡器。

    【讨论】:

    • 你确定它总是循环吗?你能链接到这个事实吗?我觉得这是一个奇怪的设计选择。可能会产生大量不必要的网络流量,例如如果一个容器需要另一个容器的服务,并且在同一主机上有一个副本 - 应该优先考虑该副本,以避免不必要的网络流量。
    • @farhad:谢谢。我看到负载平衡混乱在集群中的节点之间起作用。但是假设我已经将容器隔离到跨节点设置的不同覆盖网络。负载平衡是否仍然发生?例如:Node++ --> Container(A)_1, Container(A)_2, ContainerB(1) Node** --> Container(C)_1, Container(D)_1, Container(E)_1 Container 类型的两个服务(A) 连接到三个不同的覆盖网络,每个覆盖网络只有在 Node** 上运行的 C、D 和 E。那么当 C、D 或 E 试图通过自己的覆盖网络访问 A 类型的容器时,它会被处理吗?
    • @AssafLavie 容器到容器的流量使用 dns。 Swarm 内部 DNS 将按循环顺序返回与服务名称匹配的所有活动容器记录。 Kubernetes 通过 pod 概念处理这个问题。
    • @Shabirmean 当 C,D,E 尝试访问容器 A 时,他们会从 dns 查询服务 A,DNS 是基于他们加入的网络。在这种情况下,返回的 IP 将位于覆盖 1 中。
    • @NeilS 它不是通过入口,而是通过 DNS 循环!因为客户端可能会连接到失败的 docker 主机,他们必须重试另一个 dns 条目,但是通过 VRRP(keepalived)HAproxy 高可用,在主机失败的情况下没有延迟。
    【解决方案2】:

    现有答案的重要附加信息

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

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

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

    更多详情请阅读https://docs.docker.com/engine/swarm/ingress/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 2017-07-27
      • 2018-01-03
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多