AWS Route 53 作為 ROSA 的負載平衡器

本指南說明如何在特定站點發生故障時,實現 Keycloak 部署的自動用戶端故障轉移。

Route 53 用於用戶端故障轉移

為了提供用戶端故障轉移,我們可以利用 AWS Route 53DNS 故障轉移功能,在主要站點關閉時自動重新路由流量。AWS 上的健康檢查會每 30 秒檢查一次站點是否有回應,並且用戶端看到的 DNS 將會相應地更新。

此腳本會產生一個子網域名稱,並為我們的根網域 keycloak-benchmark.com 提供三個額外的主機條目。

primary.<產生的子網域>.keycloak-benchmark.com

Keycloak 站點 1 的子網域

backup.<產生的子網域>.keycloak-benchmark.com

Keycloak 站點 2 的子網域

client.<產生的子網域>.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.<產生的子網域>.keycloak-benchmark.com 連線至主要站點。

    ./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.<產生的子網域>.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