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 是否连接到主站点。

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

    如果 client. 子域指向与 primary. 子域相同的 IP,则脚本将返回 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