Docker 文档中有关 Swarm 模式下 Docker 主机的外部负载均衡器(为什么?)

Docker 文档中有关 Swarm 模式下 Docker 主机的外部负载均衡器(为什么?)

在阅读 Docker Swarm 1.12 的文档时,有一节描述了如何配置 HAProxy 来平衡到群主机的流量负载。

https://docs.docker.com/engine/swarm/ingress/#/configure-an-external-load-balancer

如果我理解 Docker Swarm > 1.12,那么就不需要以这种方式设置负载均衡器,因为 Swarm 具有内部负载均衡器和 DNS。

正确的方法难道不是为服务名称(DNS 别名)建立反向代理并让 Swarm 负载均衡器完成工作吗?

例如在 nginx 中你可以执行以下操作:

location /somepath/ {
    proxy_read_timeout 900;                
    proxy_pass http://service-name/;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

我的假设是,该服务部署到私有网络覆盖,并且需要对外公开的服务部署到私有网络和代理网络,其中也部署了 nginx 或 haproxy 服务。

docker service create 
 --name recurrence-service \
 --replicas 3 \
 --network my-service \
 --network proxy  \
 mycompany/my-web-server

答案1

我认为您的方法听起来不错,而且我认为不需要外部 LB。我们将 ELB 放在我们的前面,但这更多是为了使其与其他服务保持一致,并有一个执行 SSL 的中心位置。

答案2

Swarm Mode 包含内部 DNS 和路由网格,用于提供服务发现并将请求从节点转发到运行服务的节点。这意味着所有节点都将监听已发布的端口(当您使用默认的“入口”模式时),并且该请求将在 Swarm 节点之间内部转发。

但是,当从外部访问服务时,仍然建议使用负载均衡器将请求发送到众多节点之一。这是为了实现高可用性,因为任何一个节点都可能出现故障,而其他节点会接管。如果您将所有请求都发送到一个节点,而该节点发生故障,您将无法访问您的服务,即使其他节点仍然可用并处理请求。

作为备选,您可以使用配置为解析多个 docker 主机的循环 DNS。但是,由于以下几个原因,这种方法不太理想:

  • 在大多数应用程序尝试另一个节点之前,中断仍然需要超时
  • 节点正在接收连接但所有请求都失败的部分中断将导致失败(可以配置负载均衡器以在发送流量之前检查目标的运行状况)

相关内容