AWS Route 53 作为 ROSA 的负载均衡器

本指南描述了当给定站点发生故障时,如何实现 Keycloak 部署的自动客户端故障转移。

Route 53 用于客户端故障转移

为了提供客户端故障转移,我们可以利用 AWS Route 53DNS 故障转移 功能,以便在主站点宕机时自动重新路由流量。AWS 上的健康检查每 30 秒检查一次站点是否响应,客户端看到的 DNS 将相应更新。

此脚本生成一个子域名名称,以及我们根域名 keycloak-benchmark.com 的三个进一步的主机条目。

primary.<generated-subdomain>.keycloak-benchmark.com

Keycloak 站点 1 的子域名

backup.<generated-subdomain>.keycloak-benchmark.com

Keycloak 站点 2 的子域名

client.<generated-subdomain>.keycloak-benchmark.com

Keycloak 客户端使用的子域名,在发生故障时将自动从站点 1 故障转移到站点 2。

这些 DNS 条目已在 OpenShift 集群中注册,以便它们响应对该主机名的请求。设置完成后,Keycloak 部署将更新为使用新的主机名。

请参见下面新创建的元素(绿色)和更新的元素(黄色)。

route 53 configuration.dio

为了确保在没有用户输入的情况下,故障的主站点不会被标记为健康,例如在自动 ROSA 集群重启的情况下,我们创建了一个 AWS SNS 主题,每当主健康检查失败时,该主题都会触发一个事件。此主题用于触发一个 AWS Lambda 函数,该函数将健康检查更新为指向不存在的端点 /lb-check-failed-over。为了从备份集群故障恢复到主集群,需要手动将健康检查更新回 /lb-check

设置新的 Route 53 故障转移

先决条件

keycloak-benchmark.com 的托管区域已存在

步骤

  1. 创建两个 ROSA 集群

  2. 创建子域名记录和健康检查

    PRIMARY_CLUSTER=<name-rosa-cluster> \
    BACKUP_CLUSTER=<name-of-rosa_cluster> \
    ./provision/aws/route53/route53_create.sh

    记下脚本生成的域名和 URL,以供后续步骤使用。子域名名称的生成部分允许在不同的集群中存在多个 Keycloak 实例。

    Domain: <generated-subdomain>.keycloak-benchmark.com
    Client Site URL: client.<generated-subdomain>.keycloak-benchmark.com
    Primary Site URL: primary.<generated-subdomain>.keycloak-benchmark.com
    Backup Site URL: backup.<generated-subdomain>.keycloak-benchmark.com
  3. 正常部署 Keycloak,但需要设置以下环境变量。

    1. 主集群

      KC_HOSTNAME_OVERRIDE=client.<generated-subdomain>.keycloak-benchmark.com # Hostname used by clients
      KC_HEALTH_HOSTNAME=primary.<generated-subdomain>.keycloak-benchmark.com # Hostname used by AWS health checks
    2. 备份集群

      KC_HOSTNAME_OVERRIDE=client.<generated-subdomain>.keycloak-benchmark.com # Hostname used by clients
      KC_HEALTH_HOSTNAME=backup.<generated-subdomain>.keycloak-benchmark.com # Hostname used by AWS health checks

测试故障转移

要测试从主站点到备份站点的故障转移,请执行以下操作

  1. 验证 client.<generated-subdomain>.keycloak-benchmark.com 连接到 primary。

    ./provision/aws/route53/route53_test_primary_used.sh <generated-subdomain>.keycloak-benchmark.com; echo $?

    如果 client. 子域名指向的 IP 与 primary. 子域名相同,则脚本返回 0

    如果 PRIMARY_CLUSTERBACKUP_CLUSTER 设置为相同的 ROSA 集群,则此脚本将失败。
  2. 登录到主 ROSA 集群,并从 keycloak 命名空间中删除 aws-health-route 路由。

  3. 等待约 30 秒,让健康检查确定 primary.<generated-subdomain>.keycloak-benchmark.com 不再健康。这可以通过在 AWS 控制台 中检查健康检查来确认。

  4. 执行第一步的脚本,应返回退出代码 1

测试故障恢复

要从备份集群故障恢复到主集群,需要执行以下操作

  1. PRIMARY_CLUSTER 上重新创建 aws-health-route

  2. 将主集群 Route53 健康检查的 ResourcePath 更新为 /lb-check

一旦完成这两个操作,健康检查最终将通过,并且 client. 记录将恢复将请求路由到主集群。

移除 Route 53 故障转移

要删除生成的子域名,包括健康检查,请运行以下命令。

SUBDOMAIN=<generated-subdomain> \
./provision/aws/route53/route53_delete.sh