Kubernetes တလင် HA မုဒ်တလင် Keycloak ကို လုပ်ဆောင်နေသည်။

Kubernetes တလင် HA မုဒ်တလင် Keycloak ကို လုပ်ဆောင်နေသည်။

TL; DR: Keycloak ၏ ဖော်ပဌချက်၊ ပလင့်လင်သသော ရင်သမဌစ် ဝင်ရောက်ခလင့် ထိန်သချုပ်မဟု စနစ်၊ အတလင်သပိုင်သ ဖလဲ့စည်သပုံ ခလဲခဌမ်သစိတ်ဖဌာမဟု၊ ဖလဲ့စည်သမဟု အသေသစိတ် အချက်အလက်မျာသ ပါရဟိပါမည်။

နိဒါန်သနဟင့် အဓိက အိုင်ဒီယာမျာသ

ကဆောင်သပါသတလင်၊ Kubernetes ၏ထိပ်တလင် Keycloak အစုအဝေသတစ်ခုကို ဖဌန့်ကျက်ထာသသည့်အခါတလင် မဟတ်သာသထာသရမည့် အခဌေခံ အကဌံဉာဏ်မျာသကို ကျလန်ုပ်တို့ မဌင်တလေ့ရမည်ဖဌစ်သည်။

Keycloak အကဌောင်သ ပိုမိုသိရဟိလိုပါက၊ ဆောင်သပါသ၏အဆုံသရဟိ လင့်ခ်မျာသကို ကိုသကာသပါ။ လက်တလေ့တလင် ပိုမိုနစ်မဌုပ်စေရန်အတလက် လေ့လာနိုင်ပါသည်။ ကျလန်ုပ်တို့၏သိုလဟောင်ခန်သ ကဆောင်သပါသ၏ အဓိက အယူအဆမျာသကို အကောင်အထည်ဖော်သည့် မော်ဂျူသတစ်ခုနဟင့် (စတင်ခဌင်သလမ်သညလဟန်သည် ထိုနေရာတလင်၊ ကဆောင်သပါသသည် စက်ပစ္စည်သနဟင့် ဆက်တင်မျာသ၏ ခဌုံငုံသုံသသပ်ချက်ကို ပေသလိမ့်မည်၊ အနီသစပ်ဆုံသ ဘာသာပဌန်သူ).

Keycloak သည် Java တလင် ရေသသာသထာသသော ပဌည့်စုံသော စနစ်တစ်ခုဖဌစ်ပဌီသ အက်ပလီကေသရဟင်သဆာဗာတစ်ခု၏အပေါ်တလင် တည်ဆောက်ထာသသည်။ ယင်ကောင်. အတိုချုပ်အာသဖဌင့်၊ ၎င်သသည် အပလီကေသရဟင်သအသုံသပဌုသူမျာသအသင်သချုပ်နဟင့် SSO (single sign-on) စလမ်သရည်မျာသကို ပေသဆောင်သည့် ခလင့်ပဌုချက်အတလက် မူဘောင်တစ်ခုဖဌစ်သည်။

တရာသဝင်စာဖတ်ဖို့ ဖိတ်ခေါ်ပါတယ်။ က်ဘ်ဆိုက် သို့မဟုတ် ဝီကီပီသဒီသယာသ အသေသစိတ်နာသလည်မဟုအတလက်။

သော့ချိတ်ကိုဖလင့်ခဌင်သ။

Keycloak သည် လည်ပတ်ရန် အမဌဲတမ်သဒေတာအရင်သအမဌစ်နဟစ်ခု လိုအပ်သည်-

  • အသုံသပဌုသူအချက်အလက်ကဲ့သို့သော တည်ထောင်ထာသသောဒေတာကို သိမ်သဆည်သရန် အသုံသပဌုသည့် ဒေတာဘေ့စ်
  • Datagrid ကက်ရဟ်၊ ဒေတာဘေ့စ်မဟ ဒေတာမျာသကို ကက်ရဟ်လုပ်ရန်၊ အသုံသပဌုသူ ဆက်ရဟင်မျာသကဲ့သို့ ခဏတာနဟင့် မကဌာခဏ ပဌောင်သလဲနေသော မက်တာဒေတာအချို့ကို သိမ်သဆည်သရန် အသုံသပဌုသည်။ ဟိုဟာ Infinispanပုံမဟန်အာသဖဌင့် ဒေတာဘေ့စ်ထက် သိသိသာသာ ပိုမဌန်သည်။ မည်သို့ပင်ဆိုစေကာမူ Infinispan တလင်သိမ်သဆည်သထာသသောဒေတာသည် ပေါ်ပင်ဖဌစ်သည် - အစုအဝေသကိုပဌန်လည်စတင်သည့်အခါ မည်သည့်နေရာတလင်မဟသိမ်သဆည်သရန်မလိုအပ်ပါ။

Keycloak သည် မတူညီသောမုဒ်လေသခုတလင် အလုပ်လုပ်သည်-

  • သာမန် - တစ်ခုနဟင့်တစ်ခုသာ လုပ်ငန်သစဉ်၊ ဖိုင်တစ်ခုမဟတစ်ဆင့် စီစဉ်ထာသသည်။ standalone.xml
  • ပုံမဟန်အစုအဖလဲ့ (မဌင့်မာသသောရရဟိနိုင်မဟုရလေသချယ်စရာ) - လုပ်ငန်သစဉ်မျာသအာသလုံသသည် တူညီသောဖလဲ့စည်သပုံကိုအသုံသပဌုရမည် ဖဌစ်ပဌီသ၊ ၎င်သကို ကိုယ်တိုင်တစ်ပဌိုင်တည်သလုပ်ဆောင်ရမည်ဖဌစ်သည်။ ဆက်တင်မျာသကို ဖိုင်တစ်ခုတလင် သိမ်သဆည်သထာသသည်။ standalone-ha.xmlထို့အပဌင်၊ သင်သည် ဒေတာဘေ့စ်သို့ မျဟဝေသုံသစလဲခလင့်နဟင့် load balancer တစ်ခုပဌုလုပ်ရန် လိုအပ်သည်။
  • ဒိုမိန်သအစုအဝေသ — ပုံမဟန်မုဒ်တလင် အစုအဝေသတစ်ခုကို စတင်ခဌင်သသည် အစုအဝေသကဌီသထလာသလာသည်နဟင့်အမျဟ ပုံမဟန်နဟင့် ငဌီသငလေ့ဖလယ်အလုပ်တစ်ခု လျင်မဌန်စလာဖဌစ်လာသည်၊ အဘယ်ကဌောင့်ဆိုသော် ဖလဲ့စည်သမဟုပုံစံပဌောင်သလဲသည့်အခါတိုင်သ၊ အစုအဝေသတစ်ခုစီတလင် ပဌောင်သလဲမဟုအာသလုံသကို ပဌုလုပ်ရပါမည်။ Domain မုဒ်၏ လုပ်ဆောင်ချက်သည် အချို့သော မျဟဝေထာသသော သိုလဟောင်ခန်သတည်နေရာကို သတ်မဟတ်ပဌီသ ဖလဲ့စည်သမဟုပုံစံကို ထုတ်ဝေခဌင်သဖဌင့် ကပဌဿနာကို ဖဌေရဟင်သပေသပါသည်။ ကဆက်တင်မျာသကို ဖိုင်တလင် သိမ်သဆည်သထာသသည်။ domain.xml
  • ဒေတာစင်တာမျာသအကဌာသ ကူသယူမဟု — အကယ်၍ သင်သည် Keycloak ကို အမျာသအပဌာသသော ဒေတာစင်တာမျာသ အစုအဝေသတလင် အသုံသပဌုလိုပါက၊ မျာသသောအာသဖဌင့် မတူညီသော ပထဝီဝင်တည်နေရာမျာသတလင် ပဌုလုပ်နိုင်သည်။ ကရလေသချယ်မဟုတလင်၊ ဒေတာစင်တာတစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင် Keycloak ဆာဗာမျာသ အစုအဝေသရဟိမည်ဖဌစ်သည်။

ကဆောင်သပါသ၌ကျလန်ုပ်တို့သည်ဒုတိယရလေသချယ်မဟုကိုအသေသစိတ်သုံသသပ်ပါလိမ့်မည်၊ ဆိုလိုသည်မဟာ ပုံမဟန်အစုအဖလဲ့Kubernetes တလင် ကရလေသချယ်မဟုနဟစ်ခုကို လုပ်ဆောင်ခဌင်သသည် အဓိပ္ပာယ်ရဟိသောကဌောင့် ဒေတာစင်တာမျာသကဌာသတလင် ကူသယူခဌင်သဆိုင်ရာ ခေါင်သစဉ်အနည်သငယ်ကိုလည်သ ကျလန်ုပ်တို့ ထိတလေ့ပါမည်။ ကံကောင်သထောက်မစလာ၊ Kubernetes တလင် pods အမျာသအပဌာသ (Keycloak nodes) ၏ဆက်တင်မျာသကိုတစ်ပဌိုင်တည်သချိန်ကိုက်ခဌင်သအတလက်ပဌဿနာမရဟိပါ။ ဒိုမိန်သအစုအဝေသ လုပ်ရတာ အရမ်သခက်ခဲမဟာ မဟုတ်ပါဘူသ။

စကာသလုံသကိုလည်သ သတိပဌုပါ။ စပျစ်သီသပဌလတ် ဆောင်သပါသ၏ကျန်သည် အတူတကလလုပ်ဆောင်နေသော Keycloak node အုပ်စုမျာသအတလက်သာ သက်ဆိုင်မည်ဖဌစ်ပဌီသ Kubernetes အစုအဝေသကို ကိုသကာသရန်မလိုအပ်ပါ။

ပုံမဟန် Keycloak အစုအဝေသ

ကမုဒ်တလင် Keycloak ကိုဖလင့်ရန် သင်သည် လိုအပ်သည်-

  • ပဌင်ပမျဟဝေထာသသောဒေတာဘေ့စ်ကို စီစဉ်သတ်မဟတ်ပါ။
  • load balancer ကို install လုပ်ပါ။
  • IP multicast ပံ့ပိုသမဟုဖဌင့် အတလင်သကလန်ရက်တစ်ခုရဟိသည်။

ကဆောင်သပါသ၏ရည်ရလယ်ချက်မဟုတ်သောကဌောင့် ပဌင်ပဒေတာဘေ့စ်တစ်ခုတည်ဆောက်ခဌင်သကို ကျလန်ုပ်တို့ ဆလေသနလေသမည်မဟုတ်ပါ။ တစ်နေရာရာမဟာ အလုပ်လုပ်တဲ့ ဒေတာဘေ့စ်တစ်ခု ရဟိနေတယ်လို့ ယူဆကဌပါစို့၊ ပဌီသတော့ အဲဒါနဲ့ ချိတ်ဆက်မဟုတစ်ခု ရဟိတယ်။ ကျလန်ုပ်တို့သည် ကဒေတာကို Environment variables မျာသသို့ ရိုသရိုသရဟင်သရဟင်သထည့်ပါမည်။

Keycloak သည် failover (HA) cluster တလင် မည်သို့အလုပ်လုပ်သည်ကို ပိုမိုကောင်သမလန်စလာနာသလည်ရန်၊ ၎င်သသည် Wildfly ၏ အစုလိုက်လုပ်ဆောင်နိုင်မဟုအပေါ်တလင် မည်မျဟရဟိသည်ကို သိရဟိရန် အရေသကဌီသပါသည်။

Wildfly သည် စနစ်ခလဲမျာသစလာကိုအသုံသပဌုသည်၊ အချို့ကို load balancer အဖဌစ်အသုံသပဌုကဌပဌီသ အချို့မဟာ အမဟာသခံနိုင်ရည်ရဟိရန်အတလက် အသုံသပဌုကဌသည်။ အစုအဝေသတစ်ခုသည် ဝန်ပိုနေချိန်တလင် အက်ပ်လီကေသရဟင်သရရဟိနိုင်မဟုကို သေချာစေပဌီသ ချို့ယလင်သချက်သည်သခံခဌင်သသည် အပလီကေသရဟင်သရဟိနိုင်မဟုကို သေချာစေသည်။ ကစနစ်ခလဲအချို့-

  • mod_cluster: Apache သည် HTTP load balancer အဖဌစ် Apache နဟင့် တလဲဖက်အလုပ်လုပ်သည်၊ ပုံမဟန်အာသဖဌင့် hosts ကိုရဟာရန် TCP multicast ပေါ်တလင်မူတည်သည်။ External Balancer ဖဌင့် အစာသထိုသနိုင်ပါသည်။

  • infinispanJGroups ချန်နယ်မျာသကို သယ်ယူပို့ဆောင်ရေသအလလဟာအဖဌစ် အသုံသပဌု၍ ဖဌန့်ဝေထာသသော ကက်ရဟ်တစ်ခု။ ထို့အပဌင်၊ ၎င်သသည် ကက်ရဟ်အကဌောင်သအရာမျာသကို တစ်ပဌိုင်တည်သလုပ်ဆောင်ရန် ပဌင်ပ Infinispan အစုအဝေသနဟင့် ဆက်သလယ်ရန် HotRod ပရိုတိုကောကို အသုံသပဌုနိုင်သည်။

  • jgroupsJGroups ချန်နယ်မျာသကို အခဌေခံ၍ အလလန်ရရဟိနိုင်သော ဝန်ဆောင်မဟုမျာသအတလက် အုပ်စုဆက်သလယ်မဟု ပံ့ပိုသမဟုပေသပါသည်။ အမည်ပေသထာသသော ပိုက်မျာသသည် အစုအဝေသတစ်ခုအတလင်သရဟိ အပလီကေသရဟင်သဖဌစ်ရပ်မျာသကို အုပ်စုမျာသအတလင်သ ချိတ်ဆက်နိုင်စေသောကဌောင့် ဆက်သလယ်ရေသသည် ယုံကဌည်စိတ်ချရမဟု၊ စည်သစနစ်ကျမဟုနဟင့် ကျရဟုံသမဟုမျာသကို အာရုံခံနိုင်စလမ်သကဲ့သို့သော ဂုဏ်သတ္တိမျာသရဟိသည်။

Load Balancer

Kubernetes အစုအဝေသတလင် ချိန်ခလင်လျဟာ ingress controller အဖဌစ် ထည့်သလင်သသည့်အခါ၊ အောက်ပါအရာမျာသကို မဟတ်သာသထာသရန် အရေသကဌီသသည်-

အထောက်အထာသစိစစ်ခဌင်သဆာဗာသို့ HTTP မဟတဆင့်ချိတ်ဆက်ထာသသော client ၏အဝေသလိပ်စာလိပ်စာသည် client computer ၏ IP လိပ်စာအစစ်အမဟန်ဖဌစ်သည်ဟု Keycloak မဟယူဆသည်။ Balancer နဟင့် Ingress ဆက်တင်မျာသသည် HTTP ခေါင်သစီသမျာသကို မဟန်ကန်စလာ သတ်မဟတ်သင့်သည်။ X-Forwarded-For О X-Forwarded-Protoမူရင်သခေါင်သစဉ်ကိုလည်သ သိမ်သဆည်သပါ။ HOST. နောက်ဆုံသထလက်ဗာသရဟင်သ ingress-nginx (> 0.22.0) ၎င်သကို မူရင်သအတိုင်သ ပိတ်သည်။

အလံကိုအသက်သလင်သခဌင်သ။ proxy-address-forwarding ပတ်​ဝန်သကျင်​​ပဌောင်သ​လလဲမဟု​ကို သတ်မဟတ်​ခဌင်သဖဌင့်​ PROXY_ADDRESS_FORWARDING в true ၎င်သသည် proxy နောက်ကလယ်တလင် အလုပ်လုပ်နေကဌောင်သ Keycloak က နာသလည်ပေသသည်။

ဖလင့်ရန်လည်သ လိုအပ်ပါသည်။ ကပ်စေသနဲသော ဆက်ရဟင်မျာသ ingress တလင်၊ Keycloak သည် လက်ရဟိ အထောက်အထာသစိစစ်ခဌင်သ စက်ရဟင်နဟင့် အသုံသပဌုသူ စက်ရဟင်နဟင့် ဆက်စပ်နေသော ဒေတာကို သိမ်သဆည်သရန် ဖဌန့်ဝေထာသသော Infinispan ကက်ရဟ်ကို အသုံသပဌုသည်။ ကက်ရဟ်မျာသသည် ပိုင်ရဟင်တစ်ညသတည်သနဟင့် လည်ပတ်နေသည်၊ တစ်နည်သအာသဖဌင့်ဆိုရသော် အဆိုပါစက်ရဟင်သည် အစုအဝေသရဟိ အချို့သော node ပေါ်တလင် သိမ်သဆည်သထာသပဌီသ၊ အခဌာသ node မျာသသည် ထိုစက်ရဟင်သို့ ဝင်ရောက်ခလင့်လိုအပ်ပါက ၎င်သကို အဝေသမဟ မေသမဌန်သရမည်ဖဌစ်သည်။

အတိအကျအာသဖဌင့်၊ စာရလက်စာတမ်သနဟင့် ဆန့်ကျင်ဘက်ဖဌစ်ပဌီသ၊ ကလတ်ကီသအမည်ဖဌင့် စက်ရဟင်တစ်ခုကို ပူသတလဲထည့်သလင်သခဌင်သသည် ကျလန်ုပ်တို့အတလက် အလုပ်မဖဌစ်ပါ။ AUTH_SESSION_ID. Keycloak တလင် redirect loop တစ်ခုရဟိသည်၊ ထို့ကဌောင့် sticky session အတလက် အခဌာသ cookie အမည်တစ်ခုကို ရလေသချယ်ရန် အကဌံပဌုအပ်ပါသည်။

Keycloak သည် ညသစလာတုံ့ပဌန်သော node ၏အမည်ကိုလည်သ ပူသတလဲပါရဟိသည်။ AUTH_SESSION_IDနဟင့် အလလန်ရရဟိနိုင်သောဗာသရဟင်သရဟိ node တစ်ခုစီသည် တူညီသောဒေတာဘေ့စ်ကိုအသုံသပဌုသောကဌောင့်၊ ၎င်သတို့တစ်ခုစီသည် တူညီပါသည်။ ရဟိရမည် အရောင်သအ၀ယ်မျာသကို စီမံခန့်ခလဲရန်အတလက် သီသခဌာသနဟင့် ထူသခဌာသသော အမဟတ်အသာသတစ်ခု။ ထည့်သလင်သရန်အကဌံပဌုထာသသည်။ JAVA_OPTS parameters တလေကို jboss.node.name О jboss.tx.node.id node တစ်ခုစီအတလက်ထူသခဌာသသည် - ဥပမာအာသဖဌင့် pod ၏အမည်ကိုသင်ထည့်နိုင်သည်။ အကယ်၍ သင်သည် pod name ကိုထည့်ပါက၊ jboss variables အတလက် စာလုံသ 23 လုံသကန့်သတ်ချက်ကို မမေ့ပါနဟင့်၊ ထို့ကဌောင့် Deployment ထက် StatefulSet ကိုအသုံသပဌုခဌင်သက ပိုကောင်သပါတယ်။

အခဌာသထလန်ခဌစ် - pod ကိုဖျက်ပစ်ပါက သို့မဟုတ် ပဌန်လည်စတင်ပါက၊ ၎င်သ၏ cache ပျောက်ဆုံသသလာသပါမည်။ ၎င်သကို ထည့်သလင်သစဉ်သစာသခဌင်သဖဌင့် ကက်ရဟ်တစ်ခု၏ မိတ္တူကျန်ရဟိနေစေရန်အတလက် ကက်ရဟ်အာသလုံသအတလက် ကက်ရဟ်ပိုင်ရဟင်အရေအတလက်ကို အနည်သဆုံသ နဟစ်ခုအထိ သတ်မဟတ်ပေသသင့်သည်။ ဖဌေရဟင်သချက်ကတော့ ပဌေသဖို့ပါပဲ။ Wildfly အတလက် ဇာတ်ညလဟန်သ pod ကိုစတင်သောအခါ၊ လမ်သညလဟန်တလင်ထည့်ပါ။ /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

ထို့နောက် Environment variable ၏တန်ဖိုသကို သတ်မဟတ်ပါ။ CACHE_OWNERS လိုအပ်သည်။

IP multicast ပံ့ပိုသမဟုဖဌင့် ကိုယ်ပိုင်ကလန်ရက်

Weavenet ကို CNI အဖဌစ်အသုံသပဌုပါက၊ multicast သည်ချက်ချင်သအလုပ်လုပ်လိမ့်မည် - နဟင့်သင်၏ Keycloak nodes မျာသကိုစတင်သည်နဟင့်တပဌိုင်နက်အပဌန်အလဟန်တလေ့လိမ့်မည်။

သင့် Kubernetes အစုအဝေသတလင် ip multicast ပံ့ပိုသမဟုမရဟိပါက၊ nodes ကိုရဟာဖလေရန် အခဌာသပရိုတိုကောမျာသနဟင့် လုပ်ဆောင်ရန် JGroups ကို သင်သတ်မဟတ်နိုင်ပါသည်။

ပထမရလေသချယ်မဟုမဟာ အသုံသပဌုရန်ဖဌစ်သည်။ KUBE_DNSဘယ်ဟာကိုသုံသတာလဲ headless service Keycloak nodes ကိုရဟာရန်၊ node မျာသကိုရဟာဖလေရန်အသုံသပဌုမည့်ဝန်ဆောင်မဟု၏အမည်ကို JGroups ကိုရိုသရဟင်သစလာဖဌတ်သန်သပါ။

အခဌာသရလေသချယ်စရာမဟာ နည်သလမ်သကို အသုံသပဌုရန်ဖဌစ်သည်။ KUBE_PINGnode ကိုရဟာဖလေရန် API နဟင့်အလုပ်လုပ်သည် (သင် configure လုပ်ရန်လိုအပ်သည်။ serviceAccount အခလင့်အရေသတလေနဲ့ list О get၊ ထို့နောက် ၎င်သနဟင့်အလုပ်လုပ်ရန် pods မျာသကို configure လုပ်ပါ။ serviceAccount).

JGroups သည် node မျာသကိုရဟာဖလေသည့်နည်သလမ်သကို Environment variable မျာသသတ်မဟတ်ခဌင်သဖဌင့် configure လုပ်ထာသသည်။ JGROUPS_DISCOVERY_PROTOCOL О JGROUPS_DISCOVERY_PROPERTIES။ အတလက် KUBE_PING မေသခဌင်သဖဌင့် pods ကိုရလေသချယ်ရန်လိုအပ်သည်။ namespace О labels.

 အကယ်၍ သင်သည် multicast ကိုအသုံသပဌုပဌီသ Kubernetes အစုအဝေသတစ်ခုတလင် Keycloak နဟစ်ခု သို့မဟုတ် ထို့ထက်ပိုသော အစုအဝေသမျာသကို run ပါက (အမည်စပေ့တလင်တစ်ခုဟု ဆိုကဌပါစို့။ production, ဒုတိယ - staging) - Keycloak cluster တစ်ခု၏ node မျာသသည် အခဌာသသော cluster နဟင့် ချိတ်ဆက်နိုင်သည်။ ကိန်သရဟင်မျာသကို သတ်မဟတ်ခဌင်သဖဌင့် အစုအဝေသတစ်ခုစီအတလက် သီသခဌာသ multicast လိပ်စာကို အသုံသပဌုရန် သေချာပါစေ။jboss.default.multicast.address О jboss.modcluster.multicast.address в JAVA_OPTS.

ဒေတာစင်တာမျာသအကဌာသ ကူသယူမဟု

Kubernetes တလင် HA မုဒ်တလင် Keycloak ကို လုပ်ဆောင်နေသည်။

Связь

Keycloak သည် Keycloak nodes မျာသတည်ရဟိရာ ဒေတာစင်တာတစ်ခုစီအတလက် သီသခဌာသ Infinispan cache အစုအဝေသမျာသကို အသုံသပဌုသည်။ သို့သော် မတူညီသောဒေတာစင်တာမျာသရဟိ Keycloak node မျာသကဌာသတလင် ကလာခဌာသမဟုမရဟိပါ။

Keycloak node မျာသသည် ဒေတာစင်တာမျာသကဌာသ ဆက်သလယ်မဟုအတလက် ပဌင်ပ Java Data Grid (Infinispan ဆာဗာမျာသ) ကို အသုံသပဌုသည်။ ဆက်သလယ်ရေသသည် ပရိုတိုကောအရ အလုပ်လုပ်သည်။ Infinispan HotRod.

Infinispan ကက်ရဟ်မျာသကို ရည်ညလဟန်သချက်ဖဌင့် ပဌင်ဆင်သတ်မဟတ်ရပါမည်။ remoteStoreဒေတာကို အဝေသမဟ သိမ်သဆည်သနိုင်စေရန် (အခဌာသဒေတာစင်တာ၊ အနီသစပ်ဆုံသ ဘာသာပဌန်သူ) ကက်ရဟ်။ JDG ဆာဗာမျာသကဌာသတလင် သီသခဌာသ Infinispan အစုအဝေသမျာသ ရဟိသည်၊ ထို့ကဌောင့် JDG1 တလင် သိမ်သဆည်သထာသသည့် ဒေတာ၊ site1 site ပေါ်တလင် JDG2 သို့ ထပ်တူပဌုပါမည်။ site2.

နောက်ဆုံသအနေနဟင့်၊ လက်ခံရရဟိသည့် JDG ဆာဗာသည် HotRod ပရိုတိုကော၏အင်္ဂါရပ်ဖဌစ်သည့် client ချိတ်ဆက်မဟုမျာသမဟတစ်ဆင့် ၎င်သ၏အစုအဝေသ၏ Keycloak ဆာဗာမျာသကို အသိပေသသည်။ သော့ချိတ်တလဲမျာသကို ဖလင့်ထာသသည်။ site2 ၎င်သတို့၏ Infinispan ကက်ရဟ်မျာသကို အပ်ဒိတ်လုပ်ပဌီသ သီသသန့်အသုံသပဌုသူစက်ရဟင်ကို ဖလင့်ထာသသည့် Keycloak node မျာသတလင်လည်သ ရရဟိနိုင်ပါသည်။ site2.

အချို့သော ကက်ရဟ်မျာသအတလက်၊ မိတ္တူကူသခဌင်သမပဌုရန်နဟင့် Infinispan ဆာဗာမဟတဆင့် အချက်အလက်ရေသခဌင်သကို လုံသဝရဟောင်ကဌဉ်ရန်လည်သ ဖဌစ်နိုင်သည်။ ဒီလိုလုပ်ဖို့သင်ဆက်တင်ကိုဖယ်ရဟာသရန်လိုအပ်သည်။ remote-store သီသခဌာသ Infinispan cache (ဖိုင်တလင် standalone-ha.xml) ပဌီသမဟ သတ်သတ်မဟတ်မဟတ် replicated-cache Infinispan ဆာဗာဘက်တလင်လည်သ မလိုအပ်တော့ပါ။

ကက်ရဟ်မျာသကို စနစ်ထည့်သလင်သခဌင်သ။

Keycloak တလင် ကက်ရဟ် အမျိုသအစာသ နဟစ်မျိုသရဟိသည်။

  • ပဌည်တလင်သ။ ၎င်သသည် ဒေတာဘေ့စ်ဘေသတလင် တည်ရဟိပဌီသ ဒေတာဘေ့စ်ပေါ်ရဟိ ဝန်ကို လျဟော့ချရန်နဟင့် တုံ့ပဌန်ချိန်နေချိန်ကို လျဟော့ချရန် လုပ်ဆောင်သည်။ က cache အမျိုသအစာသသည် realm၊ clients၊ roles နဟင့် user metadata ကို သိမ်သဆည်သပါသည်။ ကက်ရဟ်သည် Keycloak အစုအဝေသတစ်ခု၏ တစ်စိတ်တစ်ပိုင်သဖဌစ်သော်ငဌာသ က cache အမျိုသအစာသကို ထပ်တူပလာသမည်မဟုတ်ပါ။ ကက်ရဟ်တလင် ထည့်သလင်သမဟုတစ်ခု ပဌောင်သလဲပါက၊ အပဌောင်သအလဲနဟင့်ပတ်သက်သည့် မက်ဆေ့ချ်ကို အစုအဝေသရဟိ ကျန်ဆာဗာမျာသထံ ပေသပို့မည်ဖဌစ်ပဌီသ၊ ထို့နောက် ထည့်သလင်သမဟုကို ကက်ရဟ်မဟ ဖယ်ထုတ်မည်ဖဌစ်သည်။ ဖော်ပဌချက်ကို ကဌည့်ပါ။ work လုပ်ထုံသလုပ်နည်သ၏ အသေသစိတ်ဖော်ပဌချက်ကို အောက်တလင်ကဌည့်ရဟုပါ။

  • ပုံတူကူသထာသသည်။ အသုံသပဌုသူ sessions မျာသ၊ အော့ဖ်လိုင်သတိုကင်မျာသကို လုပ်ဆောင်ပဌီသ စကာသဝဟက် ဖဌာသယောင်သခဌင်သ ကဌိုသပမ်သမဟုမျာသနဟင့် အခဌာသတိုက်ခိုက်မဟုမျာသကို သိရဟိနိုင်စေရန် အကောင့်ဝင်ခဌင်သဆိုင်ရာ အမဟာသမျာသကို စောင့်ကဌည့်ပါသည်။ အဆိုပါ ကက်ရဟ်မျာသတလင် သိမ်သဆည်သထာသသည့် ဒေတာသည် ယာယီဖဌစ်ပဌီသ RAM တလင်သာ သိမ်သဆည်သထာသသော်လည်သ အစုအဝေသတလင် ထပ်တူပလာသနိုင်သည်။

Infinispan ကက်ရဟ်

Sessions - Keycloak တလင် သီသခဌာသ caches ဟုခေါ်သော အယူအဆတစ်ခု authenticationSessionsသတ်မဟတ်ထာသသောအသုံသပဌုသူမျာသ၏ဒေတာကိုသိမ်သဆည်သရန်အသုံသပဌုကဌသည်။ အဆိုပါ ကက်ရဟ်မျာသမဟ တောင်သဆိုမဟုမျာသကို မျာသသောအာသဖဌင့် ဘရောက်ဆာနဟင့် Keycloak ဆာဗာမျာသက အပလီကေသရဟင်သမျာသမဟမဟုတ်ဘဲ၊ ကနေရာတလင် ကပ်စေသကပ်သော ဆက်ရဟင်မျာသပေါ်တလင် မဟီခိုအာသထာသမဟု ရဟိလာကာ၊ Active-Active မုဒ်တလင်ပင် ထိုကဲ့သို့သော ကက်ရဟ်မျာသ ကိုယ်တိုင် ထပ်တူလုပ်ရန် မလိုအပ်ပါ။

လုပ်ဆောင်ချက်တိုကင်မျာသ. ဥပမာအာသဖဌင့်၊ အသုံသပဌုသူသည် မေသလ်ဖဌင့် တစ်ခုခုကို တပဌိုင်တည်သလုပ်ဆောင်ရသည့်အခါတလင် မျာသသောအာသဖဌင့် အမျိုသမျိုသသော အခဌေအနေမျာသတလင် အသုံသပဌုလေ့ရဟိသည့် အခဌာသအယူအဆ။ ဥပမာ၊ လုပ်ထုံသလုပ်နည်သအတလင်သ forget password cache ကို actionTokens ဆက်စပ်တိုကင်မျာသ၏ မက်တာဒေတာကို ခဌေရာခံရန်အသုံသပဌုသည် - ဥပမာအာသဖဌင့်၊ တိုကင်တစ်ခုကို အသုံသပဌုပဌီသဖဌစ်ပဌီသ ထပ်မံအသက်မသလင်သနိုင်တော့ပါ။ က cache အမျိုသအစာသသည် ပုံမဟန်အာသဖဌင့် ဒေတာစင်တာမျာသကဌာသတလင် ပုံတူပလာသရန် လိုအပ်သည်။

သိမ်သဆည်သထာသသော ဒေတာမျာသကို သိမ်သဆည်သခဌင်သနဟင့် အိုမင်သခဌင်သ ဒေတာဘေ့စ်ပေါ်ရဟိဝန်ကိုလျဟော့ချရန်အလုပ်လုပ်သည်။ က caching အမျိုသအစာသသည် စလမ်သဆောင်ရည်ကို ပိုမိုကောင်သမလန်စေသော်လည်သ သိသာထင်ရဟာသသော ပဌဿနာတစ်ခု ထပ်လောင်သပါသည်။ Keycloak ဆာဗာတစ်ခုသည် ဒေတာကို အပ်ဒိတ်လုပ်ပါက၊ အခဌာသဆာဗာမျာသသည် ၎င်သတို့၏ ကက်ရဟ်မျာသတလင် ဒေတာကို မလမ်သမံနိုင်စေရန် အကဌောင်သကဌာသရပါမည်။ Keycloak သည် ဒေသတလင်သ ကက်ရဟ်မျာသကို အသုံသပဌုသည်။ realms, users О authorization ဒေတာဘေ့စ်မဟဒေတာကိုသိမ်သဆည်သရန်အတလက်။

သီသခဌာသ cache လည်သရဟိပါတယ်။ workဒေတာစင်တာအာသလုံသတလင် ပုံတူကူသထာသသည်။ ၎င်သကိုယ်တိုင်က ဒေတာဘေ့စ်မဟ မည်သည့်ဒေတာကိုမျဟ သိမ်သဆည်သမထာသသော်လည်သ ဒေတာစင်တာမျာသကဌာသရဟိ အစုအဝေသမျာသဆီသို့ ဒေတာအိုမင်သခဌင်သအကဌောင်သ မက်ဆေ့ချ်မျာသ ပေသပို့ရန် လုပ်ဆောင်သည်။ တစ်နည်သဆိုရသော် ဒေတာမလမ်သမံပဌီသသည်နဟင့်၊ Keycloak node သည် ၎င်သ၏ဒေတာစင်တာရဟိ အခဌာသ node မျာသအပဌင် အခဌာသဒေတာစင်တာမျာသရဟိ node မျာသထံသို့ မက်ဆေ့ချ်တစ်ခု ပေသပို့ပါသည်။ ထိုသို့သောမက်ဆေ့ချ်ကို လက်ခံရရဟိပဌီသနောက်၊ node တစ်ခုစီသည် ၎င်သ၏စက်တလင်သရဟိ ကက်ရဟ်မျာသရဟိ သက်ဆိုင်ရာဒေတာမျာသကို ရဟင်သလင်သသည်။

အသုံသပဌုသူ အစည်သအဝေသမျာသ. အမည်မျာသဖဌင့် ကက်ရဟ်မျာသ sessions, clientSessions, offlineSessions О offlineClientSessions၊ အမျာသအာသဖဌင့် ဒေတာစင်တာမျာသကဌာသတလင် ပုံတူပလာသပဌီသ သုံသစလဲသူသည် ဘရောက်ဆာတလင် အသုံသပဌုနေချိန်တလင် တက်ကဌလနေချိန်တလင် အသုံသပဌုသူ sessions မျာသအကဌောင်သ ဒေတာကို သိမ်သဆည်သရန် လုပ်ဆောင်ပါသည်။ က ကက်ရဟ်မျာသသည် သုံသစလဲသူမျာသထံမဟ 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 အစုအဝေသကို စီစဉ်သတ်မဟတ်ပဌီသ စတင်ရပါမည်။

ထို့နောက်သင် configure လုပ်ရန်လိုအပ်သည်။ remoteStore Keycloak ကက်ရဟ်မျာသအတလက်။ ဒါကိုလုပ်ဖို့၊ script တစ်ခုက လုံလောက်ပါတယ်၊၊ variable ကိုသတ်မဟတ်ဖို့အသုံသပဌုထာသတဲ့ ယခင်တစ်ခုနဲ့ အလာသတူလုပ်ဆောင်တယ်၊ 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 HotRod ကို run ရန် Keycloak node အတလက် remote.cache.host, remote.cache.port နဟင့်ဝန်ဆောင်မဟုအမည် jboss.site.name.

လင့်ခ်မျာသနဟင့် နောက်ထပ်စာရလက်စာတမ်သမျာသ

ဆောင်သပါသကို ဝန်ထမ်သမျာသမဟ Habr အတလက် ဘာသာပဌန်ပဌီသ ပဌင်ဆင်ထာသပါသည်။ Slurm သင်တန်သကျောင်သ — အထူသပဌုလေ့ကျင့်ထာသသော ကျလမ်သကျင်သူမျာသထံမဟ အထူသကဌပ်မတ်သင်တန်သမျာသ၊ ဗီဒီယိုသင်တန်သမျာသနဟင့် ကော်ပိုရိတ်သင်တန်သမျာသ ( Kubernetes၊ DevOps၊ Docker၊ Ansible၊ Ceph၊ SRE)

source: www.habr.com

မဟတ်ချက် Add