在阅读 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。但是,由于以下几个原因,这种方法不太理想:
- 在大多数应用程序尝试另一个节点之前,中断仍然需要超时
- 节点正在接收连接但所有请求都失败的部分中断将导致失败(可以配置负载均衡器以在发送流量之前检查目标的运行状况)