Infinispan Operator を使用した HA のための Infinispan のデプロイ

Kubernetes 上の Infinispan デプロイメントの構成要素

このガイドでは、複数クラスタ環境 (クロスサイト) に Infinispan をデプロイするために必要な手順について説明します。簡略化のため、このトピックでは、Keycloak を外部 Infinispan と共に使用できるようにするための最小限の構成を使用します。

このガイドでは、Site-A および Site-B という名前の 2 つの OpenShift クラスタを想定しています。

これは、マルチサイトデプロイメントの概念ガイドで説明されている概念に従う構成要素です。概要については、マルチサイトデプロイメントガイドを参照してください。

外部 Infinispan デプロイメントでは、Infinispan バージョン 15.0.14.Final 以降のパッチリリースのみがサポートされています。

アーキテクチャ

このセットアップでは、低遅延ネットワーク接続を持つ 2 つのサイトに、同期レプリケーションを行う 2 つの Infinispan クラスタをデプロイします。このシナリオの例としては、1 つの AWS リージョン内の 2 つのアベイラビリティゾーンが考えられます。

簡略化のため、次の図から Keycloak、ロードバランサー、およびデータベースは削除されています。

infinispan crossdc az.dio

前提条件

  • OpenShift または Kubernetes クラスタが実行されていること

  • Infinispan Operator について理解していること

手順

  1. Infinispan Operator をインストールします。

  2. Infinispan クラスタにアクセスするためのクレデンシャルを設定します。

    Keycloak は、Infinispan クラスタで認証できるようにするために、このクレデンシャルを必要とします。次の identities.yaml ファイルは、管理者権限を持つユーザー名とパスワードを設定します。

    credentials:
      - username: developer
        password: strong-password
        roles:
          - admin

    identities.yaml は、次のいずれかとしてシークレットに設定できます。

    • Kubernetes リソースとして

      クレデンシャルシークレット
      apiVersion: v1
      kind: Secret
      type: Opaque
      metadata:
        name: connect-secret
        namespace: keycloak
      data:
        identities.yaml: Y3JlZGVudGlhbHM6CiAgLSB1c2VybmFtZTogZGV2ZWxvcGVyCiAgICBwYXNzd29yZDogc3Ryb25nLXBhc3N3b3JkCiAgICByb2xlczoKICAgICAgLSBhZG1pbgo= (1)
      1 前の例の identities.yaml は base64 エンコードされています。
    • CLI を使用する場合

      kubectl create secret generic connect-secret --from-file=identities.yaml

      詳細については、認証の設定ドキュメントを確認してください。

      これらのコマンドは、両方の OpenShift クラスタで実行する必要があります。

  3. サービスアカウントを作成します。

    サービスアカウントは、クラスタ間の接続を確立するために必要です。Infinispan Operator はこれを使用して、リモートサイトからのネットワーク構成を検査し、ローカルの Infinispan クラスタをそれに応じて構成します。

    詳細については、クロスサイト接続の管理ドキュメントを参照してください。

    1. 次のように service-account-token シークレットタイプを作成します。同じ YAML ファイルを両方の OpenShift クラスタで使用できます。

      xsite-sa-secret-token.yaml
      apiVersion: v1
      kind: Secret
      metadata:
        name: ispn-xsite-sa-token (1)
        annotations:
          kubernetes.io/service-account.name: "xsite-sa" (2)
      type: kubernetes.io/service-account-token
      1 シークレット名。
      2 サービスアカウント名。
    2. 両方の OpenShift クラスタでサービスアカウントを作成し、アクセストークンを生成します。

      Site-A にサービスアカウントを作成します
      kubectl create sa -n keycloak xsite-sa
      oc policy add-role-to-user view -n keycloak -z xsite-sa
      kubectl create -f xsite-sa-secret-token.yaml
      kubectl get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-A-token.txt
      Site-B にサービスアカウントを作成します
      kubectl create sa -n keycloak xsite-sa
      oc policy add-role-to-user view -n keycloak -z xsite-sa
      kubectl create -f xsite-sa-secret-token.yaml
      kubectl get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-B-token.txt
    3. 次のステップは、Site-A からのトークンを Site-B に、そしてその逆もデプロイすることです。

      Site-B トークンを Site-A にデプロイします
      kubectl create secret generic -n keycloak xsite-token-secret \
        --from-literal=token="$(cat Site-B-token.txt)"
      Site-A トークンを Site-B にデプロイします
      kubectl create secret generic -n keycloak xsite-token-secret \
        --from-literal=token="$(cat Site-A-token.txt)"
  4. TLS シークレットを作成します

    このガイドでは、Infinispan はクロスサイト通信に OpenShift Route を使用します。TLS の SNI 拡張機能を使用して、トラフィックを正しい Pod に誘導します。これを実現するために、JGroups は TLS ソケットを使用しますが、これには正しい証明書を持つキーストアとトラストストアが必要です。

    詳細については、クロスサイト接続のセキュリティ保護ドキュメントまたはRed Hat Developer Guideを参照してください。

    キーストアとトラストストアを OpenShift シークレットにアップロードします。シークレットには、ファイルの内容、アクセスするためのパスワード、およびストアのタイプが含まれています。証明書とストアの作成手順は、このガイドの範囲外です。

    キーストアをシークレットとしてアップロードするには、次のコマンドを使用します。

    キーストアをデプロイします
    kubectl -n keycloak create secret generic xsite-keystore-secret \
      --from-file=keystore.p12="./certs/keystore.p12" \ (1)
      --from-literal=password=secret \ (2)
      --from-literal=type=pkcs12 (3)
    1 キーストアのファイル名とパス。
    2 キーストアにアクセスするためのパスワード。
    3 キーストアタイプ。

    トラストストアをシークレットとしてアップロードするには、次のコマンドを使用します。

    トラストストアをデプロイします
    kubectl -n keycloak create secret generic xsite-truststore-secret \
            --from-file=truststore.p12="./certs/truststore.p12" \  (1)
            --from-literal=password=caSecret \  (2)
            --from-literal=type=pkcs12  (3)
    1 トラストストアのファイル名とパス。
    2 トラストストアにアクセスするためのパスワード。
    3 トラストストアタイプ。
    キーストアとトラストストアは、両方の OpenShift クラスタにアップロードする必要があります。
  5. クロスサイトを有効にした Infinispan のクラスタを作成します

    クロスサイトの設定ドキュメントには、以前のステップを含め、クロスサイトを有効にした Infinispan クラスタを作成および構成する方法に関するすべての情報が記載されています。

    このガイドでは、前のステップのコマンドで作成されたクレデンシャル、トークン、および TLS キーストア/トラストストアを使用した基本的な例を提供します。

    Site-A 用の Infinispan CR
    apiVersion: infinispan.org/v1
    kind: Infinispan
    metadata:
      name: infinispan (1)
      namespace: keycloak
      annotations:
        infinispan.org/monitoring: 'true' (2)
    spec:
      replicas: 3
      jmx:
        enabled: true
      security:
        endpointSecretName: connect-secret (3)
      service:
        type: DataGrid
        sites:
          local:
            name: site-a (4)
            expose:
              type: Route (5)
            maxRelayNodes: 128
            encryption:
              transportKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              routerKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              trustStore:
                secretName: xsite-truststore-secret (9)
                filename: truststore.p12 (10)
          locations:
            - name: site-b (11)
              clusterName: infinispan
              namespace: keycloak (12)
              url: openshift://api.site-b (13)
              secretName: xsite-token-secret (14)
    1 クラスタ名
    2 クラスタを Prometheus で監視できるようにします。
    3 カスタムクレデンシャルを使用する場合は、ここにシークレット名を設定します。
    4 ローカルサイトの名前。この場合は Site-A です。
    5 OpenShift Route を使用してクロスサイト接続を公開します。
    6 前のステップで定義したキーストアが存在するシークレット名。
    7 キーストア内の証明書のエイリアス。
    8 前のステップで定義したキーストアのシークレットキー (ファイル名)。
    9 前のステップで定義したトラストストアが存在するシークレット名。
    10 前のステップで定義したキーストアのトラストストアキー (ファイル名)。
    11 リモートサイトの名前。この場合は Site-B です。
    12 リモートサイトからの Infinispan クラスタの名前空間。
    13 リモートサイトの OpenShift API URL。
    14 リモートサイトへの認証に使用するアクセストークンを持つシークレット。

    Site-B の場合、Infinispan CR は上記と似ています。4、11、13 の違いに注意してください。

    Site-B 用の Infinispan CR
    apiVersion: infinispan.org/v1
    kind: Infinispan
    metadata:
      name: infinispan (1)
      namespace: keycloak
      annotations:
        infinispan.org/monitoring: 'true' (2)
    spec:
      replicas: 3
      jmx:
        enabled: true
      security:
        endpointSecretName: connect-secret (3)
      service:
        type: DataGrid
        sites:
          local:
            name: site-b (4)
            expose:
              type: Route (5)
            maxRelayNodes: 128
            encryption:
              transportKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              routerKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              trustStore:
                secretName: xsite-truststore-secret (9)
                filename: truststore.p12 (10)
          locations:
            - name: site-a (11)
              clusterName: infinispan
              namespace: keycloak (12)
              url: openshift://api.site-a (13)
              secretName: xsite-token-secret (14)
  6. Keycloak 用のキャッシュを作成します。

    Keycloak には、actionTokensauthenticationSessionsloginFailures、および work のキャッシュが存在する必要があります。

    Infinispan Cache CR を使用すると、Infinispan クラスタにキャッシュをデプロイできます。クロスサイトは、クロスサイトドキュメントで説明されているように、キャッシュごとに有効にする必要があります。このドキュメントには、このガイドで使用されているオプションに関する詳細が含まれています。次の例は、Site-A 用の Cache CR を示しています。

    1. Site-A で、上記の各キャッシュに対して、次の内容で Cache CR を作成します。

      キャッシュ actionTokens
      apiVersion: infinispan.org/v2alpha1
      kind: Cache
      metadata:
        name: actiontokens
        namespace: keycloak
      spec:
        clusterName: infinispan
        name: actionTokens
        template: |-
          distributedCache:
            mode: "SYNC"
            owners: "2"
            statistics: "true"
            remoteTimeout: "5000"
            encoding:
              media-type: "application/x-protostream"
            locking:
              acquireTimeout: "4000"
            transaction:
              mode: "NON_DURABLE_XA" (1)
              locking: "PESSIMISTIC" (2)
            stateTransfer:
              chunkSize: "16"
            backups:
              site-b: (3)
                backup:
                  strategy: "SYNC" (4)
                  timeout: "4500" (5)
                  failurePolicy: "FAIL" (6)
                  stateTransfer:
                    chunkSize: "16"
      キャッシュ authenticationSessions
      apiVersion: infinispan.org/v2alpha1
      kind: Cache
      metadata:
        name: authenticationsessions
        namespace: keycloak
      spec:
        clusterName: infinispan
        name: authenticationSessions
        template: |-
          distributedCache:
            mode: "SYNC"
            owners: "2"
            statistics: "true"
            remoteTimeout: "5000"
            encoding:
              media-type: "application/x-protostream"
            locking:
              acquireTimeout: "4000"
            transaction:
              mode: "NON_DURABLE_XA" (1)
              locking: "PESSIMISTIC" (2)
            stateTransfer:
              chunkSize: "16"
            indexing:
              enabled: true
              indexed-entities:
              - keycloak.RootAuthenticationSessionEntity
            backups:
              site-b: (3)
                backup:
                  strategy: "SYNC" (4)
                  timeout: "4500" (5)
                  failurePolicy: "FAIL" (6)
                  stateTransfer:
                    chunkSize: "16"
      キャッシュ loginFailures
      apiVersion: infinispan.org/v2alpha1
      kind: Cache
      metadata:
        name: loginfailures
        namespace: keycloak
      spec:
        clusterName: infinispan
        name: loginFailures
        template: |-
          distributedCache:
            mode: "SYNC"
            owners: "2"
            statistics: "true"
            remoteTimeout: "5000"
            encoding:
              media-type: "application/x-protostream"
            locking:
              acquireTimeout: "4000"
            transaction:
              mode: "NON_DURABLE_XA" (1)
              locking: "PESSIMISTIC" (2)
            stateTransfer:
              chunkSize: "16"
            indexing:
              enabled: true
              indexed-entities:
              - keycloak.LoginFailureEntity
            backups:
              site-b: (3)
                backup:
                  strategy: "SYNC" (4)
                  timeout: "4500" (5)
                  failurePolicy: "FAIL" (6)
                  stateTransfer:
                    chunkSize: "16"
      キャッシュ work
      apiVersion: infinispan.org/v2alpha1
      kind: Cache
      metadata:
        name: work
        namespace: keycloak
      spec:
        clusterName: infinispan
        name: work
        template: |-
          distributedCache:
            mode: "SYNC"
            owners: "2"
            statistics: "true"
            remoteTimeout: "5000"
            encoding:
              media-type: "application/x-protostream"
            locking:
              acquireTimeout: "4000"
            transaction:
              mode: "NON_DURABLE_XA" (1)
              locking: "PESSIMISTIC" (2)
            stateTransfer:
              chunkSize: "16"
            backups:
              site-b: (3)
                backup:
                  strategy: "SYNC" (4)
                  timeout: "4500" (5)
                  failurePolicy: "FAIL" (6)
                  stateTransfer:
                    chunkSize: "16"
      1 トランザクションモード。
      2 トランザクションで使用されるロックモード。
      3 リモートサイト名。
      4 クロスサイト通信戦略。この場合は SYNC です。
      5 クロスサイトレプリケーションのタイムアウト。
      6 クロスサイトレプリケーションの失敗ポリシー。

    上記の例は、最高のデータ整合性を実現するための推奨構成です。

    背景情報

    アクティブ-アクティブ構成では、エントリが両方のサイトで同時に変更されるため、デッドロックが発生する可能性があります。

    transaction.mode: NON_DURABLE_XA は、これが発生した場合にデータ整合性を維持するためにトランザクションがロールバックされるようにします。この場合、backup.failurePolicy: FAIL 設定が必要です。これにより、トランザクションを安全にロールバックできるエラーがスローされます。これが発生すると、Keycloak は再試行を試みます。

    transaction.locking: PESSIMISTIC は、唯一サポートされているロックモードです。OPTIMISTIC は、ネットワークコストが高いため推奨されません。同じ設定により、一方のサイトが更新されている間、他方のサイトが到達不能になるのを防ぎます。

    backup.strategy: SYNC は、Keycloak リクエストが完了したときに、データが他のサイトで表示および保存されるようにします。

    locking.acquireTimeout は、デッドロックシナリオで迅速に失敗するように短縮できます。backup.timeout は、常に locking.acquireTimeout より大きくする必要があります。

    Site-B の場合、Cache CR は、上記の図のポイント 3 で概説されている backups.<name> を除いて、似ています。

    Site-BactionTokens キャッシュの例
    apiVersion: infinispan.org/v2alpha1
    kind: Cache
    metadata:
      name: actiontokens
      namespace: keycloak
    spec:
      clusterName: infinispan
      name: actionTokens
      template: |-
        distributedCache:
          mode: "SYNC"
          owners: "2"
          statistics: "true"
          remoteTimeout: "5000"
          encoding:
            media-type: "application/x-protostream"
          locking:
            acquireTimeout: "4000"
          transaction:
            mode: "NON_DURABLE_XA" (1)
            locking: "PESSIMISTIC" (2)
          stateTransfer:
            chunkSize: "16"
          backups:
            site-a: (3)
              backup:
                strategy: "SYNC" (4)
                timeout: "4500" (5)
                failurePolicy: "FAIL" (6)
                stateTransfer:
                  chunkSize: "16"

デプロイメントの検証

Infinispan クラスタが形成され、OpenShift クラスタ間でクロスサイト接続が確立されていることを確認します。

Infinispan クラスタが形成されるまで待ちます
kubectl wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
Infinispan クロスサイト接続が確立されるまで待ちます
kubectl wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan

Infinispan と Keycloak の接続

Infinispan サーバーが実行されているので、Infinispan を Keycloak に接続するために必要な関連する Keycloak CR の変更点を以下に示します。これらの変更は、Keycloak Operator を使用した HA のための Keycloak のデプロイ ガイドで必要になります。

  1. 外部 Infinispan デプロイメントに接続するためのユーザー名とパスワードを含むシークレットを作成します

    apiVersion: v1
    kind: Secret
    metadata:
      name: remote-store-secret
      namespace: keycloak
    type: Opaque
    data:
      username: ZGV2ZWxvcGVy # base64 encoding for 'developer'
      password: c2VjdXJlX3Bhc3N3b3Jk # base64 encoding for 'secure_password'
  2. 以下に示すように、Keycloak カスタムリソースを additionalOptions で拡張します。

    メモリ、リソース、およびデータベースの構成は、Keycloak Operator を使用した HA のための Keycloak のデプロイガイドですでに説明されているため、以下の CR からは省略されています。管理者はこれらの構成をそのままにしておく必要があります。

    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    metadata:
      labels:
        app: keycloak
      name: keycloak
      namespace: keycloak
    spec:
      additionalOptions:
        - name: cache-remote-host (1)
          value: "infinispan.keycloak.svc"
        - name: cache-remote-port (2)
          value: "11222"
        - name: cache-remote-username (3)
          secret:
            name: remote-store-secret
            key: username
        - name: cache-remote-password (4)
          secret:
            name: remote-store-secret
            key: password
        - name: spi-connections-infinispan-quarkus-site-name (5)
          value: keycloak
    1 リモート Infinispan クラスタのホスト名。
    2 リモート Infinispan クラスタのポート。これはオプションであり、デフォルトは 11222 です。
    3 Infinispan ユーザー名クレデンシャルを持つシークレットの namekey
    4 Infinispan パスワードクレデンシャルを持つシークレットの namekey
    5 spi-connections-infinispan-quarkus-site-name は、リモートストアが使用されている場合に Keycloak が Infinispan キャッシュのデプロイメントに必要な任意の Infinispan サイト名です。このサイト名は Infinispan キャッシュのみに関連しており、外部 Infinispan デプロイメントの値と一致する必要はありません。Infinispan Operator を使用した HA のための Infinispan のデプロイなどのクロス DC セットアップで Keycloak に複数のサイトを使用している場合、サイト名は各サイトで異なる必要があります。

アーキテクチャ

これにより、TLS 1.3 で保護された TCP 接続を使用して Keycloak が Infinispan に接続されます。Keycloak のトラストストアを使用して、Infinispan のサーバー証明書を検証します。Keycloak は、以下の前提条件にリストされている OpenShift 上で Operator を使用してデプロイされるため、Operator は service-ca.crt をトラストストアに既に追加しており、これは Infinispan のサーバー証明書の署名に使用されます。他の環境では、必要な証明書を Keycloak のトラストストアに追加してください。

次のステップ

Aurora AWS データベースと Infinispan がデプロイされて実行されたら、Keycloak Operator を使用した HA のための Keycloak のデプロイガイドの手順を使用して Keycloak をデプロイし、以前に作成したすべての構成要素に接続します。

関連オプション

cache-remote-host

外部 Infinispan クラスタのホスト名。

機能 multi-siteclusterless、または cache-embedded-remote-store が設定されている場合にのみ使用可能です。

CLI: --cache-remote-host
Env: KC_CACHE_REMOTE_HOST

cache-remote-password

外部 Infinispan クラスタへの認証用のパスワード。

セキュリティ保護されていない外部 Infinispan クラスタに接続する場合はオプションです。オプションを指定する場合は、cache-remote-username も必要です。

CLI: --cache-remote-password
Env: KC_CACHE_REMOTE_PASSWORD

リモートホストが設定されている場合にのみ使用可能です

cache-remote-port

外部 Infinispan クラスタのポート。

CLI: --cache-remote-port
Env: KC_CACHE_REMOTE_PORT

リモートホストが設定されている場合にのみ使用可能です

11222 (デフォルト)

cache-remote-tls-enabled

セキュリティ保護されたリモート Infinispan サーバーと通信するために TLS サポートを有効にします。

本番環境で有効にすることを推奨します。

CLI: --cache-remote-tls-enabled
Env: KC_CACHE_REMOTE_TLS_ENABLED

リモートホストが設定されている場合にのみ使用可能です

true (デフォルト)、 false

cache-remote-username

外部 Infinispan クラスタへの認証用のユーザー名。

セキュリティ保護されていない外部 Infinispan クラスタに接続する場合はオプションです。オプションを指定する場合は、cache-remote-password も必要です。

CLI: --cache-remote-username
Env: KC_CACHE_REMOTE_USERNAME

リモートホストが設定されている場合にのみ使用可能です

このページの内容