专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
51好读  ›  专栏  ›  分布式实验室

使用NGINX和NGINX Plus进行Docker Swarm负载均衡

分布式实验室  · 公众号  · 后端  · 2017-02-03 07:48

正文

在2016年九月奥斯丁nginx.conf大会上,我做了一个关于如何在Docker Swarm集群中使用NGINX和NGINX Plus的介绍(下面视频即是)。在本文中,我将讨论如何结合Docker 1.12中引入的功能使用NGINX和NGINX Plus进行Docker Swarm负载均衡。所有演示示例中使用的文件在GitHub上都可以找到。


概述

Docker 1.12版本,在2016年7月下旬发布,集成了Docker Engine和Swarm,并添加了一些新的编排功能,创建一个类似于其他容器平台(例如Kubernetes)的平台。在Docker 1.12中,Swarm模式允许您将一组Docker主机组合成一个群集,提供一种容错、自我修复的分散式架构。这种新平台设置Swarm集群更加容易,并且使用密钥保护所有节点,节点之间的所有通信都通过TLS加密。

同时,Docker API已经朝着认知服务方面进行扩展,这些服务是使用相同镜像的容器集(类似于Docker Compose中的服务,但具有更多功能)。您可以创建和扩展服务,执行回滚更新,创建运行状况检查等。此外,内置了DNS服务发现和负载均衡,您可以设置覆盖集群范围的网络。

Docker Swarm负载均衡拓扑

在本次讨论与演示中,我创建了三个Swarm结点——一个master结点和两个worker结点。 注意:在演示文稿的幻灯片中,结点被标注为Swarm Manager和Swarm Node 在Master结点上可以运行Swarm命令。Swarm在所有结点上进行调度、DNS服务发现、扩展和容器负载均衡(在图中由小框表示)。


图1 一个master结点两个worker结点的Docker Swarm集群

要在集群内的容器之间提供私有网络通信,容器可以连接到跨集群所有节点的多个内部覆盖网络。容器可以通过Swarm负载均衡器连接集群外部。


图2 Docker Swarm集群内外网络连接图

Docker Swarm负载均衡器运行在每个节点上,可以在集群中任何主机上跨容器负载均衡请求。在没有NGINX或NGINX Plus的Swarm部署中,Swarm负载均衡器处理入站客户端请求(由图3中的绿色箭头表示)以及内部服务到服务请求(由红色箭头表示)。


图3 在没有NGINX或NGINX Plus的集群中客户端和服务到服务请求的负载均衡

既然Swarm拥有负载均衡,为什么需要另一个负载均衡器? 一个原因是Swarm负载均衡器是TCP层负载均衡器。许多应用程序需要额外的功能,如下所示:

此外,您可能已经具有负载均衡器的经验,与Swarm一起使用它,能够充分利用已有的工具和您丰富的知识。

使用开源的 NGINX 和 NGINX Plus

开源NGINX和NGINX Plus是两个负载均衡器,提供了Swarm自身负载均衡器缺少的关键应用功能。

使用开源 NGINX

开源的NGINX软件提供了前面提到的功能(SSL/TLS终端等),包括:

使用开源NGINX的最简单的方法是将其部署为具有一个或多个容器的服务。 NGINX服务的必要端口暴露在集群上,Swarm负载均衡器将这些端口上的请求分发到NGINX容器。


图4 Swarm负载均衡器在实例之间分配对NGINX服务的请求

在本示例中,NGINX提供的服务是SSL/TLS终端。为了说明这是如何工作的,我们在集群中部署后端服务A,并将其扩展为具有三个容器(一个节点上有两个实例,另一个节点上有一个实例,如图5所示)。Swarm向服务A分配虚拟IP地址(VIP),用以在群集内使用。我们在服务A上游组的NGINX配置中使用此VIP,而不是列出容器的各个IP地址。这样我们可以扩展服务A,而不必更改NGINX配置。

如图5所示,当客户端向第一个Swarm节点发出服务A请求时,该节点上的Swarm负载均衡器将请求路由到NGINX。NGINX处理请求,进行SSL/TLS解密,并将其路由到服务A的VIP。Swarm负载均衡器将任何Swarm节点上的(现在未加密的)请求路由到服务A的容器之一。


图5 NGINX为外部客户端请求提供SSL/TLS终端功能

NGINX可以直接向后端容器提供负载均衡请求,并且还可以处理内部服务到服务请求,但是解决方案更为复杂,每次对服务A进行扩展时,需要更改和重新加载NGINX配置。稍后将讨论如何使用NGINX Plus更容易完成。

使用NGINX Plus

NGINX Plus提供的一些附加功能包括:

活跃应用健康检查——NGINX Plus会持续检查后端节点,以确保其正常运行并正确响应,并从负载均衡轮换中删除不正常的节点。

在上述开源NGINX配置中,Swarm负载均衡器将外部请求分发到后端容器,并在其中处理服务到服务请求。NGINX的作用是SSL/TLS卸载。

当使用NGINX Plus时,来自外部客户端的客户端请求首先访问Swarm负载均衡器,而NGINX Plus对后端容器进行实际负载均衡(图6)。有客户端请求到达Swarm负载均衡器时,提供一个简单的方法使NGINX Plus高可用。


图6 Docker Swarm负载均衡器将客户端请求转发到NGINX Plus用以实现服务实例之间负载均衡

类似地,Swarm负载均衡器接收服务间请求,而NGINX Plus实际上在服务之间分发它们(图7)。



图7 Docker Swarm负载均衡器将服务间请求转发到NGINX Plus用以海鲜服务实例之间负载负载


示例

为了提供一些在使用和不使用NGINX的情况下使用Swarm for Docker负载均衡的例子,我创建了三个示例。所有这些演示的文件以及详细的说明都可以在GitHub(https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-swarm-demo)上找到。三个示例如下:







请到「今天看啥」查看全文