问题描述
我决定尝试一下 Nomad,我正在为我公司的副项目搭建一个小型环境。
尽管 Nomad/Consul 上的文档很好而且详细,但它们并没有达到向全世界公开一个小型 Web 服务的简单任务。
按照 this 官方教程使用 Traefik 作为负载均衡器,我如何才能使这些公开的服务可访问?
本教程有一个脚注,说明可以通过端口 8080 从集群外部访问服务。
但是在我有 3 个服务器和 3 个客户端的集群中,我应该将 DNS 指向哪里? 具有指向 3 个客户端的故障转移的 DNS 是否就足够了? 我还需要为客户端使用负载平衡器吗?
解决方法
您可以通过多种方式处理跨服务器分发请求。根据您的部署环境,有些可能比其他更可取。
Fabio 负载均衡器文档中有一个关于 deployment configurations 的部分,我将用作参考。
直接使用 DNS 故障转移
在此模型中,您可以将 DNS 配置为指向所有三个服务器的 IP。客户端将收到所有三个 IP 以响应 DNS 查询,并随机连接到可用实例之一。
如果 IP 运行状况不佳,客户端应该重试对其他 IP 之一的请求,但如果服务器长时间不可用并且客户端可能会遇到响应时间较慢的情况偶尔会将请求路由到那个不可用的 IP。
您可以通过配置您的 DNS 服务器来执行后端实例的运行状况检查(假设它支持它)来缓解此问题。 AWS Route 53 提供了此功能(请参阅 Configuring DNS failover)。如果您的 DNS 服务器不支持健康检查,但提供 API 来更新记录,您可以使用 Consul Terraform Sync 自动添加/删除服务器 IP,因为 Consul 中 Fabio 实例的健康状况发生变化。
负载均衡器背后的法比奥
正如您提到的,另一种选择是将 Fabio 放在负载均衡器后面。如果您在云中部署,这可能是云提供商的 LB。 LB 可以让您更好地控制到 Fabio 的流量路由,提供 TLS/SSL 终止和其他功能。
如果您在本地,则可以使用任何可用的负载均衡器(如 F5、A10、nginx、Apache Traffic Server 等)为其前置。您需要确保以高度可用的方式部署 LB。下一节将介绍有关执行此操作的一些建议。
直接使用 IP 故障转移
无论您是直接在 Internet 上运行 Fabio,还是在负载平衡器后面运行,您都需要确保客户端连接的 IP 具有高可用性。
如果您在本地部署,实现此目的的一种方法是为每个 Fabio 服务器分配一个公共环回 IP(例如 192.0.2.10),然后使用 L2 冗余协议,如 {{3} } (VRRP) 或 L3 路由协议(如 BGP)以确保网络将请求路由到可用实例。
L2 故障转移
Virtual Router Redundancy Protocol 是 Linux 的 VRRP 守护进程。网上可以找到很多安装和配置教程。
具有 BGP 的 L3 故障转移
Keepalived 是一个建立在 GoCast 上的 BGP 守护进程,它根据健康检查的状态有条件地向上游网络通告 IP。此工具的作者发表了一篇名为 GoBGP 的博文,其中介绍了在 Nomad 上部署 GoCast 并将其配置为使用 Consul 获取健康信息的过程。
使用静态 IP 进行 L3 故障转移
如果您在本地部署,比上述两种解决方案更简单的配置可能是配置您的路由器以根据对后端实例的运行状况检查安装/删除静态路由。 Cisco 路由器通过其 IP SLA 功能支持这一点。本教程介绍了基本设置配置 BGP based Anycast as a Service。
如您所见,有很多方法可以为 Fabio 或上游 LB 配置 HA。如果不了解您的环境,就很难提供好的建议。希望这些建议之一对您有用。