Endesha Keycloak katika hali ya HA kwenye Kubernetes

Endesha Keycloak katika hali ya HA kwenye Kubernetes

TL; DR: kutakuwa na maelezo ya Keycloak, mfumo wa udhibiti wa upatikanaji wa chanzo wazi, uchambuzi wa muundo wa ndani, maelezo ya usanidi.

Utangulizi na Mawazo Muhimu

Katika nakala hii, tutaona maoni ya kimsingi ya kukumbuka wakati wa kupeleka nguzo ya Keycloak juu ya Kubernetes.

Ikiwa unataka kujua zaidi kuhusu Keycloak, rejelea viungo mwishoni mwa kifungu. Ili kuzama zaidi katika mazoezi, unaweza kusoma hazina yetu na moduli inayotekelezea maoni kuu ya kifungu hiki (mwongozo wa uzinduzi upo, nakala hii itatoa muhtasari wa kifaa na mipangilio, takriban. mfasiri).

Keycloak ni mfumo mpana ulioandikwa katika Java na umejengwa juu ya seva ya programu Wildfly. Kwa kifupi, ni mfumo wa uidhinishaji unaowapa watumiaji wa programu uwezo wa shirikisho na SSO (kuingia mara moja).

Tunakualika usome rasmi tovuti au Wikipedia kwa uelewa wa kina.

Kuzindua Keycloak

Keycloak inahitaji vyanzo viwili vya data vinavyoendelea ili kuendesha:

  • Hifadhidata inayotumika kuhifadhi data iliyothibitishwa, kama vile habari ya mtumiaji
  • Akiba ya Datagrid, ambayo hutumiwa kuweka akiba data kutoka kwa hifadhidata, na pia kuhifadhi metadata ya muda mfupi na inayobadilika mara kwa mara, kama vile vipindi vya watumiaji. Imetekelezwa Infinispan, ambayo kwa kawaida ni haraka sana kuliko hifadhidata. Lakini kwa hali yoyote, data iliyohifadhiwa katika Infinispan ni ya muda mfupi - na haihitaji kuhifadhiwa popote wakati nguzo imeanzishwa upya.

Keycloak inafanya kazi kwa njia nne tofauti:

  • Kawaida - mchakato mmoja na mmoja tu, umeundwa kupitia faili inayojitegemea.xml
  • Nguzo ya mara kwa mara (chaguo la juu la upatikanaji) - taratibu zote lazima zitumie usanidi sawa, ambao lazima upatanishwe kwa manually. Mipangilio imehifadhiwa kwenye faili iliojitegemea-ha.xml, kwa kuongeza unahitaji kufanya ufikiaji wa pamoja kwa hifadhidata na usawazishaji wa mzigo.
  • Kundi la kikoa β€” kuanzisha nguzo katika hali ya kawaida haraka inakuwa kazi ya kawaida na ya kuchosha kadiri nguzo inavyokua, kwani kila wakati usanidi unabadilika, mabadiliko yote lazima yafanywe kwenye kila nodi ya nguzo. Hali ya uendeshaji ya kikoa hutatua suala hili kwa kusanidi eneo fulani la hifadhi iliyoshirikiwa na kuchapisha usanidi. Mipangilio hii imehifadhiwa kwenye faili domain.xml
  • Uigaji kati ya vituo vya data - ikiwa unataka kuendesha Keycloak katika kundi la vituo kadhaa vya data, mara nyingi katika maeneo tofauti ya kijiografia. Katika chaguo hili, kila kituo cha data kitakuwa na kundi lake la seva za Keycloak.

Katika makala hii tutazingatia kwa undani chaguo la pili, yaani nguzo ya kawaida, na pia tutagusa kidogo juu ya mada ya urudufishaji kati ya vituo vya data, kwani inaleta maana kuendesha chaguo hizi mbili katika Kubernetes. Kwa bahati nzuri, katika Kubernetes hakuna shida na kusawazisha mipangilio ya maganda kadhaa (nodi za Keycloak), kwa hivyo. nguzo ya kikoa Haitakuwa vigumu sana kufanya.

Pia tafadhali kumbuka kuwa neno nguzo kwa kifungu kilichosalia kitatumika kwa kikundi cha nodi za Keycloak zinazofanya kazi pamoja, hakuna haja ya kurejelea nguzo ya Kubernetes.

Kundi la Keycloak za kawaida

Ili kuendesha Keycloak katika hali hii unahitaji:

  • sanidi hifadhidata iliyoshirikiwa ya nje
  • sasisha usawazishaji wa mzigo
  • kuwa na mtandao wa ndani wenye usaidizi wa utangazaji anuwai wa IP

Hatutajadili kuweka hifadhidata ya nje, kwani sio madhumuni ya nakala hii. Wacha tufikirie kuwa kuna hifadhidata inayofanya kazi mahali fulani - na tunayo sehemu ya unganisho kwake. Tutaongeza data hii kwa anuwai ya mazingira.

Ili kuelewa vyema jinsi Keycloak inavyofanya kazi katika nguzo ya failover (HA), ni muhimu kujua ni kiasi gani yote inategemea uwezo wa nguzo wa Wildfly.

Wildfly hutumia mifumo ndogo kadhaa, baadhi yao hutumiwa kama kusawazisha mzigo, wengine kwa uvumilivu wa makosa. Kisawazisha cha upakiaji huhakikisha upatikanaji wa programu wakati nodi ya nguzo imejaa kupita kiasi, na uvumilivu wa hitilafu huhakikisha upatikanaji wa programu hata kama baadhi ya nodi za nguzo zitashindwa. Baadhi ya mifumo ndogo hii:

  • mod_cluster: Inafanya kazi kwa kushirikiana na Apache kama kisawazisha cha upakiaji wa HTTP, inategemea utangazaji anuwai wa TCP kupata seva pangishi kwa chaguomsingi. Inaweza kubadilishwa na mizani ya nje.

  • infinispan: Akiba iliyosambazwa kwa kutumia njia za JGroups kama safu ya usafirishaji. Zaidi ya hayo, inaweza kutumia itifaki ya HotRod kuwasiliana na nguzo ya nje ya Infinispan ili kusawazisha yaliyomo kwenye akiba.

  • jgroups: Hutoa usaidizi wa mawasiliano ya kikundi kwa huduma zinazopatikana sana kulingana na chaneli za JGroups. Mabomba yaliyopewa majina huruhusu matukio ya programu katika kundi kuunganishwa katika vikundi ili mawasiliano yawe na sifa kama vile kutegemewa, mpangilio na hisia kwa kushindwa.

Sawazisha mzigo

Wakati wa kusakinisha mizani kama kidhibiti cha ingress katika nguzo ya Kubernetes, ni muhimu kuzingatia mambo yafuatayo:

Keycloak inadhani kwamba anwani ya mbali ya mteja inayounganisha kupitia HTTP kwa seva ya uthibitishaji ni anwani halisi ya IP ya kompyuta ya mteja. Mipangilio ya kusawazisha na ingress inapaswa kuweka vichwa vya HTTP ipasavyo X-Forwarded-For ΠΈ X-Forwarded-Proto, na pia uhifadhi kichwa asili HOST. Toleo la hivi punde ingress-nginx (> 0.22.0) inalemaza hii kwa chaguo-msingi

Kuamilisha bendera proxy-address-forwarding kwa kuweka mabadiliko ya mazingira PROXY_ADDRESS_FORWARDING Π² true inampa Keycloak kuelewa kuwa inafanya kazi nyuma ya proksi.

Pia unahitaji kuwezesha vikao vya kunata katika ingress. Keycloak hutumia akiba ya Infinispan iliyosambazwa ili kuhifadhi data inayohusishwa na kipindi cha sasa cha uthibitishaji na kipindi cha mtumiaji. Akiba hufanya kazi na mmiliki mmoja kwa chaguo-msingi, kwa maneno mengine, kipindi hicho huhifadhiwa kwenye nodi fulani kwenye nguzo, na nodi zingine lazima zihoji kwa mbali ikiwa zinahitaji ufikiaji wa kipindi hicho.

Hasa, kinyume na hati, kuambatisha kikao na kidakuzi cha jina hatukufanya kazi AUTH_SESSION_ID. Keycloak ina kitanzi cha kuelekeza kwingine, kwa hivyo tunapendekeza kuchagua jina tofauti la kidakuzi kwa kipindi cha kunata.

Keycloak pia huambatisha jina la nodi iliyojibu kwanza AUTH_SESSION_ID, na kwa kuwa kila nodi katika toleo linalopatikana sana hutumia hifadhidata sawa, kila moja yao lazima iwe nayo kitambulisho tofauti na cha kipekee cha nodi za kudhibiti miamala. Inashauriwa kuweka ndani JAVA_OPTS vigezo jboss.node.name ΠΈ jboss.tx.node.id kipekee kwa kila nodi - unaweza, kwa mfano, kuweka jina la pod. Ukiweka jina la ganda, usisahau kuhusu kikomo cha herufi 23 kwa anuwai ya jboss, kwa hivyo ni bora kutumia StatefulSet badala ya Usambazaji.

Reki nyingine - ikiwa pod imefutwa au imeanza tena, cache yake imepotea. Kwa kuzingatia hili, inafaa kuweka idadi ya wamiliki wa cache kwa cache zote angalau mbili, ili nakala ya cache ibaki. Suluhisho ni kukimbia hati ya Wildfly wakati wa kuanza ganda, kuiweka kwenye saraka /opt/jboss/startup-scripts kwenye chombo:

Yaliyomo kwenye Hati

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

kisha weka thamani ya utofauti wa mazingira CACHE_OWNERS kwa kinachohitajika.

Mtandao wa kibinafsi na usaidizi wa utangazaji anuwai wa IP

Ukitumia Weavenet kama CNI, utangazaji anuwai utafanya kazi mara moja - na nodi zako za Keycloak zitaonana pindi tu zitakapozinduliwa.

Ikiwa huna usaidizi wa ip multicast katika nguzo yako ya Kubernetes, unaweza kusanidi JGroups kufanya kazi na itifaki zingine ili kupata nodi.

Chaguo la kwanza ni kutumia KUBE_DNSambayo hutumia headless service kupata nodi za Keycloak, unapitisha tu JGroups jina la huduma ambayo itatumika kupata nodi.

Chaguo jingine ni kutumia njia KUBE_PING, ambayo inafanya kazi na API kutafuta nodi (unahitaji kusanidi serviceAccount na haki list ΠΈ get, na kisha usanidi maganda ya kufanya kazi na hii serviceAccount).

Njia ya JGroups hupata nodi imeundwa kwa kuweka anuwai za mazingira JGROUPS_DISCOVERY_PROTOCOL ΠΈ JGROUPS_DISCOVERY_PROPERTIES. Kwa KUBE_PING unahitaji kuchagua maganda kwa kuuliza namespace ΠΈ labels.

️ Ikiwa unatumia multicast na kuendesha nguzo mbili au zaidi za Keycloak kwenye nguzo moja ya Kubernetes (tuseme moja katika nafasi ya majina production, pili - staging) - nodi za nguzo moja ya Keycloak zinaweza kujiunga na nguzo nyingine. Hakikisha unatumia anwani ya kipekee ya utangazaji anuwai kwa kila nguzo kwa kuweka vigeujboss.default.multicast.address и jboss.modcluster.multicast.address в JAVA_OPTS.

Uigaji kati ya vituo vya data

Endesha Keycloak katika hali ya HA kwenye Kubernetes

Бвязь

Keycloak hutumia nguzo nyingi tofauti za akiba za Infinispan kwa kila kituo cha data ambapo nguzo za Keycloak zinazoundwa na nodi za Keycloak zinapatikana. Lakini hakuna tofauti kati ya nodi za Keycloak katika vituo tofauti vya data.

Nodi za keycloak hutumia Gridi ya Data ya Java ya nje (seva za Infinispan) kwa mawasiliano kati ya vituo vya data. Mawasiliano hufanya kazi kulingana na itifaki Infinispan HotRod.

Akiba za Infinispan lazima zisanidiwe na sifa remoteStore, ili data iweze kuhifadhiwa kwa mbali (katika kituo kingine cha data, takriban. mfasiri) akiba. Kuna nguzo tofauti za infinispan kati ya seva za JDG, ili data iliyohifadhiwa kwenye JDG1 kwenye tovuti. site1 itaigwa kwa JDG2 kwenye tovuti site2.

Na hatimaye, seva ya JDG inayopokea inaarifu seva za Keycloak za nguzo yake kupitia miunganisho ya mteja, ambayo ni kipengele cha itifaki ya HotRod. Vifundo vya ufunguo vimewashwa site2 sasisha akiba zao za Infinispan na kipindi maalum cha mtumiaji kinapatikana pia kwenye nodi za Keycloak site2.

Kwa akiba zingine, inawezekana pia kutohifadhi nakala na kuzuia kuandika data kupitia seva ya Infinispan kabisa. Ili kufanya hivyo unahitaji kuondoa mpangilio remote-store kashe maalum ya Infinispan (kwenye faili iliojitegemea-ha.xml), baada ya hapo baadhi maalum replicated-cache pia haitahitajika tena kwa upande wa seva ya Infinispan.

Kuweka akiba

Kuna aina mbili za kache katika Keycloak:

  • Ndani. Iko karibu na hifadhidata na hutumikia kupunguza mzigo kwenye hifadhidata, na pia kupunguza latency ya majibu. Aina hii ya kache huhifadhi ulimwengu, wateja, majukumu na metadata ya mtumiaji. Aina hii ya akiba haijaigwa, hata kama akiba ni sehemu ya nguzo ya Keycloak. Ikiwa kiingilio katika kashe kinabadilika, ujumbe kuhusu mabadiliko hutumwa kwa seva zilizobaki kwenye nguzo, baada ya hapo kiingilio hakijajumuishwa kwenye kashe. Tazama maelezo work Tazama hapa chini kwa maelezo zaidi ya utaratibu.

  • Imeigwa. Huchakata vipindi vya watumiaji, tokeni za nje ya mtandao, na pia hufuatilia hitilafu za kuingia ili kugundua majaribio ya kuhadaa nenosiri na mashambulizi mengine. Data iliyohifadhiwa katika kache hizi ni ya muda, iliyohifadhiwa kwenye RAM pekee, lakini inaweza kuigwa kwenye kundi zima.

Akiba ya Infinispan

Vikao - dhana katika Keycloak, cache tofauti inayoitwa authenticationSessions, hutumika kuhifadhi data ya watumiaji mahususi. Maombi kutoka kwa akiba hizi kwa kawaida huhitajika na kivinjari na seva za Keycloak, si kwa programu. Hapa ndipo utegemezi wa vipindi vya kunata unapoanza kutumika, na kache kama hizo zenyewe hazihitaji kuigwa, hata katika hali Amilifu-Inayotumika.

Ishara za Hatua. Dhana nyingine, kwa kawaida hutumiwa kwa matukio mbalimbali wakati, kwa mfano, mtumiaji lazima afanye kitu kwa njia ya barua. Kwa mfano, wakati wa utaratibu forget password cache actionTokens inayotumika kufuatilia metadata ya tokeni zinazohusiana - kwa mfano, tokeni tayari imetumika na haiwezi kuamilishwa tena. Aina hii ya akiba kwa kawaida inahitaji kuigwa kati ya vituo vya data.

Uhifadhi na kuzeeka kwa data iliyohifadhiwa inafanya kazi ili kupunguza mzigo kwenye hifadhidata. Aina hii ya caching inaboresha utendaji, lakini inaongeza shida dhahiri. Ikiwa seva moja ya Keycloak itasasisha data, seva zingine lazima ziarifiwe ili ziweze kusasisha data katika akiba zao. Keycloak hutumia akiba ya ndani realms, users ΠΈ authorization kwa data ya akiba kutoka kwa hifadhidata.

Pia kuna cache tofauti work, ambayo inaigwa kwenye vituo vyote vya data. Yenyewe haihifadhi data yoyote kutoka kwa hifadhidata, lakini hutumikia kutuma ujumbe kuhusu kuzeeka kwa data kwa nodi za nguzo kati ya vituo vya data. Kwa maneno mengine, mara tu data inaposasishwa, node ya Keycloak hutuma ujumbe kwa nodes nyingine katika kituo chake cha data, pamoja na nodes katika vituo vingine vya data. Baada ya kupokea ujumbe kama huo, kila nodi hufuta data inayolingana katika kache zake za ndani.

Vipindi vya watumiaji. Cache zilizo na majina sessions, clientSessions, offlineSessions ΠΈ offlineClientSessions, kwa kawaida hunakiliwa kati ya vituo vya data na hutumika kuhifadhi data kuhusu vipindi vya watumiaji vinavyotumika wakati mtumiaji anatumia kivinjari. Akiba hizi hufanya kazi na uchakataji wa maombi ya HTTP kutoka kwa watumiaji wa mwisho, kwa hivyo zinahusishwa na vipindi vinavyonata na ni lazima ziigwe kati ya vituo vya data.

Kinga ya nguvu isiyo na nguvu. Akiba loginFailures Hutumika kufuatilia data ya hitilafu ya kuingia, kama vile mara ngapi mtumiaji aliingiza nenosiri lisilo sahihi. Uigaji wa akiba hii ni jukumu la msimamizi. Lakini kwa hesabu sahihi, inafaa kuamsha urudiaji kati ya vituo vya data. Lakini kwa upande mwingine, usipoiga data hii, utaboresha utendakazi, na ikiwa suala hili litatokea, uigaji huenda usisamilishwe.

Wakati wa kusambaza nguzo ya Infinispan, unahitaji kuongeza ufafanuzi wa kache kwenye faili ya mipangilio:

<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" />

Lazima usanidi na uanzishe nguzo ya Infinispan kabla ya kuanzisha nguzo ya Keycloak

Kisha unahitaji kusanidi remoteStore kwa akiba za Keycloak. Kwa kufanya hivyo, script ni ya kutosha, ambayo inafanywa sawa na uliopita, ambayo hutumiwa kuweka kutofautiana CACHE_OWNERS, unahitaji kuihifadhi kwenye faili na kuiweka kwenye saraka /opt/jboss/startup-scripts:

Yaliyomo kwenye Hati

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

Usisahau kusakinisha JAVA_OPTS kwa nodi za Keycloak kuendesha HotRod: remote.cache.host, remote.cache.port na jina la huduma jboss.site.name.

Viungo na nyaraka za ziada

Nakala hiyo ilitafsiriwa na kutayarishwa kwa ajili ya Habr na wafanyakazi Kituo cha mafunzo cha slurm - kozi za kina, kozi za video na mafunzo ya ushirika kutoka kwa wataalamu wanaofanya mazoezi (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)

Chanzo: mapenzi.com

Kuongeza maoni