为什么我们(不)在Docker Swarm集群中的多个主机上进行负载均衡?

我们在swarm集群中获得了3个主机,并且在这个集群中部署了一个Web应用程序。 Web应用程序在任何时候都只能运行在一台主机上。 如果一个主机死亡,该Web应用程序将被移动到另一个主机。

Docker将负责将您的请求路由到Web应用程序,无论您的请求命中哪个主机。

为了确保我们总能find正在运行的主机,我们虽然使用Nginx是前端的。 我们将在Nginx上创build一个虚拟主机,它将代理请求发送给Docker群。

我们有两个办法。

答:我们只需在主机上进行“循环”请求。

这是一个简单的方法。 我们将使用Nginx在失败时提供服务。 但是,即使Nginx从主机1得到500错误,也可能是Web应用程序从主机3返回了500错误.Nginx会错误地认为服务在主机1上失败,并将该主机上的服务取出。

B.我们会把所有的要求都指向群领导。

我们不使用Nginx来在主机间进行负载平衡。 我们只需将所有请求发送到Docker Swarm领导者(通过configurationNginx的各种脚本来完成)。 这样,我们就不会做“双重”的负载均衡(Nginx和Docker Swarm) – 但是所有的stream量都只能通过Docker Swarm的领导。

一方面,解决schemeA简单易懂,但也会增加双重负载平衡的复杂性。 第二种解决scheme可能会更加复杂,因为它不太标准,但也可能让事情更容易理解。

我们应该从纯粹的技术angular度来select哪种方法?

我认为这是对备选scheme1的评论。

我也在看这个,从Docker Swarm> 1.12中可以看出,你所要做的就是创build一个反向代理服务/网站。 在我的概念validation中,我做了以下工作:1)创build两个覆盖networking,一个用于代理networking,它将面向外部,一个用于我的服务networking(仅在内部)2)部署服务的3个副本,将其附加到服务覆盖和代理覆盖networking(–network proxy –network my-service)。 最后,我站了一个绑定到我的公司别名的nginx反向代理,它将接受端口80和443上的传入连接。

sudo docker service create --name proxy \ -p 80:80 \ -p 443:443 \ --network proxy \ --mount type=volume,source=reverse-proxy,target=/etc/nginx/conf.d,volume-driver=azurefile \ --mount type=volume,source=ssl,target=/etc/nginx/ssl,volume-driver=azurefile \ nginx 

坐骑只是在那里,所以我不必将文件复制到每个主机。 此挂载指向一个Azure文件存储帐户,这使得更多的容器旋转更可维护。

反向代理如下所示:

 location /my-service/ { proxy_read_timeout 900; proxy_pass http://my-service/; 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; } 

http:// my-service是一个群集内部的DNSlogging,它总是指向我的服务所在的VIP,无论是1个节点还是1000个节点。 从我所知道的情况来看,您部署的每个服务都获得了自己的子网范围,主节点会跟踪容器的运行位置,并为您处理路由。

目前,我们有多个Alogging指向不同的主机IP,并使用循环法,但是我们可能会将此从Windows Server受pipeDNS迁移到Azurestream量pipe理器以获得更多控制权。