AWS Route 53 作为 ROSA 的负载均衡器
本指南介绍了当 Keycloak 部署的特定站点出现故障时如何实现自动客户端故障转移。
Route 53 客户端故障转移
为了提供客户端故障转移,我们可以利用 AWS Route 53 的 DNS 故障转移 功能,当主站点出现故障时自动重新路由流量。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 部署将更新为使用新的主机名。
请查看下方新增元素(绿色)和已更新元素(黄色)。
为了确保故障的主站点无法在没有用户输入的情况下被标记为健康状态(例如,在 ROSA 集群自动重启的情况下),我们创建了一个 AWS SNS 主题,该主题会在主站点健康检查失败时触发事件。此主题用于触发一个 AWS Lambda 函数,该函数会将健康检查更新为指向一个不存在的端点 /lb-check-failed-over
。为了从备份集群故障恢复到主集群,需要手动将健康检查更新回 /lb-check
。
设置新的 Route 53 故障转移
流程
-
创建两个 ROSA 集群
-
创建子域记录和健康检查
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
-
像往常一样部署 Keycloak,但需要设置以下环境变量。
-
主集群
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
-
备份集群
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
-
测试故障转移
要测试从主站点到备份站点的故障转移,请执行以下操作
-
验证
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_CLUSTER
和BACKUP_CLUSTER
设置为相同的 ROSA 集群,则此脚本将失败。 -
登录主 ROSA 集群,从 keycloak 命名空间中删除
aws-health-route
路由。 -
等待大约 30 秒,让健康检查确定
primary.<generated-subdomain>.keycloak-benchmark.com
不再处于健康状态。可以通过检查 AWS 控制台中的健康检查 来确认这一点。 -
执行第一步中的脚本,应返回退出代码
1
。