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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文讲的是使用NGINX和NGINX Plus进行Docker Swarm负载均衡【编者的话】本文是一篇有关使用Nginx和Nginx Plus实现Swarm负载均衡方面的文章。
本文讲的是使用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 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服务发现、扩展和容器负载均衡(在图中由小框表示)。
01.png

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

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

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

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

图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容器。
04.png

图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的容器之一。
05.png

图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高可用。
06.png

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

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

图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发出请求来演示内部服务到服务请求。
08.png

图8 NGINX Plus使用Swarm的动态DNS服务发现机制负载均衡后端服务

第二部分显示如何将NGINX Status API与Docker Service API组合,以自动伸缩后端容器。Python程序使用NGINX Plus Status API来监视Service1和Service2上的负载,以及Docker Swarm Service API进行后端容器的伸缩。
09.png

图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负载均衡

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5天前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
15 5
|
19天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
24 4
|
21天前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
18 6
|
21天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
20 5
|
21天前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
14 5
|
20天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
22 3
|
20天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
30 3
|
22天前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
19 4
|
7天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
7天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。