このガイドでは、複数クラスタ環境 (クロスサイト) に Infinispan をデプロイするために必要な手順について説明します。簡略化のため、このトピックでは、Keycloak を外部 Infinispan と共に使用できるようにするための最小限の構成を使用します。
このガイドでは、Site-A および Site-B という名前の 2 つの OpenShift クラスタを想定しています。
これは、マルチサイトデプロイメントの概念ガイドで説明されている概念に従う構成要素です。概要については、マルチサイトデプロイメントガイドを参照してください。
|
外部 Infinispan デプロイメントでは、Infinispan バージョン 15.0.14.Final 以降のパッチリリースのみがサポートされています。 |
このセットアップでは、低遅延ネットワーク接続を持つ 2 つのサイトに、同期レプリケーションを行う 2 つの Infinispan クラスタをデプロイします。このシナリオの例としては、1 つの AWS リージョン内の 2 つのアベイラビリティゾーンが考えられます。
簡略化のため、次の図から Keycloak、ロードバランサー、およびデータベースは削除されています。
OpenShift または Kubernetes クラスタが実行されていること
Infinispan Operator について理解していること
Infinispan Operator をインストールします。
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 クラスタで実行する必要があります。
サービスアカウントを作成します。
サービスアカウントは、クラスタ間の接続を確立するために必要です。Infinispan Operator はこれを使用して、リモートサイトからのネットワーク構成を検査し、ローカルの Infinispan クラスタをそれに応じて構成します。
詳細については、クロスサイト接続の管理ドキュメントを参照してください。
次のように service-account-token シークレットタイプを作成します。同じ YAML ファイルを両方の OpenShift クラスタで使用できます。
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 | サービスアカウント名。 |
両方の 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
次のステップは、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)"
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 クラスタにアップロードする必要があります。 |
クロスサイトを有効にした Infinispan のクラスタを作成します
クロスサイトの設定ドキュメントには、以前のステップを含め、クロスサイトを有効にした Infinispan クラスタを作成および構成する方法に関するすべての情報が記載されています。
このガイドでは、前のステップのコマンドで作成されたクレデンシャル、トークン、および TLS キーストア/トラストストアを使用した基本的な例を提供します。
Site-A 用の Infinispan CRapiVersion: 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 CRapiVersion: 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)
Keycloak 用のキャッシュを作成します。
Keycloak には、actionTokens、authenticationSessions、loginFailures、および work のキャッシュが存在する必要があります。
Infinispan Cache CR を使用すると、Infinispan クラスタにキャッシュをデプロイできます。クロスサイトは、クロスサイトドキュメントで説明されているように、キャッシュごとに有効にする必要があります。このドキュメントには、このガイドで使用されているオプションに関する詳細が含まれています。次の例は、Site-A 用の Cache CR を示しています。
Site-A で、上記の各キャッシュに対して、次の内容で Cache CR を作成します。
actionTokensapiVersion: 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"
authenticationSessionsapiVersion: 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"
loginFailuresapiVersion: 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"
workapiVersion: 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-B の 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-a: (3)
backup:
strategy: "SYNC" (4)
timeout: "4500" (5)
failurePolicy: "FAIL" (6)
stateTransfer:
chunkSize: "16"
Infinispan クラスタが形成され、OpenShift クラスタ間でクロスサイト接続が確立されていることを確認します。
kubectl wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
kubectl wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
Infinispan サーバーが実行されているので、Infinispan を Keycloak に接続するために必要な関連する Keycloak CR の変更点を以下に示します。これらの変更は、Keycloak Operator を使用した HA のための Keycloak のデプロイ ガイドで必要になります。
外部 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'
以下に示すように、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 ユーザー名クレデンシャルを持つシークレットの name と key。 |
| 4 | Infinispan パスワードクレデンシャルを持つシークレットの name と key。 |
| 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 をデプロイし、以前に作成したすべての構成要素に接続します。