如何设置 Traefik 以实现 HA?Traefik 前面需要反向代理吗?

如何设置 Traefik 以实现 HA?Traefik 前面需要反向代理吗?

我正在尝试在生产站点上设置 Traefik,但遇到了一些高可用性问题。我认为我们仍然需要在 Traefik 集群前面设置反向代理。以下是我考虑过的潜在设置,以及为什么似乎需要反向代理:

  1. 设置 DNS A 记录指向每个 Traefik 节点,以实现负载平衡和故障转移。

    • 多个网站不鼓励这种做法,包括这个问题这个科幻问题

    • 由于 DNS 缓存和 TTL 问题,甚至使用 DNSMadeEasy 这样的服务似乎也不受欢迎。

  2. 将一条 DNS 记录指向运行 Traefik 的节点之一。

    • 该节点成为 SPOF。我的节点在 CoreOS 上运行,每次更新后都会重新启动,因此我们每周肯定会有几分钟的停机时间。

    • 我们可以随时将 DNS 记录移至备用节点,无论何时预计会出现停机。手动管理起来会很麻烦。我可以设想一个与 locksmithd 配对的解决方案来自动处理这个问题,但我真的不想构建它,而且它也无法处理意外停机。

    • 使用 Docker Swarm(或 Kubernetes)的部分原因是使节点可互换。

  3. 在 Traefik 集群前面放置一个负载均衡器/反向代理。反向代理可以在所有 Traefik 节点之间提供故障转移,DNS 将指向反向代理。

    • 是的,这是一个 SPOF,但根据我的经验,使用此设置很容易获得良好的正常运行时间。如果需要偶尔进行维护,DNS 记录可以指向新的代理。

我是不是忽略了什么或者想太多了?

答案1

有不同类型的解决方案。

1)在 Swarm/Kubernetes 集群前构建自己的 HA 负载均衡器来分配流量并执行故障转移。

市面上有很多不同的电器:

  1. Netscaler
  2. 坎普
  3. F5

虽然这种方法是 HA,但通常并不便宜。

一个更便宜的替代方案可能是Nginx/Haproxy 和 Keepalived设置。

然而你当然需要一个浮动 IP 并且必须照顾 arp 缓存。

2)使用“云负载均衡器”。Digital Ocean、AWS、GKE、Openstack 都提供这样的功能。它更容易设置(大多数时候),但如果它更便宜,你就得计算一下了。

在 DigitalOcean 上,LB 只需 20 美元,并且有一个带有托管 Kubernetes 集群的 Beta 版。您可能想了解一下。所有组件都可以很好地组合在一起 https://www.digitalocean.com/products/kubernetes/

3) 如果您的应用程序不是 100% 关键,我可以建议您使用迄今为止使用过的特殊解决方案:

Cloudflare + 低 TTL +https://github.com/Berndinox/cloudflare-ddns

它的工作原理很简单:https://github.com/Berndinox/compose-v3-collection/blob/master/wordpress/www.yml 如何:它启动 WordPress 及其所有要求,包括 DNS 容器。DNS 容器正在更新 Cloudflare 上域的 DNS 记录(取决于容器启动的主机,IP 不同)。很好,如果重新启动一个主机或容器健康检查失败,则重新安排容器。重新安排后,主机最初处于离线状态,容器将在另一个主机上启动,然后将新 IP 推送到 Cloudflare。这一切都是自动发生的,无需执行任何操作。:)

Cloudflare TTL 确实很低,因此可能只会有几秒钟的停机时间。

答案2

如果您想在 Traefik 之上“推出自己的” HA 层,我建议您从稍微不同的角度来考虑。我在日常工作中使用 Netscalers(Citrix 将其重新命名为“ADC”),我的建议是让 Traefix 充当 ADC……如果您能做到这一点的话。在 ADC 世界中,这将是一个“单臂 HA 对”,并且*应该以主动-被动(而不是主动-主动)的方式运行。

设置多个 Traefik 实例,使用不同的 IP。在我的示例中,我使用 10.0.1.11 和 10.0.1.12。这些 IP 应用于任何操作系统修补,或除反向代理流量之外的任何其他操作。在 ADC 中,这些是 NSIP 条目。

在每个实例上配置第二个网络接口 (IF) 和第三个“浮动” IP。例如,我使用 10.0.1.10。在 ADC 中,这将是一个 SNIP。*确保此 IF 在设置期间保持关闭状态,否则您将遇到 IP 地址冲突。还要将此 IF 配置为*不在启动时自动启动。将 Traefik 配置为仅将此 IP 用于反向代理流量。

接下来,您必须弄清楚如何保持实例的配置“同步”。我对 Traefik 有点陌生,所以我对此不确定……但如果 Traefik 表现良好,请使用 NFS 共享将配置存储在一个位置,并安装在所有节点上。将 NFS 安装在正确的位置,或使用软链接。如果 Traefik 对此表现不佳(或者您没有好的 NFS),那么也许可以将配置存储在 git repo 中,并使用脚本同步它们……或者使用 rsyc……或(Ansible|Puppet|salt|etc)……或……或……显然这里需要做更多工作。您可能需要在配置更新时编写重新启动服务的脚本……不确定。这显然需要小心完成,以便所有节点不会同时重新启动服务。

现在配置 Corosync 堆栈以管理哪个实例处于“启动”状态。可以配置 Corosync 堆栈以使具有“浮动 IP”10.0.1.10 的 IF 仅在一个实例上可用,并管理所有实例上服务的启动和停止。除 IF 外,所有服务的“正常”状态都需要为“启动”。这样,如果 Corosync 堆栈需要“关闭”一个实例上的 IF,并“启动”另一个实例上的 IF,则几乎不会中断。调整以下说明: https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and-floating-ips-on-ubuntu-14-04

最后,输入您的 DNS 条目以指向“浮动 IP”10.0.1.10。

结果是您*应该能够管理实例、同步配置并修补 IP 10.0.1.11 和 10.0.1.12 上的操作系统,而只有一个实例始终具有 IP 10.0.1.10 可用于管理反向代理流量。

我正在考虑设置类似的东西,如果可以的话,我会提供更新。

或者按照 Berndinox 的建议,花钱购买一些你不需要设计的东西,你知道这些东西会起作用。根据我的经验,ADC 效果很好。

相关内容