Nomad 高可用性与 Traefik

Nomad High Availability with Traefik

我决定尝试一下 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). If your DNS server does not support health checking, but provides an API to update records, you can use Consul Terraform Sync 随着 Consul 中 Fabio 实例的健康状况发生变化,自动执行 adding/removing 服务器 IP。

负载均衡器背后的 Fabio

正如您提到的,另一种选择是将 Fabio 置于负载平衡器之后。如果您在云中部署,这可能是云提供商的 LB。 LB 可以让您更好地控制到 Fabio 的流量路由,提供 TLS/SSL 终止和其他功能。

如果您在本地,您可以使用任何可用的负载均衡器作为前端,例如 F5、A10、nginx、Apache Traffic Server 等。您需要确保以高度可用的方式部署 LB。下一节将介绍执行此操作的一些建议。

直接使用 IP 故障转移

无论您是 运行 Fabio 直接在 Internet 上,还是在负载平衡器后面,您都需要确保客户端连接到的 IP 高度可用。

如果您在本地部署,实现此目的的一种方法是为每个 Fabio 服务器分配一个公共环回 IP(例如 192.0.2.10),然后使用 L2 冗余协议,例如 Virtual Router Redundancy Protocol (VRRP) 或 BGP 等 L3 路由协议,以确保网络将请求路由到可用实例。

L2 故障转移

Keepalived 是 Linux 的 VRRP 守护进程。在网上可以找到很多安装和配置的教程。

带 BGP 的 L3 故障转移

GoCast is a BGP daemon built on GoBGP which conditionally advertises IPs to the upstream network based on the state of health checks. The author of this tool published a blog post titled BGP based Anycast as a Service 介绍了在 Nomad 上部署 GoCast,并将其配置为使用 Consul 获取健康信息。

使用静态 IP 的 L3 故障转移

如果您在本地部署,比上述两种解决方案更简单的配置可能是将您的路由器配置为 install/remove 基于对后端实例的健康检查的静态路由。 Cisco 路由器通过其 IP SLA 功能支持这一点。本教程介绍基本设置配置 http://www.firewall.cx/cisco-technical-knowledgebase/cisco-routers/813-cisco-router-ipsla-basic.html.

如您所见,有许多方法可以为 Fabio 或上游 LB 配置 HA。在不了解您的环境的情况下很难提供好的建议。希望这些建议之一对您有用。