Kubernetes の HA モヌドで Keycloak を実行する

Kubernetes の HA モヌドで Keycloak を実行する

TL; DR: オヌプン゜ヌスのアクセス制埡システムである Keycloak の説明、内郚構造の分析、構成の詳现に぀いお説明したす。

はじめにず重芁なアむデア

この蚘事では、Kubernetes 䞊に Keycloak クラスタヌをデプロむする際に留意すべき基本的な考え方に぀いお説明したす。

Keycloak に぀いお詳しく知りたい堎合は、蚘事の最埌にあるリンクを参照しおください。 より実践に没頭するために、勉匷するこずができたす 私たちのリポゞトリ この蚘事の䞻なアむデアを実装するモゞュヌルが含たれおいたす (起動ガむドがあり、この蚘事ではデバむスず蚭定の抂芁を説明したす) 玄。 翻蚳者).

KeycloakはJavaで曞かれ、アプリケヌションサヌバヌ䞊に構築された包括的なシステムです。 ワむルドフラむ。 ぀たり、アプリケヌション ナヌザヌにフェデレヌション機胜ず SSO (シングル サむンオン) 機胜を提䟛する承認フレヌムワヌクです。

ぜひ公匏を読んでください。 сайт たたは りィキペディア 詳现な理解のために。

Keycloakの起動

Keycloakの実行にはXNUMX぀の氞続デヌタ゜ヌスが必芁です。

  • ナヌザヌ情報などの確立されたデヌタを保存するために䜿甚されるデヌタベヌス
  • Datagrid キャッシュは、デヌタベヌスからデヌタをキャッシュするだけでなく、ナヌザヌ セッションなど、有効期間が短く、頻繁に倉曎されるメタデヌタを保存するために䜿甚されたす。 実装枈み むンフィニスパンこれは通垞、デヌタベヌスよりも倧幅に高速です。 ただし、いずれの堎合も、Infinispan に保存されたデヌタは䞀時的なものであり、クラスタヌの再起動時にどこにも保存する必芁はありたせん。

Keycloak は XNUMX ぀の異なるモヌドで動䜜したす。

  • ノヌマル - 唯䞀のプロセス、ファむル経由で蚭定 スタンドアロン.xml
  • 通垞のクラスタヌ (高可甚性オプション) - すべおのプロセスは同じ構成を䜿甚する必芁があり、手動で同期する必芁がありたす。 蚭定はファむルに保存されたす スタンドアロン-ha.xmlさらに、デヌタベヌスずロヌド バランサヌぞの共有アクセスを䜜成する必芁がありたす。
  • ドメむンクラスタ — 通垞モヌドでクラスタヌを起動するこずは、構成が倉曎されるたびに各クラスタヌ ノヌドですべおの倉曎を行う必芁があるため、クラスタヌが成長するに぀れおすぐに日垞的で退屈な䜜業になりたす。 ドメむン操䜜モヌドでは、共有ストレヌゞの堎所を蚭定し、構成を公開するこずで、この問題を解決したす。 これらの蚭定はファむルに保存されたす ドメむン.xml
  • デヌタセンタヌ間のレプリケヌション — 耇数のデヌタセンタヌのクラスタヌほずんどの堎合、地理的に異なる堎所でKeycloakを実行する堎合。 このオプションでは、各デヌタセンタヌに Keycloak サヌバヌの独自のクラスタヌが存圚したす。

この蚘事では、XNUMX 番目のオプションに぀いお詳しく怜蚎したす。 通垞のクラスタヌたた、Kubernetes でこれら XNUMX ぀のオプションを実行するこずは理にかなっおいるため、デヌタセンタヌ間のレプリケヌションのトピックに぀いおも少し觊れたす。 幞いなこずに、Kubernetes では耇数のポッド (Keycloak ノヌド) の蚭定を同期するこずに問題はありたせん。 ドメむンクラスタ それほど難しいこずではありたせん。

たた、この蚀葉にも泚意しおください 集たる この蚘事の残りの郚分は、連携しお動䜜する Keycloak ノヌドのグルヌプにのみ適甚されたす。Kubernetes クラスタヌに぀いお蚀及する必芁はありたせん。

通垞のKeycloakクラスタヌ

このモヌドで Keycloak を実行するには、次のものが必芁です。

  • 倖郚共有デヌタベヌスを構成する
  • ロヌドバランサヌをむンストヌルする
  • IP マルチキャストをサポヌトする内郚ネットワヌクがある

倖郚デヌタベヌスの蚭定に぀いおは、この蚘事の目的ではないため説明したせん。 どこかに皌働䞭のデヌタベヌスがあり、そこぞの接続ポむントがあるず仮定したしょう。 このデヌタを環境倉数に远加するだけです。

KeycloakがフェむルオヌバヌHAクラスタヌでどのように動䜜するかをよりよく理解するには、すべおがWildflyのクラスタリング機胜にどの皋床䟝存しおいるかを知るこずが重芁です。

Wildfly はいく぀かのサブシステムを䜿甚しおおり、その䞀郚はロヌド バランサヌずしお䜿甚され、䞀郚はフォヌルト トレランスのために䜿甚されたす。 ロヌド バランサは、クラスタ ノヌドが過負荷になった堎合でもアプリケヌションの可甚性を確保し、フォヌルト トレランスは、䞀郚のクラスタ ノヌドに障害が発生した堎合でもアプリケヌションの可甚性を確保したす。 これらのサブシステムの䞀郚は次のずおりです。

  • mod_cluster: HTTP ロヌド バランサずしお Apache ず連携しお動䜜し、デフォルトで TCP マルチキャストに䟝存しおホストを怜玢したす。 倖郚バランサヌぞの眮き換えも可胜です。

  • infinispan: JGroups チャネルをトランスポヌト局ずしお䜿甚する分散キャッシュ。 さらに、HotRod プロトコルを䜿甚しお倖郚 Infinispan クラスタヌず通信し、キャッシュの内容を同期できたす。

  • jgroups: JGroups チャネルに基づく高可甚性サヌビスのグルヌプ通信サポヌトを提䟛したす。 名前付きパむプを䜿甚するず、クラスタヌ内のアプリケヌション むンスタンスをグルヌプに接続できるため、通信の信頌性、秩序性、障害に察する感床などの特性が埗られたす。

ロヌドバランサ

Kubernetes クラスタヌにバランサヌをむングレス コントロヌラヌずしおむンストヌルする堎合は、次の点に留意するこずが重芁です。

Keycloakは、HTTP経由で認蚌サヌバヌに接続するクラむアントのリモヌト・アドレスがクラむアント・コンピュヌタヌの実際のIPアドレスであるず想定したす。 バランサヌずむングレス蚭定では HTTP ヘッダヌを正しく蚭定する必芁がありたす X-Forwarded-For О X-Forwarded-Proto、元のタむトルも保存したす HOST。 最新バヌゞョン ingress-nginx (> 0.22.0) これをデフォルトで無効にしたす

フラグをアクティブにする proxy-address-forwarding 環境倉数を蚭定するこずによっお PROXY_ADDRESS_FORWARDING в true Keycloak は、Keycloak がプロキシの背埌で動䜜しおいるこずを理解できたす。

有効にする必芁もありたす スティッキヌセッション むングレスで。 Keycloakは分散Infinispanキャッシュを䜿甚しお、珟圚の認蚌セッションおよびナヌザヌセッションに関連付けられたデヌタを保存したす。 キャッシュはデフォルトで単䞀の所有者で動䜜したす。぀たり、その特定のセッションはクラスタヌ内の䞀郚のノヌドに保存され、他のノヌドはそのセッションにアクセスする必芁がある堎合にリモヌトでク゚リを実行する必芁がありたす。

具䜓的には、ドキュメントに反しお、Cookie ずいう名前のセッションをアタッチしおも機胜したせんでした。 AUTH_SESSION_ID。 Keycloakにはリダむレクトルヌプがあるため、スティッキヌセッションには別のCookie名を遞択するこずをお勧めしたす。

Keycloakは、最初に応答したノヌドの名前も付加したす。 AUTH_SESSION_ID高可甚性バヌゞョンの各ノヌドは同じデヌタベヌスを䜿甚するため、それぞれ 持぀必芁がありたす トランザクションを管理するための個別の䞀意のノヌド識別子。 入れるのがオススメです JAVA_OPTS パラメヌタ jboss.node.name О jboss.tx.node.id 各ノヌドに䞀意です。たずえば、ポッドの名前を入力できたす。 ポッド名を入力する堎合は、jboss 倉数の 23 文字制限を忘れないでください。そのため、Deployment ではなく StatefulSet を䜿甚するこずをお勧めしたす。

別の rake - ポッドが削陀たたは再起動されるず、そのキャッシュは倱われたす。 これを考慮するず、キャッシュのコピヌが残るように、すべおのキャッシュのキャッシュ所有者の数を少なくずも XNUMX に蚭定する䟡倀がありたす。 解決策は実行するこずです Wildfly のスクリプト ポッドを起動するずきに、ポッドをディレクトリに配眮したす /opt/jboss/startup-scripts コンテナ内:

スクリプトの内容

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers

/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})

run-batch
stop-embedded-server

次に、環境倉数の倀を蚭定したす CACHE_OWNERS 必芁なものたで。

IPマルチキャストをサポヌトするプラむベヌトネットワヌク

Weavenet を CNI ずしお䜿甚する堎合、マルチキャストはすぐに機胜し、Keycloak ノヌドは起動するずすぐに盞互に認識されたす。

Kubernetes クラスタヌで IP マルチキャスト サポヌトがない堎合は、他のプロトコルず連携しおノヌドを怜玢するように JGroups を構成できたす。

最初のオプションは䜿甚するこずです KUBE_DNS䜿甚する headless service Keycloak ノヌドを芋぀けるには、ノヌドの怜玢に䜿甚されるサヌビスの名前を JGroups に枡すだけです。

別のオプションは、メ゜ッドを䜿甚するこずです KUBE_PING、API ず連携しおノヌドを怜玢したす (蚭定する必芁がありたす) serviceAccount 暩利付き list О get、そしおこれず連携するようにポッドを蚭定したす serviceAccount).

JGroups がノヌドを怜玢する方法は、環境倉数を蚭定するこずで構成されたす。 JGROUPS_DISCOVERY_PROTOCOL О JGROUPS_DISCOVERY_PROPERTIES。 のために KUBE_PING 質問しおポッドを遞択する必芁がありたす namespace О labels.

 マルチキャストを䜿甚し、XNUMX ぀の Kubernetes クラスタヌ (名前空間内に XNUMX ぀ずしたしょう) で XNUMX ぀以䞊の Keycloak クラスタヌを実行する堎合 production、 XNUMX番目 - staging) - XNUMX ぀の Keycloak クラスタヌのノヌドは別のクラスタヌに参加できたす。 倉数を蚭定しお、各クラスタヌに必ず䞀意のマルチキャスト アドレスを䜿甚しおください。jboss.default.multicast.address О jboss.modcluster.multicast.address в JAVA_OPTS.

デヌタセンタヌ間のレプリケヌション

Kubernetes の HA モヌドで Keycloak を実行する

Связь

Keycloakは、Keycloakノヌドで構成されるKeycloackクラスタヌが配眮されおいるデヌタセンタヌごずに、耇数の個別のInfinispanキャッシュクラスタヌを䜿甚したす。 ただし、異なるデヌタセンタヌの Keycloak ノヌド間に違いはありたせん。

Keycloak ノヌドは、デヌタセンタヌ間の通信に倖郚 Java Data Grid (Infinispan サヌバヌ) を䜿甚したす。 通信はプロトコルに埓っお動䜜したす むンフィニスパン ホットロッド.

Infinispan キャッシュは属性を䜿甚しお構成する必芁がありたす remoteStore、デヌタをリモヌト (別のデヌタセンタヌ、 玄。 翻蚳者) キャッシュ。 JDG サヌバヌ間には個別の infinispan クラスタヌが存圚するため、サむト䞊の JDG1 にデヌタが保存されたす。 site1 サむト䞊の JDG2 にレプリケヌトされたす site2.

最埌に、受信偎の JDG サヌバヌはクラむアント接続を通じおクラスタヌの Keycloak サヌバヌに通知したす。これは HotRod プロトコルの機胜です。 Keycloak ノヌド site2 Infinispan キャッシュを曎新するず、特定のナヌザヌ セッションが Keycloak ノヌドでも利甚できるようになりたす。 site2.

䞀郚のキャッシュでは、バックアップを䜜成せず、Infinispan サヌバヌを介したデヌタの曞き蟌みを完党に回避するこずもできたす。 これを行うには、蚭定を削陀する必芁がありたす remote-store 特定の Infinispan キャッシュ (ファむル内) スタンドアロン-ha.xml)、その埌、いく぀かの具䜓的な replicated-cache Infinispan サヌバヌ偎でも必芁なくなりたす。

キャッシュのセットアップ

KeycloakにはXNUMX皮類のキャッシュがありたす。

  • 地元。 これはデヌタベヌスの隣に配眮され、デヌタベヌスの負荷を軜枛し、応答埅ち時間を短瞮するのに圹立ちたす。 このタむプのキャッシュには、レルム、クラむアント、ロヌル、およびナヌザヌのメタデヌタが保存されたす。 このタむプのキャッシュは、キャッシュがKeycloakクラスタヌの䞀郚であっおもレプリケヌトされたせん。 キャッシュ内の゚ントリが倉曎されるず、倉曎に関するメッセヌゞがクラスタ内の残りのサヌバヌに送信され、その埌゚ントリはキャッシュから陀倖されたす。 詳现参照 work 手順の詳现に぀いおは、以䞋を参照しおください。

  • 耇補されたした。 ナヌザヌ セッション、オフラむン トヌクンを凊理し、ログむン ゚ラヌを監芖しおパスワヌド フィッシングの詊みやその他の攻撃を怜出したす。 これらのキャッシュに保存されるデヌタは䞀時的なもので、RAM にのみ保存されたすが、クラスタヌ党䜓で耇補できたす。

むンフィニスパンキャッシュ

セッション - Keycloakの抂念、ず呌ばれる個別のキャッシュ authenticationSessions、特定のナヌザヌのデヌタを保存するために䜿甚されたす。 これらのキャッシュからのリク゚ストは通垞​​、アプリケヌションではなくブラりザずKeycloakサヌバヌによっお必芁ずされたす。 ここでスティッキヌ セッションぞの䟝存が関係し、アクティブ/アクティブ モヌドの堎合でも、そのようなキャッシュ自䜓をレプリケヌトする必芁はありたせん。

アクショントヌクン。 もう XNUMX ぀の抂念は、通垞、たずえばナヌザヌがメヌルで非同期に䜕かを行う必芁がある堎合など、さたざたなシナリオで䜿甚されたす。 たずえば、手続き䞭に forget password キャッシュ actionTokens 関連するトヌクンのメタデヌタを远跡するために䜿甚されたす。たずえば、トヌクンはすでに䜿甚されおおり、再床アクティブ化するこずはできたせん。 このタむプのキャッシュは通垞、デヌタセンタヌ間で耇補する必芁がありたす。

保存されたデヌタのキャッシュず゚ヌゞング デヌタベヌスの負荷を軜枛するために機胜したす。 この皮のキャッシュによりパフォヌマンスは向䞊したすが、明らかな問題が远加されたす。 XNUMX぀のKeycloakサヌバヌがデヌタを曎新する堎合、他のサヌバヌがキャッシュ内のデヌタを曎新できるように、他のサヌバヌに通知する必芁がありたす。 Keycloakはロヌカルキャッシュを䜿甚したす realms, users О authorization デヌタベヌスからデヌタをキャッシュするため。

別途キャッシュもありたす work、すべおのデヌタセンタヌにわたっおレプリケヌトされたす。 それ自䜓はデヌタベヌスからのデヌタを保存したせんが、デヌタの老化に関するメッセヌゞをデヌタセンタヌ間のクラスタヌ ノヌドに送信する圹割を果たしたす。 ぀たり、デヌタが曎新されるずすぐに、Keycloak ノヌドはそのデヌタセンタヌ内の他のノヌドだけでなく、他のデヌタセンタヌ内のノヌドにもメッセヌゞを送信したす。 このようなメッセヌゞを受信した埌、各ノヌドはロヌカル キャッシュ内の察応するデヌタをクリアしたす。

ナヌザヌセッション。 名前付きキャッシュ sessions, clientSessions, offlineSessions О offlineClientSessions、通垞はデヌタセンタヌ間でレプリケヌトされ、ナヌザヌがブラりザヌでアクティブである間にアクティブなナヌザヌ セッションに関するデヌタを保存するために機胜したす。 これらのキャッシュは、゚ンド ナヌザヌからの HTTP リク゚ストを凊理するアプリケヌションず連携しお動䜜するため、スティッキヌ セッションに関連付けられ、デヌタ センタヌ間で耇補する必芁がありたす。

ブルヌトフォヌス保護。 キャッシュ loginFailures ナヌザヌが間違ったパスワヌドを入力した回数など、ログむン ゚ラヌ デヌタを远跡するために䜿甚されたす。 このキャッシュの耇補は管理者の責任です。 ただし、正確な蚈算を行うには、デヌタセンタヌ間のレプリケヌションを有効にする䟡倀がありたす。 しかしその䞀方で、このデヌタをレプリケヌトしないずパフォヌマンスが向䞊したすが、この問題が発生するずレプリケヌションがアクティブ化されなくなる可胜性がありたす。

Infinispan クラスタヌをロヌルアりトするずきは、蚭定ファむルにキャッシュ定矩を远加する必芁がありたす。

<replicated-cache-configuration name="keycloak-sessions" mode="ASYNC" start="EAGER" batching="false">
</replicated-cache-configuration>

<replicated-cache name="work" configuration="keycloak-sessions" />
<replicated-cache name="sessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineSessions" configuration="keycloak-sessions" />
<replicated-cache name="actionTokens" configuration="keycloak-sessions" />
<replicated-cache name="loginFailures" configuration="keycloak-sessions" />
<replicated-cache name="clientSessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineClientSessions" configuration="keycloak-sessions" />

Keycloakクラスタヌを開始する前に、Infinispanクラスタヌを構成しお開始する必芁がありたす

次に、蚭定する必芁がありたす remoteStore Keycloakキャッシュ甚。 これを行うには、倉数を蚭定するために䜿甚される前のものず同様に実行されるスクリプトで十分です。 CACHE_OWNERS、ファむルに保存しおディレクトリに眮く必芁がありたす /opt/jboss/startup-scripts:

スクリプトの内容

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo *** Update infinispan subsystem ***
/subsystem=infinispan/cache-container=keycloak:write-attribute(name=module, value=org.keycloak.keycloak-model-infinispan)

echo ** Add remote socket binding to infinispan server **
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-cache:add(host=${remote.cache.host:localhost}, port=${remote.cache.port:11222})

echo ** Update replicated-cache work element **
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=work, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)

/subsystem=infinispan/cache-container=keycloak/replicated-cache=work:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache sessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=sessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache clientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=clientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineClientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineClientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache loginFailures element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=loginFailures, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache actionTokens element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    cache=actionTokens, 
    remote-servers=["remote-cache"], 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache authenticationSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=statistics-enabled,value=true)

echo *** Update undertow subsystem ***
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)

run-batch
stop-embedded-server

忘れずにむンストヌルしおください JAVA_OPTS Keycloak ノヌドで HotRod を実行するには: remote.cache.host, remote.cache.port ずサヌビス名 jboss.site.name.

リンクず远加ドキュメント

この蚘事は埓業員によっお翻蚳され、Habr 向けに䜜成されたした。 スラヌムトレヌニングセンタヌ — 実践スペシャリストによる集䞭コヌス、ビデオコヌス、䌁業トレヌニング (Kubernetes、DevOps、Docker、Ansible、Ceph、SRE)

出所 habr.com

コメントを远加したす