今年 9 月在奥斯汀举行的 nginx.conf 2016 上,我做了一个关于在 Docker Swarm 集群中使用 NGINX 和 NGINX Plus 的演示。 在本文中,我将讨论如何结合 Docker 1.12 中引入的功能使用 NGINX 和 NGINX Plus 实现 Docker Swarm 负载均衡。 我在 nginx.conf 演示中使用的所有文件(以及更多)都可以在 GitHub 上找到,供您尝试。
Docker 1.12版本于2016年7月下旬发布,集成了Docker Engine和Swarm,并添加了一些新的编排功能,以创建一个类似于Kubernetes等其他容器平台的平台。 在 Docker 1.12 中,Swarm 模式允许您将一组 Docker 主机组合成一个swarm ,从而提供容错、自我修复、分散的架构。 新平台还可以更轻松地设置 Swarm 集群,使用密钥保护所有节点,并使用 TLS 加密节点之间的所有通信。
同时,Docker API 也得到了扩展,可以感知服务,即使用相同镜像的容器集合(类似于 Docker Compose 中的服务,但具有更多功能)。 您可以创建和扩展服务、进行滚动更新、创建健康检查等等。 内置 DNS 服务发现和负载均衡,您还可以设置集群范围的覆盖网络。
为了本次讨论和演示,我有三个 Swarm 节点——一个管理器节点和两个工作节点。 管理器节点是运行 Swarm 命令的地方。 Swarm 处理所有节点上的调度、DNS 服务发现、扩展和容器负载均衡(在图中用小框表示)。
为了在集群内的容器之间提供私有网络通信,容器可以连接到横跨集群中所有节点的多个内部覆盖网络。 容器可以通过 Swarm 负载均衡器暴露在集群外部。
Docker Swarm 负载均衡器在每个节点上运行,并且可以在集群中任何主机上的任何容器之间平衡负载请求。 在没有 NGINX 或 NGINX Plus 的 Swarm 部署中,Swarm 负载均衡器处理入站客户端请求(图 3 中用绿色箭头表示)以及内部服务到服务请求(用红色箭头表示)。
既然 Swarm 包含负载均衡,为什么还需要另一个负载均衡器? 原因之一是 Swarm 负载均衡器是一个基本的第 4 层(TCP)负载均衡器。 许多应用需要附加功能,例如这些,仅举几例:
此外,您可能已经具有使用负载均衡器的经验,并且能够将其与 Swarm 一起使用,让您能够利用已经在使用的工具和知识。
NGINX Open Source 和 NGINX Plus 是两个负载均衡器,它们提供了本机 Swarm 负载均衡器所缺少的应用关键功能。
NGINX 开源提供了前面提到的功能(SSL/TLS 终止等)以及更多功能,其中包括:
使用 NGINX 开源的最简单方法是将其部署为服务,并带有一个或多个容器。 NGINX 服务所需的端口在集群上暴露,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 的某个容器。
可以让 NGINX 直接将负载平衡请求发送到后端容器,也可以处理内部服务到服务的请求,但需要一个更复杂的解决方案,即每次扩展服务 A 时都需要更改和重新加载 NGINX 配置。 稍后我将讨论如何使用 NGINX Plus 轻松实现这一点。
NGINX Plus 提供的一些附加功能包括:
动态重新配置——这提供了扩大和缩小后端的能力,而无需更改和重新加载 NGINX 配置。 这在使用 Swarm 等微服务平台进行服务发现时特别有用,并且它是允许 NGINX Plus 与这些平台完全集成的最重要的功能之一。
有两种动态重新配置方法:一种是允许您将更改推送到 NGINX Plus 的 API,另一种是 DNS,NGINX Plus 会不断检查附加到域名的节点数量的变化。 这是 NGINX Plus 演示中用于与 Swarm 中的内置服务发现集成的方法。
在上面描述的 NGINX 开源配置中,Swarm 负载均衡器既将外部请求分发到后端容器,又处理它们之间的服务到服务请求。 NGINX 的作用是 SSL/TLS 卸载。
使用 NGINX Plus 时,来自外部客户端的客户端请求首先到达 Swarm 负载均衡器,但 NGINX Plus 会将实际的负载均衡到后端容器(图 6)。 让客户端请求首先到达 Swarm 负载均衡器提供了一种实现 NGINX Plus 高可用性的简单方法。
类似地,Swarm 负载均衡器接收服务间请求,但 NGINX Plus 实际上将它们分配给服务(图 7)。
为了提供一些使用 Swarm 进行 Docker 负载均衡(带或不带 NGINX)的示例,我创建了三个演示。 这些演示的所有文件以及详细说明均可在GitHub上找到。 这三次示威活动分别是:
这演示了 Docker Swarm 对简单的 Web 应用后端的请求进行负载均衡,无需 NGINX 或 NGINX Plus。
此演示添加了 NGINX 开源,为外部请求提供 SSL/TLS 卸载。 Swarm 负载均衡器将请求分发到与上一个演示中相同的简单 Web 应用程序后端,并处理内部服务到服务的请求。
该演示分为两部分。 第一部分使用 NGINX Plus,除了执行 SSL/TLS 卸载之外,它还将请求直接负载均衡到后端容器,并处理内部服务到服务的请求。 它与 Swarm 服务发现集成,使用动态 DNS 频繁重新解析与后端关联的域名。 NGINX Plus 正在平衡两个后端服务Service1和Service2 的负载。 它通过让Service1向Service2 发出请求来演示内部服务到服务的请求。
第二部分展示了如何结合 NGINX 状态 API 与 Docker 服务 API 来自动扩展后端容器。 Python 程序使用 NGINX Plus Status API 来监视Service1和Service2上的负载,并使用 Docker Swarm Service API 来扩大或缩小后端容器。
Docker 1.12 中引入的新功能使 Swarm 成为一个更强大的平台,但它可以通过利用 NGINX 开源得到增强,甚至可以通过使用 NGINX Plus 得到进一步增强。 NGINX Plus 能够动态地重新配置后端容器以使用 DNS 进行负载平衡,并且 Status API 提供的可见性使其成为非常强大的容器解决方案。
要试用 NGINX Plus,请立即开始30 天免费试用或联系我们讨论您的用例。
并尝试我们的GitHub存储库中提供的演示。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”