本文讲的是使用NGINX和NGINX Plus进行Docker Swarm负载均衡【编者的话】本文是一篇有关使用Nginx和Nginx Plus实现Swarm负载均衡方面的文章。
在2016年九月奥斯丁nginx.conf大会上,我做了一个关于如何在Docker Swarm集群中使用NGINX和NGINX Plus的 介绍 。在本文中,我将讨论如何结合Docker 1.12中引入的功能使用NGINX和NGINX Plus进行Docker Swarm负载均衡。所有演示示例中使用的文件在GitHub上都可以找到。
同时,Docker API已经朝着认知服务方面进行扩展,这些服务是使用相同镜像的容器集(类似于Docker Compose中的服务,但具有更多功能)。您可以创建和扩展服务,执行回滚更新,创建运行状况检查等。此外,内置了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服务的必要端口暴露在集群上,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配置中,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用以海鲜服务实例之间负载负载
图8 NGINX Plus使用Swarm的动态DNS服务发现机制负载均衡后端服务
第二部分显示如何将NGINX Status API与Docker Service API组合,以自动伸缩后端容器。Python程序使用NGINX Plus Status API来监视Service1和Service2上的负载,以及Docker Swarm Service API进行后端容器的伸缩。
图9 Docker Swarm使用NGINX Plus实时活动监视来跟踪服务负载以实现自动伸缩
在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层负载均衡器。许多应用程序需要额外的功能,如下所示:
- SSL/TLS终端
- 基于内容的路由(例如,基于URL或header)
- 访问控制和授权
- 重写和重定向
此外,您可能已经具有负载均衡器的经验,与Swarm一起使用它,能够充分利用已有的工具和您丰富的知识。
使用开源的 NGINX 和 NGINX Plus
开源NGINX和NGINX Plus是两个负载均衡器,提供了Swarm自身负载均衡器缺少的关键应用功能。使用开源 NGINX
开源的NGINX软件提供了前面提到的功能(SSL/TLS终端等),包括:- 负载均衡算法的选择
- 多种协议,例如HTTP/2和WebSocket
- 可配置的日志记录
- 流量限制,包括请求速率,带宽和连接数
- 高级用例的脚本,使用Lua,Perl和JavaScript(使用nginScript动态模块)
- 安全功能(例如白名单和黑名单)
使用开源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 Plus支持会话耗尽。
- 动态重新配置——这提供了伸缩后端的能力,而不需要更改和重新加载NGINX配置。这在使用诸如Swarm的微服务平台进行服务发现时尤其有用,它是允许NGINX Plus与这些平台完全集成的最重要的功能之一。
有两种动态重新配置方法:一种是通过API允许您将更改推送到NGINX Plus;另一种是DNS,NGINX Plus会持续检查连接到域名的节点数量的变化,在NGINX Plus演示中使用的就是这种方法,用以集成Swarm中内置的服务发现。 - 实时活动监控——提供用于从NGINX Plus获取大量指标的API,以及基于API构建的Web信息中心,您可以在其中查看指标以及添加,删除和更改后端服务器。
在上述开源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 上找到。三个示例如下:Docker Swarm负载均衡
这个示例是使用Docker Swarm负载均衡请求到一个简单的web应用后端,没有NGINX或NGINX Plus。使用开源NGINX的Docker Swarm负载均衡
这个示例添加了开源的NGINX,为外部请求提供SSL/TLS卸载。Swarm负载均衡器将请求分发到与上一个演示中相同的简单Web应用程序后端,并处理内部服务到服务请求。使用NGINX Plus的Docker Swarm负载均衡
这个示例有两部分。第一部分使用NGINX Plus,它除了执行SSL/TLS卸载外,还将请求直接加载到后端容器,并处理内部服务到服务请求。它与Swarm服务发现集成,使用动态DNS来频繁地重新解析与后端关联的域名。NGINX Plus负载平衡两个后端服务Service1和Service2。它通过让Service1向Service2发出请求来演示内部服务到服务请求。图8 NGINX Plus使用Swarm的动态DNS服务发现机制负载均衡后端服务
第二部分显示如何将NGINX Status API与Docker Service API组合,以自动伸缩后端容器。Python程序使用NGINX Plus Status API来监视Service1和Service2上的负载,以及Docker Swarm Service API进行后端容器的伸缩。
图9 Docker Swarm使用NGINX Plus实时活动监视来跟踪服务负载以实现自动伸缩
总结
Docker 1.12中引入的新功能使Swarm成为一个更强大的平台,也可以通过利用开源NGINX和NGINX Plus来进一步增强。NGINX Plus使用DNS动态重新配置后端容器实现负载均衡的能力,加上Status API提供的可见性,是一个非常强大的容器解决方案。原文链接:Docker Swarm Load Balancing with NGINX and NGINX Plus(翻译:肖远昊)
原文发布时间为:2017-02-02
本文作者:肖远昊
本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
原文标题:使用NGINX和NGINX Plus进行Docker Swarm负载均衡