AWS Global Accelerator ロードバランサーのデプロイ

ロードバランサーの構成要素

このトピックでは、マルチサイト Keycloak デプロイメント間でトラフィックをルーティングするために必要な AWS Global Accelerator をデプロイする手順について説明します。

このデプロイメントは、「マルチサイトデプロイメントの概念」ガイドで説明されているセットアップで使用することを目的としています。このデプロイメントは、「マルチサイトデプロイメントの構成要素」ガイドで概説されている他の構成要素とともに使用してください。

これらのブループリントは、通常のインストールで良好なベースラインパフォーマンスを備えた、機能的に完全な最小限の例を示すために提供されています。それでも、お客様の環境および組織の標準とセキュリティのベストプラクティスに合わせて調整する必要があります。

対象読者

このガイドでは、複数のアベイラビリティーゾーンにまたがる Keycloak デプロイメントに対する Keycloak クライアント接続のフェイルオーバーを処理するために、AWS Global Accelerator インスタンスをデプロイする方法について説明します。

アーキテクチャ

ユーザーリクエストが各 Keycloak サイトにルーティングされるようにするには、ロードバランサーを利用する必要があります。クライアント側の DNS キャッシュの問題を防ぐために、実装では、クライアントを両方のアベイラビリティーゾーンにルーティングする際に同じままの静的 IP アドレスを使用する必要があります。

このガイドでは、すべての Keycloak クライアントリクエストを AWS Global Accelerator ロードバランサー経由でルーティングする方法について説明します。Keycloak サイトで障害が発生した場合、Accelerator はすべてのクライアントリクエストが残りの正常なサイトにルーティングされるようにします。両方のサイトが異常とマークされている場合、Accelerator は「フェイルオープン」し、ランダムに選択されたサイトにリクエストを転送します。

accelerator multi az.dio
図 1. AWS Global Accelerator フェイルオーバー

Keycloak ポッドを AWS Global Accelerator インスタンスのエンドポイントとして利用できるようにするために、AWS Network Load Balancer (NLB) が両方の ROSA クラスターに作成されます。各クラスターエンドポイントには、128 (最大ウェイト 255 の半分) のウェイトが割り当てられ、両方のクラスターが正常な場合にアクセラレータートラフィックが両方のアベイラビリティーゾーンに均等にルーティングされるようにします。

前提条件

  • ROSA ベースのマルチ AZ Keycloak デプロイメント

手順

  1. Network Load Balancer の作成

    各 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 作成された Accelerator インスタンスに関連付けられた 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 Load Balancer にポイントします。

  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 プロビジョニングされた NLB 経由ですべての Keycloak アクセスを行う必要があるため、デフォルトのイングレスを無効にします

      リクエスト転送が期待どおりに機能するようにするには、Keycloak CR で、クライアントが Keycloak インスタンスにアクセスするためのホスト名を指定する必要があります。これは、Global Accelerator に関連付けられた DualStackDnsName または DnsName ホスト名のいずれかです。カスタムドメインを使用している場合は、カスタムドメインを AWS Global Accelerator にポイントし、ここでカスタムドメインを使用します。

検証

Global Accelerator がクラスターに接続するように正しく構成されていることを検証するには、上記で構成したホスト名に移動すると、Keycloak 管理コンソールが表示されるはずです。

このページについて