部署 AWS Global Accelerator 負載平衡器

負載平衡器的建構區塊

本主題描述部署 AWS Global Accelerator 以在多站點 Keycloak 部署之間路由流量的必要步驟。

此部署旨在與多站點部署的概念指南中描述的設定一起使用。請將此部署與多站點部署的建構區塊指南中概述的其他建構區塊一起使用。

我們提供這些藍圖,以展示一個最小功能完整範例,該範例具有常規安裝的良好基準效能。您仍然需要根據您的環境和組織的標準與安全最佳實務進行調整。

目標對象

本指南描述如何部署 AWS Global Accelerator 執行個體,以處理多個可用區域 Keycloak 部署的 Keycloak 用戶端連線故障轉移。

架構

為了確保使用者請求路由到每個 Keycloak 站點,我們需要利用負載平衡器。為了防止用戶端 DNS 快取問題,實作應使用靜態 IP 位址,該位址在將用戶端路由到兩個可用區域時保持不變。

在本指南中,我們將描述如何通過 AWS Global Accelerator 負載平衡器路由所有 Keycloak 用戶端請求。如果 Keycloak 站點發生故障,加速器會確保所有用戶端請求都路由到其餘健康的站點。如果兩個站點都被標記為不健康,則加速器將「故障開放」,並將請求轉發到隨機選擇的站點。

accelerator multi az.dio
圖 1. AWS Global Accelerator 故障轉移

在兩個 ROSA 叢集上建立 AWS 網路負載平衡器 (NLB),以便使 Keycloak Pod 作為 AWS Global Accelerator 執行個體的端點可用。每個叢集端點都被分配一個權重 128(最大權重 255 的一半),以確保當兩個叢集都健康時,加速器流量會平均路由到兩個可用區域。

先決條件

  • 基於 ROSA 的多可用區域 Keycloak 部署

步驟

  1. 建立網路負載平衡器

    在每個 Keycloak 叢集上執行以下操作

    1. 登入 ROSA 叢集

    2. 建立 Kubernetes 負載平衡器服務

      命令
      cat <<EOF | kubectl apply -n $NAMESPACE -f - (1)
        apiVersion: v1
        kind: Service
        metadata:
          name: accelerator-loadbalancer
          annotations:
            service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: accelerator=${ACCELERATOR_NAME},site=${CLUSTER_NAME},namespace=${NAMESPACE} (2)
            service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
            service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/lb-check"
            service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "https"
            service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "10" (3)
            service.beta.kubernetes.io/aws-load-balancer-healthcheck-healthy-threshold: "3" (4)
            service.beta.kubernetes.io/aws-load-balancer-healthcheck-unhealthy-threshold: "3" (5)
        spec:
          ports:
          - name: https
            port: 443
            protocol: TCP
            targetPort: 8443
          selector:
            app: keycloak
            app.kubernetes.io/instance: keycloak
            app.kubernetes.io/managed-by: keycloak-operator
          sessionAffinity: None
          type: LoadBalancer
      EOF
      1 $NAMESPACE 應替換為您的 Keycloak 部署的命名空間
      2 將其他標籤新增至 AWS 建立的資源,以便我們稍後檢索它們。ACCELERATOR_NAME 應為後續步驟中建立的 Global Accelerator 名稱,而 CLUSTER_NAME 應為目前站點的名稱。
      3 健康檢查探針的執行頻率(以秒為單位)
      4 NLB 被視為健康必須通過的健康檢查次數
      5 NLB 被視為不健康必須失敗的健康檢查次數
    3. 記下 DNS 主機名稱,稍後會用到

      命令
      kubectl -n $NAMESPACE get svc accelerator-loadbalancer --template="{{range .status.loadBalancer.ingress}}{{.hostname}}{{end}}"
      輸出
      abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com
  2. 建立 Global Accelerator 執行個體

    命令
    aws globalaccelerator create-accelerator \
      --name example-accelerator \ (1)
      --ip-address-type DUAL_STACK \ (2)
      --region us-west-2 (3)
    1 要建立的加速器名稱,根據需要更新
    2 可以是 'DUAL_STACK' 或 'IPV4'
    3 所有 globalaccelerator 命令都必須使用區域 'us-west-2'
    輸出
    {
        "Accelerator": {
            "AcceleratorArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71", (1)
            "Name": "example-accelerator",
            "IpAddressType": "DUAL_STACK",
            "Enabled": true,
            "IpSets": [
                {
                    "IpFamily": "IPv4",
                    "IpAddresses": [
                        "75.2.42.125",
                        "99.83.132.135"
                    ],
                    "IpAddressFamily": "IPv4"
                },
                {
                    "IpFamily": "IPv6",
                    "IpAddresses": [
                        "2600:9000:a400:4092:88f3:82e2:e5b2:e686",
                        "2600:9000:a516:b4ef:157e:4cbd:7b48:20f1"
                    ],
                    "IpAddressFamily": "IPv6"
                }
            ],
            "DnsName": "a099f799900e5b10d.awsglobalaccelerator.com", (2)
            "Status": "IN_PROGRESS",
            "CreatedTime": "2023-11-13T15:46:40+00:00",
            "LastModifiedTime": "2023-11-13T15:46:42+00:00",
            "DualStackDnsName": "ac86191ca5121e885.dualstack.awsglobalaccelerator.com" (3)
        }
    }
    1 與建立的加速器執行個體相關聯的 ARN,此 ARN 將在後續命令中使用
    2 IPv4 Keycloak 用戶端應連線的 DNS 名稱
    3 IPv6 Keycloak 用戶端應連線的 DNS 名稱
  3. 為加速器建立監聽器

    命令
    aws globalaccelerator create-listener \
      --accelerator-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71' \
      --port-ranges '[{"FromPort":443,"ToPort":443}]' \
      --protocol TCP \
      --region us-west-2
    輸出
    {
        "Listener": {
            "ListenerArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40",
            "PortRanges": [
                {
                    "FromPort": 443,
                    "ToPort": 443
                }
            ],
            "Protocol": "TCP",
            "ClientAffinity": "NONE"
        }
    }
  4. 為監聽器建立端點群組

    命令
    CLUSTER_1_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \
        --query "LoadBalancers[?DNSName=='abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \ (1)
        --region eu-west-1 \ (2)
        --output text
    )
    CLUSTER_2_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \
        --query "LoadBalancers[?DNSName=='a1c76566e3c334e4ab7b762d9f8dcbcf-985941f9c8d108d4.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \ (1)
        --region eu-west-1 \ (2)
        --output text
    )
    ENDPOINTS='[
      {
        "EndpointId": "'${CLUSTER_1_ENDPOINT_ARN}'",
        "Weight": 128,
        "ClientIPPreservationEnabled": false
      },
      {
        "EndpointId": "'${CLUSTER_2_ENDPOINT_ARN}'",
        "Weight": 128,
        "ClientIPPreservationEnabled": false
      }
    ]'
    aws globalaccelerator create-endpoint-group \
      --listener-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40' \ (2)
      --traffic-dial-percentage 100 \
      --endpoint-configurations ${ENDPOINTS} \
      --endpoint-group-region eu-west-1 \ (3)
      --region us-west-2
    1 叢集 NLB 的 DNS 主機名稱
    2 在上一步中建立的監聽器的 ARN
    3 這應是託管叢集的 AWS 區域
    輸出
    {
        "EndpointGroup": {
            "EndpointGroupArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40/endpoint-group/2581af0dc700",
            "EndpointGroupRegion": "eu-west-1",
            "EndpointDescriptions": [
                {
                    "EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/abab80a363ce8479ea9c4349d116bce2/6b65e8b4272fa4b5",
                    "Weight": 128,
                    "HealthState": "HEALTHY",
                    "ClientIPPreservationEnabled": false
                },
                {
                    "EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/a1c76566e3c334e4ab7b762d9f8dcbcf/985941f9c8d108d4",
                    "Weight": 128,
                    "HealthState": "HEALTHY",
                    "ClientIPPreservationEnabled": false
                }
            ],
            "TrafficDialPercentage": 100.0,
            "HealthCheckPort": 443,
            "HealthCheckProtocol": "TCP",
            "HealthCheckPath": "undefined",
            "HealthCheckIntervalSeconds": 30,
            "ThresholdCount": 3
        }
    }
  5. 選用:設定您的自訂網域

    如果您使用自訂網域,請在您的自訂網域中設定別名或 CNAME,將您的自訂網域指向 AWS Global Loadbalancer。

  6. 建立或更新 Keycloak 部署

    在每個 Keycloak 叢集上執行以下操作

    1. 登入 ROSA 叢集

    2. 確保 Keycloak CR 具有以下組態

      apiVersion: k8s.keycloak.org/v2alpha1
      kind: Keycloak
      metadata:
        name: keycloak
      spec:
        hostname:
          hostname: $HOSTNAME (1)
        ingress:
          enabled: false (2)
      1 用戶端用來連線 Keycloak 的主機名稱
      2 停用預設入口,因為所有 Keycloak 存取都應通過佈建的 NLB

      為了確保請求轉發按預期工作,Keycloak CR 需要指定用戶端將通過其存取 Keycloak 執行個體的主機名稱。這可以是與 Global Accelerator 相關聯的 DualStackDnsNameDnsName 主機名稱。如果您使用自訂網域並將您的自訂網域指向 AWS Global Loadbalancer,請在此處使用您的自訂網域。

驗證

要驗證 Global Accelerator 是否已正確設定為連線到叢集,請瀏覽到上方設定的主機名稱,您應該會看到 Keycloak 管理主控台。

在此頁面上