Å ajÄ rakstÄ mÄs redzÄsim pamata idejas, kas jÄpatur prÄtÄ, izvietojot Keycloak kopu Kubernetes augÅ”pusÄ.
Ja vÄlaties uzzinÄt vairÄk par Keycloak, skatiet saites raksta beigÄs. Lai vairÄk iedziļinÄtos praksÄ, varat mÄcÄ«ties mÅ«su krÄtuve ar moduli, kas Ä«steno Ŕī raksta galvenÄs idejas (tur ir palaiÅ”anas rokasgrÄmata, Å”ajÄ rakstÄ tiks sniegts pÄrskats par ierÄ«ci un iestatÄ«jumiem, apm. tulkotÄjs).
Keycloak ir visaptveroÅ”a sistÄma, kas rakstÄ«ta Java valodÄ un ir izveidota uz lietojumprogrammu servera Savvaļas muÅ”a. ÄŖsÄk sakot, tÄ ir autorizÄcijas sistÄma, kas nodroÅ”ina lietojumprogrammu lietotÄju federÄcijas un SSO (vienreizÄjÄs pierakstÄ«Å”anÄs) iespÄjas.
Lai palaistu Keycloak, ir nepiecieÅ”ami divi pastÄvÄ«gi datu avoti:
DatubÄze, ko izmanto, lai saglabÄtu noteiktus datus, piemÄram, lietotÄja informÄciju
Datagrid cache, ko izmanto datu keÅ”atmiÅai no datu bÄzes, kÄ arÄ« dažu Ä«slaicÄ«gu un bieži mainÄ«gu metadatu, piemÄram, lietotÄju sesiju, glabÄÅ”anai. ÄŖstenots Infinispan, kas parasti ir ievÄrojami ÄtrÄks nekÄ datu bÄze. Bet jebkurÄ gadÄ«jumÄ Infinispan saglabÄtie dati ir Ä«slaicÄ«gi - un tie nav nekur jÄsaglabÄ, kad klasteris tiek restartÄts.
Keycloak darbojas Äetros dažÄdos režīmos:
NormÄls - viens un tikai viens process, kas konfigurÄts, izmantojot failu standalone.xml
RegulÄra klastera (augstas pieejamÄ«bas opcija) - visiem procesiem ir jÄizmanto viena un tÄ pati konfigurÄcija, kas jÄsinhronizÄ manuÄli. IestatÄ«jumi tiek saglabÄti failÄ standalone-ha.xml, turklÄt jums ir jÄnodroÅ”ina kopÄ«ga piekļuve datu bÄzei un slodzes lÄ«dzsvarotÄjs.
DomÄnu klasteris ā klastera palaiÅ”ana normÄlÄ režīmÄ Ätri kļūst par ikdieniŔķu un garlaicÄ«gu uzdevumu, klasterim augot, jo ikreiz, kad mainÄs konfigurÄcija, visas izmaiÅas ir jÄveic katrÄ klastera mezglÄ. DomÄna darbÄ«bas režīms atrisina Å”o problÄmu, iestatot kÄdu koplietojamu krÄtuves vietu un publicÄjot konfigurÄciju. Å ie iestatÄ«jumi tiek saglabÄti failÄ domÄns.xml
ReplikÄcija starp datu centriem ā ja vÄlaties palaist Keycloak vairÄku datu centru klasterÄ«, visbiežÄk dažÄdÄs Ä£eogrÄfiskÄs vietÄs. Izmantojot Å”o opciju, katram datu centram bÅ«s savs Keycloak serveru klasteris.
Å ajÄ rakstÄ mÄs detalizÄti apsvÄrsim otro iespÄju, tas ir regulÄrs klasteris, un mÄs arÄ« nedaudz skarsim tÄmu par replikÄciju starp datu centriem, jo āāir lietderÄ«gi palaist Ŕīs divas opcijas Kubernetes. Par laimi, Kubernetes nav problÄmu ar vairÄku podiÅu (Keycloak mezglu) iestatÄ«jumu sinhronizÄÅ”anu, tÄpÄc domÄnu klasteris To izdarÄ«t nebÅ«s ļoti grÅ«ti.
LÅ«dzu, Åemiet vÄrÄ arÄ« to, ka vÄrds klasteris pÄrÄjÄ raksta daļa attieksies tikai uz Keycloak mezglu grupu, kas darbojas kopÄ, nav nepiecieÅ”ams atsaukties uz Kubernetes kopu.
RegulÄra Keycloak klasteris
Lai palaistu Keycloak Å”ajÄ režīmÄ, jums ir nepiecieÅ”ams:
konfigurÄt ÄrÄjo koplietojamo datu bÄzi
uzstÄdiet slodzes balansÄtÄju
ir iekÅ”Äjais tÄ«kls ar IP multiraides atbalstu
MÄs neapspriedÄ«sim ÄrÄjÄs datu bÄzes izveidi, jo tas nav Ŕī raksta mÄrÄ·is. PieÅemsim, ka kaut kur darbojas datu bÄze ā un mums ir pieslÄguma punkts ar to. MÄs vienkÄrÅ”i pievienosim Å”os datus vides mainÄ«gajiem.
Lai labÄk izprastu, kÄ Keycloak darbojas kļūmjpÄrlÄces (HA) klasterÄ«, ir svarÄ«gi zinÄt, cik lielÄ mÄrÄ tas viss ir atkarÄ«gs no Wildfly klasterizÄcijas iespÄjÄm.
Wildfly izmanto vairÄkas apakÅ”sistÄmas, dažas no tÄm tiek izmantotas kÄ slodzes lÄ«dzsvarotÄjs, dažas - kļūdu pielaidei. Slodzes lÄ«dzsvarotÄjs nodroÅ”ina lietojumprogrammu pieejamÄ«bu, kad klastera mezgls ir pÄrslogots, un kļūdu tolerance nodroÅ”ina lietojumprogrammu pieejamÄ«bu pat tad, ja daži klastera mezgli neizdodas. Dažas no Ŕīm apakÅ”sistÄmÄm:
mod_cluster: darbojas kopÄ ar Apache kÄ HTTP slodzes balansÄtÄju, ir atkarÄ«gs no TCP multiraides, lai pÄc noklusÄjuma atrastu saimniekdatorus. Var aizstÄt ar ÄrÄjo balansÄtÄju.
infinispan: izplatÄ«ta keÅ”atmiÅa, kas kÄ transporta slÄni izmanto JGroups kanÄlus. TurklÄt tas var izmantot HotRod protokolu, lai sazinÄtos ar ÄrÄju Infinispan klasteru, lai sinhronizÄtu keÅ”atmiÅas saturu.
jgroups: nodroÅ”ina grupu saziÅas atbalstu ļoti pieejamiem pakalpojumiem, kuru pamatÄ ir JGroups kanÄli. NosauktÄs caurules ļauj lietojumprogrammu gadÄ«jumus klasterÄ« savienot grupÄs, lai komunikÄcijai bÅ«tu tÄdas Ä«paŔības kÄ uzticamÄ«ba, sakÄrtotÄ«ba un jutÄ«gums pret kļūmÄm.
Slodzes balansÄtÄjs
InstalÄjot balansÄtÄju kÄ ieejas kontrolleri Kubernetes klasterÄ«, ir svarÄ«gi paturÄt prÄtÄ tÄlÄk norÄdÄ«to.
Keycloak pieÅem, ka klienta attÄlÄ adrese, kas savieno autentifikÄcijas serveri, izmantojot HTTP, ir klienta datora reÄlÄ IP adrese. BalansÄtÄja un ieejas iestatÄ«jumiem ir pareizi jÄiestata HTTP galvenes X-Forwarded-For Šø X-Forwarded-Protoun saglabÄjiet arÄ« sÄkotnÄjo nosaukumu HOST. JaunÄkÄ versija ingress-nginx (>0.22.0) pÄc noklusÄjuma to atspÄjo
Karoga aktivizÄÅ”ana proxy-address-forwarding iestatot vides mainÄ«go PROXY_ADDRESS_FORWARDING Š² true ļauj Keycloak saprast, ka tas darbojas aiz starpniekservera.
Jums arÄ« jÄiespÄjo lipÄ«gÄs sesijas iekļūŔanÄ. Keycloak izmanto izplatÄ«to Infinispan keÅ”atmiÅu, lai saglabÄtu datus, kas saistÄ«ti ar paÅ”reizÄjo autentifikÄcijas sesiju un lietotÄja sesiju. KeÅ”atmiÅas pÄc noklusÄjuma darbojas ar vienu Ä«paÅ”nieku, citiem vÄrdiem sakot, konkrÄtÄ sesija tiek glabÄta kÄdÄ klastera mezglÄ, un citiem mezgliem tas ir jÄveic attÄlinÄti, ja tiem ir nepiecieÅ”ama piekļuve Å”ai sesijai.
PrecÄ«zÄk, pretÄji dokumentÄcijÄ norÄdÄ«tajam, mums nederÄja sesijas pievienoÅ”ana ar sÄ«kfaila nosaukumu AUTH_SESSION_ID. Keycloak ir novirzÄ«Å”anas cilpa, tÄpÄc iesakÄm izvÄlÄties citu sÄ«kfaila nosaukumu lipÄ«gajai sesijai.
Keycloak pievieno arÄ« tÄ mezgla nosaukumu, kas atbildÄja pirmais AUTH_SESSION_ID, un tÄ kÄ katrs ļoti pieejamÄs versijas mezgls izmanto vienu un to paÅ”u datu bÄzi, katrs no tiem jÄbÅ«t atseviŔķs un unikÄls mezgla identifikators darÄ«jumu pÄrvaldÄ«bai. Ieteicams ielikt JAVA_OPTS parametri jboss.node.name Šø jboss.tx.node.id katram mezglam unikÄls - varat, piemÄram, ievietot poda nosaukumu. Ja ievietojat aplikuma nosaukumu, neaizmirstiet par 23 rakstzÄ«mju ierobežojumu jboss mainÄ«gajiem, tÄpÄc labÄk ir izmantot StatefulSet, nevis izvietoÅ”anu.
VÄl viens grÄbeklis - ja pods tiek izdzÄsts vai restartÄts, tÄ keÅ”atmiÅa tiek zaudÄta. Å emot to vÄrÄ, ir vÄrts iestatÄ«t keÅ”atmiÅas Ä«paÅ”nieku skaitu visÄm keÅ”atmiÅÄm vismaz uz diviem, lai saglabÄtos keÅ”atmiÅas kopija. RisinÄjums ir skriet Wildfly scenÄrijs startÄjot podi, ievietojot to direktorijÄ /opt/jboss/startup-scripts konteinerÄ:
Skripta saturs
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
pÄc tam iestatiet vides mainÄ«gÄ vÄrtÄ«bu CACHE_OWNERS uz nepiecieÅ”amo.
PrivÄts tÄ«kls ar IP multiraides atbalstu
Ja izmantojat Weavenet kÄ CNI, multiraide darbosies nekavÄjoties ā un jÅ«su Keycloak mezgli redzÄs viens otru, tiklÄ«dz tie tiks palaisti.
Ja jÅ«su Kubernetes klasterÄ« nav IP multiraides atbalsta, varat konfigurÄt JGroups darbam ar citiem protokoliem, lai atrastu mezglus.
PirmÄ iespÄja ir izmantot KUBE_DNSkas izmanto headless service lai atrastu Keycloak mezglus, vienkÄrÅ”i nododiet JGroups tÄ pakalpojuma nosaukumu, kas tiks izmantots mezglu atraÅ”anai.
VÄl viena iespÄja ir izmantot metodi KUBE_PING, kas darbojas ar API, lai meklÄtu mezglus (jums ir jÄkonfigurÄ serviceAccount ar tiesÄ«bÄm list Šø get, un pÄc tam konfigurÄjiet apvidus darbam ar Å”o serviceAccount).
Veids, kÄdÄ JGroups atrod mezglus, ir konfigurÄts, iestatot vides mainÄ«gos JGROUPS_DISCOVERY_PROTOCOL Šø JGROUPS_DISCOVERY_PROPERTIES. Par KUBE_PING jums ir jÄizvÄlas pÄkstis, jautÄjot namespace Šø labels.
ļø Ja izmantojat multiraidi un vienÄ Kubernetes klasterÄ« darbinÄt divus vai vairÄkus Keycloak klasterus (teiksim, vienu nosaukumvietÄ production, otrais - staging) ā viena Keycloak klastera mezgli var pievienoties citam klasterim. Noteikti izmantojiet unikÄlu multiraides adresi katram klasterim, iestatot mainÄ«gosjboss.default.multicast.address Šø jboss.modcluster.multicast.address Š² JAVA_OPTS.
ReplikÄcija starp datu centriem
Saite
Keycloak izmanto vairÄkas atseviŔķas Infinispan keÅ”atmiÅas kopas katram datu centram, kurÄ atrodas Keycloak klasteri, kas sastÄv no Keycloak mezgliem. Bet nav atŔķirÄ«bas starp Keycloak mezgliem dažÄdos datu centros.
Keycloak mezgli saziÅai starp datu centriem izmanto ÄrÄjo Java Data Grid (Infinispan serverus). Sakari darbojas saskaÅÄ ar protokolu Infinispan HotRod.
Infinispan keÅ”atmiÅas ir jÄkonfigurÄ ar atribÅ«tu remoteStore, lai datus varÄtu glabÄt attÄlinÄti (citÄ datu centrÄ, apm. tulkotÄjs) keÅ”atmiÅas. Starp JDG serveriem ir atseviŔķas infinispan kopas, lai dati tiktu saglabÄti JDG1 uz vietas. site1 tiks replicÄts uz JDG2 uz vietas site2.
Visbeidzot, saÅemoÅ”ais JDG serveris informÄ Keycloak serverus par savu klasteru, izmantojot klienta savienojumus, kas ir HotRod protokola funkcija. Keycloak mezgli ieslÄgti site2 atjauniniet savas Infinispan keÅ”atmiÅas, un konkrÄtÄ lietotÄja sesija kļūst pieejama arÄ« Keycloak mezglos site2.
DažÄm keÅ”atmiÅÄm ir iespÄjams arÄ« neveidot dublÄjumus un pilnÄ«bÄ izvairÄ«ties no datu rakstÄ«Å”anas caur Infinispan serveri. Lai to izdarÄ«tu, iestatÄ«jums ir jÄnoÅem remote-store specifiska Infinispan keÅ”atmiÅa (failÄ standalone-ha.xml), pÄc tam daži konkrÄti replicated-cache arÄ« vairs nebÅ«s vajadzÄ«gs Infinispan servera pusÄ.
KeÅ”atmiÅu iestatÄ«Å”ana
Keycloak ir divu veidu keÅ”atmiÅas:
VietÄjais. Tas atrodas blakus datu bÄzei un kalpo, lai samazinÄtu datu bÄzes slodzi, kÄ arÄ« samazinÄtu atbildes latentumu. Å Äda veida keÅ”atmiÅÄ tiek saglabÄti domÄni, klienti, lomas un lietotÄja metadati. Å Äda veida keÅ”atmiÅa netiek replicÄta, pat ja keÅ”atmiÅa ir daļa no Keycloak klastera. Ja mainÄs kÄds ieraksts keÅ”atmiÅÄ, ziÅojums par izmaiÅÄm tiek nosÅ«tÄ«ts uz atlikuÅ”ajiem klastera serveriem, pÄc tam ieraksts tiek izslÄgts no keÅ”atmiÅas. SkatÄ«t aprakstu work SÄ«kÄku procedÅ«ras aprakstu skatiet tÄlÄk.
ReplicÄts. ApstrÄdÄ lietotÄju sesijas, bezsaistes pilnvaras, kÄ arÄ« uzrauga pieteikÅ”anÄs kļūdas, lai noteiktu paroles pikŔķerÄÅ”anas mÄÄ£inÄjumus un citus uzbrukumus. Å ajÄs keÅ”atmiÅÄs glabÄtie dati ir Ä«slaicÄ«gi, glabÄti tikai RAM, taÄu tos var replicÄt visÄ klasterÄ«.
Infinispan keÅ”atmiÅas
Sesijas - Keycloak koncepcija, tiek izsauktas atseviŔķas keÅ”atmiÅas authenticationSessions, tiek izmantoti konkrÄtu lietotÄju datu glabÄÅ”anai. PieprasÄ«jumi no Ŕīm keÅ”atmiÅÄm parasti ir nepiecieÅ”ami pÄrlÅ«kprogrammai un Keycloak serveriem, nevis lietojumprogrammÄm. Å eit parÄdÄs atkarÄ«ba no lipÄ«gajÄm sesijÄm, un Å”Ädas keÅ”atmiÅas paÅ”as nav jÄreplicÄ pat Active-Active režīmÄ.
DarbÄ«bas marÄ·ieri. VÄl viens jÄdziens, ko parasti izmanto dažÄdiem scenÄrijiem, kad, piemÄram, lietotÄjam kaut kas jÄdara asinhroni pa pastu. PiemÄram, procedÅ«ras laikÄ forget password keÅ”atmiÅa actionTokens izmanto, lai izsekotu saistÄ«to marÄ·ieru metadatus ā piemÄram, marÄ·ieris jau ir izmantots, un to nevar atkÄrtoti aktivizÄt. Å Äda veida keÅ”atmiÅa parasti ir jÄreplicÄ starp datu centriem.
SaglabÄto datu keÅ”atmiÅa un novecoÅ”ana darbojas, lai atvieglotu datu bÄzes slodzi. Å Äda veida keÅ”atmiÅa uzlabo veiktspÄju, taÄu rada acÄ«mredzamu problÄmu. Ja viens Keycloak serveris atjaunina datus, par to ir jÄbrÄ«dina citi serveri, lai tie varÄtu atjauninÄt datus savÄs keÅ”atmiÅÄs. Keycloak izmanto lokÄlÄs keÅ”atmiÅas realms, users Šø authorization datu saglabÄÅ”anai keÅ”atmiÅÄ no datu bÄzes.
Ir arÄ« atseviŔķa keÅ”atmiÅa work, kas tiek replicÄta visos datu centros. TÄ pati neuzglabÄ nekÄdus datus no datu bÄzes, bet kalpo, lai nosÅ«tÄ«tu ziÅojumus par datu novecoÅ”anu klasteru mezgliem starp datu centriem. Citiem vÄrdiem sakot, tiklÄ«dz dati tiek atjauninÄti, Keycloak mezgls nosÅ«ta ziÅojumu citiem tÄ datu centra mezgliem, kÄ arÄ« mezgliem citos datu centros. PÄc Å”Äda ziÅojuma saÅemÅ”anas katrs mezgls izdzÄÅ” atbilstoÅ”os datus savÄs lokÄlajÄs keÅ”atmiÅÄs.
LietotÄju sesijas. KeÅ”atmiÅas ar nosaukumiem sessions, clientSessions, offlineSessions Šø offlineClientSessions, parasti tiek replicÄti starp datu centriem un kalpo datu glabÄÅ”anai par lietotÄju sesijÄm, kas ir aktÄ«vas, kamÄr lietotÄjs ir aktÄ«vs pÄrlÅ«kprogrammÄ. Å Ä«s keÅ”atmiÅas darbojas ar lietojumprogrammu, kas apstrÄdÄ HTTP pieprasÄ«jumus no galalietotÄjiem, tÄpÄc tÄs ir saistÄ«tas ar lipÄ«gÄm sesijÄm un ir jÄreplicÄ starp datu centriem.
BrutÄla spÄka aizsardzÄ«ba. KeÅ”atmiÅa loginFailures Izmanto, lai izsekotu pieteikÅ”anÄs kļūdu datus, piemÄram, cik reizes lietotÄjs ievadÄ«jis nepareizu paroli. Å Ä«s keÅ”atmiÅas pavairoÅ”ana ir administratora pienÄkums. Bet, lai veiktu precÄ«zu aprÄÄ·inu, ir vÄrts aktivizÄt replikÄciju starp datu centriem. Bet, no otras puses, ja jÅ«s nereplicÄsit Å”os datus, jÅ«s uzlabosit veiktspÄju, un, ja rodas Ŕī problÄma, replikÄcija var netikt aktivizÄta.
Pirms Keycloak klastera palaiÅ”anas jums ir jÄkonfigurÄ un jÄstartÄ Infinispan klasteris
PÄc tam jums ir jÄkonfigurÄ remoteStore Keycloak keÅ”atmiÅÄm. Lai to izdarÄ«tu, pietiek ar skriptu, kas tiek darÄ«ts lÄ«dzÄ«gi kÄ iepriekÅ”Äjais, kas tiek izmantots mainÄ«gÄ iestatÄ«Å”anai CACHE_OWNERS, jums tas ir jÄsaglabÄ failÄ un jÄievieto direktorijÄ /opt/jboss/startup-scripts:
Rakstu tulkoja un sagatavoja HÄbram darbinieki Slurm mÄcÄ«bu centrs ā intensÄ«vi kursi, video kursi un korporatÄ«vÄs apmÄcÄ«bas no praktizÄjoÅ”iem speciÄlistiem (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)