ProHoster > Blogs > AdministrÄcija > Kubernetes paplaÅ”inÄÅ”ana un papildinÄÅ”ana (pÄrskats un video reportÄža)
Kubernetes paplaÅ”inÄÅ”ana un papildinÄÅ”ana (pÄrskats un video reportÄža)
8. aprÄ«lÄ« konferencÄ Saint HighLoad++ 2019, sadaļas āDevOps and Operationsā ietvaros tika sniegts ziÅojums āKubernetes paplaÅ”inÄÅ”ana un papildinÄÅ”anaā, kura tapÅ”anÄ piedalÄ«jÄs trÄ«s uzÅÄmuma Flant darbinieki. TajÄ runÄjam par neskaitÄmÄm situÄcijÄm, kurÄs vÄlÄjÄmies paplaÅ”inÄt un papildinÄt Kubernetes iespÄjas, bet kurÄm neatradÄm gatavu un vienkÄrÅ”u risinÄjumu. Mums ir nepiecieÅ”amie risinÄjumi Open Source projektu veidÄ, un arÄ« Ŕī runa ir veltÄ«ta tiem.
SaskaÅÄ ar tradÄ«ciju mÄs esam priecÄ«gi iepazÄ«stinÄt reportÄžas video (50 minÅ«tes, daudz informatÄ«vÄks par rakstu) un galvenais kopsavilkums teksta formÄ. Aiziet!
Kodols un papildinÄjumi K8s
Kubernetes maina jau sen iedibinÄto nozari un pieejas administrÄcijai:
Paldies viÅam abstrakcijas, mÄs vairs nedarbojamies ar tÄdiem jÄdzieniem kÄ konfigurÄcijas iestatÄ«Å”ana vai komandas palaiÅ”ana (Chef, Ansible...), bet izmantojam konteineru grupÄÅ”anu, pakalpojumus utt.
MÄs varam sagatavot pieteikumus, nedomÄjot par niansÄm konkrÄta vietne, uz kura tas tiks palaists: pliks metÄls, viena no pakalpojumu sniedzÄju mÄkonis utt.
Ar K8 jÅ«s nekad neesat bijis tik pieejams labÄkÄ prakse par infrastruktÅ«ras organizÄÅ”anu: mÄrogoÅ”anas paÅÄmieni, paÅ”atveseļoÅ”anÄs, kļūdu tolerance utt.
TomÄr, protams, viss nav tik gludi: Kubernetes atnesa arÄ« savus jaunus izaicinÄjumus.
Kubernetes nÄ ir kombains, kas atrisina visas visu lietotÄju problÄmas. kodols Kubernetes ir atbildÄ«gs tikai par minimÄlo nepiecieÅ”amo funkciju kopumu katrs klasteris:
Kubernetes kodols definÄ pamata primitÄ«vu kopu konteineru grupÄÅ”anai, datplÅ«smas pÄrvaldÄ«bai un tÄ tÄlÄk. MÄs par tiem runÄjÄm sÄ«kÄk ziÅojums pirms 2 gadiem.
SavukÄrt K8s piedÄvÄ lieliskas iespÄjas paplaÅ”inÄt pieejamÄs funkcijas, kas palÄ«dz aizvÄrt citas - specifisks ā lietotÄju vajadzÄ«bas. Par Kubernetes papildinÄjumiem ir atbildÄ«gi klasteru administratori, kuriem ir jÄinstalÄ un jÄkonfigurÄ viss nepiecieÅ”amais, lai klasteris bÅ«tu āpareizÄ formÄā [lai atrisinÄtu viÅu Ä«paÅ”Äs problÄmas]. KÄdi ir Å”ie papildinÄjumi? ApskatÄ«sim dažus piemÄrus.
PapildinÄjumu piemÄri
PÄc Kubernetes instalÄÅ”anas mÄs varam bÅ«t pÄrsteigti, ka tÄ«kloÅ”ana, kas ir tik nepiecieÅ”ama podiÅu mijiedarbÄ«bai gan mezglÄ, gan starp mezgliem, nedarbojas pati par sevi. Kubernetes kodols negarantÄ nepiecieÅ”amos savienojumus; tÄ vietÄ tas nosaka tÄ«klu saskarne (CNI) treÅ”o puÅ”u papildinÄjumiem. Mums ir jÄinstalÄ viens no Å”iem papildinÄjumiem, kas bÅ«s atbildÄ«gs par tÄ«kla konfigurÄciju.
Tuvs piemÄrs ir datu uzglabÄÅ”anas risinÄjumi (lokÄlais disks, tÄ«kla bloka ierÄ«ce, Ceph...). SÄkotnÄji tie bija kodolÄ, bet ar adventi CSI situÄcija mainÄs uz kaut ko lÄ«dzÄ«gu jau aprakstÄ«tajam: interfeiss ir Kubernetes, un tÄ ievieÅ”ana ir treÅ”Äs puses moduļos.
Operatori ir vesela pievienojumprogrammu klase (kas ietver minÄto sertifikÄtu pÄrvaldnieku), tie definÄ primitÄ«vu(s) un kontrolieri(-us). ViÅu darba loÄ£iku ierobežo tikai mÅ«su iztÄle un tas ļauj gatavus infrastruktÅ«ras komponentus (piemÄram, DBVS) pÄrvÄrst primitÄ«vos, ar kuriem strÄdÄt ir daudz vieglÄk (nekÄ ar konteineru komplektu un to iestatÄ«jumiem). Ir uzrakstÄ«ts milzÄ«gs skaits operatoru - pat ja daudzi no tiem vÄl nav gatavi ražoÅ”anai, tas ir tikai laika jautÄjums:
Metrika - vÄl viens piemÄrs tam, kÄ Kubernetes atdalÄ«ja saskarni (Metrics API) no ievieÅ”anas (treÅ”Äs puses papildinÄjumi, piemÄram, Prometheus adapteris, Datadog klastera aÄ£ents...).
Par uzraudzÄ«ba un statistika, kur praksÄ ir vajadzÄ«gas ne tikai Prometejs un Grafana, bet arÄ« kube-state-metrics, node-exporter utt.
Un tas nav pilnÄ«gs papildinÄjumu saraksts... PiemÄram, uzÅÄmumÄ Flant, kuru mÄs Å”obrÄ«d uzstÄdÄm 29 papildinÄjumi (visi kopÄ veido 249 Kubernetes objektus). VienkÄrÅ”i sakot, mÄs nevaram redzÄt klastera dzÄ«vi bez papildinÄjumiem.
AutomatizÄcija
Operatori ir paredzÄti, lai automatizÄtu ikdienas darbÄ«bas, ar kurÄm saskaramies katru dienu. Å eit ir reÄli piemÄri, kuriem operatora rakstÄ«Å”ana bÅ«tu lielisks risinÄjums:
Lietojumprogrammai ir privÄts (t.i., nepiecieÅ”ams pieteikÅ”anÄs) reÄ£istrs ar attÄliem. Tiek pieÅemts, ka katram podam ir pieŔķirts Ä«paÅ”s noslÄpums, kas ļauj veikt autentifikÄciju reÄ£istrÄ. MÅ«su uzdevums ir nodroÅ”inÄt, lai Å”is noslÄpums tiktu atrasts nosaukumu telpÄ, lai podi varÄtu lejupielÄdÄt attÄlus. Lietojumprogrammu var bÅ«t daudz (katrai no tÄm ir nepiecieÅ”ams noslÄpums), un ir lietderÄ«gi regulÄri atjauninÄt paÅ”us noslÄpumus, tÄpÄc tiek izslÄgta iespÄja noslÄpumus izkÄrtot ar roku. Å eit palÄ«gÄ nÄk operators: mÄs izveidojam kontrolieri, kas gaidÄ«s, lÄ«dz parÄdÄ«sies nosaukumvieta, un, pamatojoties uz Å”o notikumu, pievienos nosaukumvietai noslÄpumu.
Ä»aut pÄc noklusÄjuma piekļuve internetam no podiem ir aizliegta. Bet dažreiz tas var bÅ«t nepiecieÅ”ams: ir loÄ£iski, ka piekļuves atļauju mehÄnisms darbojas vienkÄrÅ”i, neprasot Ä«paÅ”as prasmes, piemÄram, ar noteiktas etiÄ·etes klÄtbÅ«tni nosaukumu telpÄ. KÄ operators var mums Å”eit palÄ«dzÄt? Tiek izveidots kontrolleris, kas gaida, lÄ«dz nosaukumvietÄ parÄdÄ«sies etiÄ·ete, un pievieno atbilstoÅ”u interneta piekļuves politiku.
LÄ«dzÄ«ga situÄcija: pieÅemsim, ka mums vajadzÄja pievienot noteiktu piesÄrÅojums, ja tam ir lÄ«dzÄ«ga etiÄ·ete (ar kÄdu prefiksu). DarbÄ«bas ar operatoru ir acÄ«mredzamas...
JebkurÄ klasterÄ« ir jÄatrisina rutÄ«nas uzdevumi, un pareizi to var izdarÄ«t, izmantojot operatorus.
Apkopojot visus aprakstÄ«tos stÄstus, nonÄcÄm pie secinÄjuma, ka Ärtam darbam Kubernetes nepiecieÅ”ams: A) instalÄt papildinÄjumus, b) attÄ«stÄ«t operatorus (ikdienas admin uzdevumu risinÄÅ”anai).
KÄ uzrakstÄ«t Kubernetes paziÅojumu?
KopumÄ shÄma ir vienkÄrÅ”a:
... bet tad izrÄdÄs, ka:
Kubernetes API ir diezgan nenozīmīga lieta, kuras apgūŔana prasa daudz laika;
arÄ« programmÄÅ”ana nav piemÄrota visiem (kÄ vÄlamÄ valoda tika izvÄlÄta Go valoda, jo tai ir Ä«paÅ”s ietvars - Operatora SDK);
LÄ«dzÄ«ga situÄcija ir ar paÅ”u karkasu.
ApakÅ”ÄjÄ lÄ«nija: lai uzrakstÄ«tu kontrolieri (operatoram) ir tÄrÄ ievÄrojamus resursus pÄtÄ«t materiÄlus. Tas bÅ«tu attaisnojams "lieliem" operatoriem - piemÄram, MySQL DBVS. Bet, ja atcerÄsimies iepriekÅ” aprakstÄ«tos piemÄrus (noslÄpumu izpauÅ”ana, piekļuve internetam...), ko arÄ« vÄlamies izdarÄ«t pareizi, tad sapratÄ«sim, ka iztÄrÄtÄs pÅ«les atsvÄrs mums Å”obrÄ«d nepiecieÅ”amo rezultÄtu:
KopumÄ rodas dilemma: tÄrÄt daudz resursu un atrast pareizo rÄ«ku paziÅojumu rakstÄ«Å”anai vai darÄ«t to vecmodÄ«gi (bet Ätri). Lai to atrisinÄtu - lai atrastu kompromisu starp Ŕīm galÄjÄ«bÄm - mÄs izveidojÄm savu projektu: Äaulas operators(skatiet arÄ« viÅa nesenais paziÅojums uz centrmezgla).
Apvalka operators
KÄ viÅÅ” strÄdÄ? Klasterim ir pods, kurÄ ir Go binÄrs ar Äaulas operatoru. Blakus viÅam ir komplekts ÄÄ·i(sÄ«kÄka informÄcija par tiem - skatÄ«t zemÄk). Pats Äaulas operators abonÄ noteiktus attÄ«stÄ«ba Kubernetes API, pÄc kuras parÄdÄ«Å”anÄs tas palaiž atbilstoÅ”os ÄÄ·us.
KÄ Äaulas operators zina, kurus ÄÄ·us izsaukt par kÄdiem notikumiem? Å o informÄciju Äaulas operatoram pÄrraida paÅ”i ÄÄ·i, un viÅi to dara ļoti vienkÄrÅ”i.
ÄÄ·is ir Bash skripts vai jebkurÅ” cits izpildÄms fails, kas pieÅem vienu argumentu --config un atbild ar JSON. PÄdÄjais nosaka, kuri objekti to interesÄ un uz kÄdiem notikumiem (Å”iem objektiem) ir jÄreaÄ£Ä:
Es ilustrÄÅ”u viena no mÅ«su piemÄriem Äaulas operatora ievieÅ”anu - noslÄpumu sadalÄ«Å”anu, lai piekļūtu privÄtam reÄ£istram ar lietojumprogrammu attÄliem. Tas sastÄv no diviem posmiem.
Prakse: 1. Uzrakstiet ÄÄ·i
PirmkÄrt, ÄÄ·Ä« mÄs apstrÄdÄsim --config, norÄdot, ka mÅ«s interesÄ nosaukumvietas un konkrÄti to izveides brÄ«dis:
Å is ir sistÄmas komponents, kuram (vismaz) ir vajadzÄ«gas tiesÄ«bas abonÄt notikumus pakalpojumÄ Kubernetes un pieŔķirt noslÄpumus nosaukumvietÄm, tÄpÄc mÄs izveidojam pakalpojuma kontu (un noteikumu kopu) ÄÄ·im.
RezultÄts - mÄs atrisinÄjÄm savu problÄmu radiniekiem par Kubernetes tÄdÄ veidÄ, kas izveido operatoru noslÄpumu sadalÄ«Å”anai.
Citas Äaulas operatora funkcijas
Lai ierobežotu jÅ«su izvÄlÄtÄ tipa objektus, ar kuriem darbosies ÄÄ·is, tos var filtrÄt, izvÄloties atbilstoÅ”i noteiktÄm etiÄ·etÄm (vai izmantojot matchExpressions):
Ar nosacÄ«jumu deduplikÄcijas mehÄnisms, kas - izmantojot jq filtru - ļauj pÄrvÄrst lielus JSON objektus mazos, kur paliek tikai tie parametri, kurus mÄs vÄlamies uzraudzÄ«t, lai veiktu izmaiÅas.
Kad tiek izsaukts ÄÄ·is, Äaulas operators to palaiž garÄm objekta dati, ko var izmantot jebkurai vajadzÄ«bai.
Notikumi, kas izraisa ÄÄ·us, neaprobežojas tikai ar Kubernetes notikumiem: Äaulas operators nodroÅ”ina atbalstu zvana ÄÄ·i pÄc laika (lÄ«dzÄ«gi kÄ crontab tradicionÄlajÄ plÄnotÄjÄ), kÄ arÄ« Ä«paÅ”s notikums onStartup. Visus Å”os notikumus var apvienot un pieŔķirt vienam un tam paÅ”am ÄÄ·im.
Un vÄl divas Äaulas operatora funkcijas:
Tas strÄdÄ asinhroni. TÄ kÄ tika saÅemts Kubernetes notikums (piemÄram, objekts, kas tiek izveidots), klasterÄ« varÄja notikt citi notikumi (piemÄram, tas pats objekts tika dzÄsts), un ÄÄ·iem tas ir jÄÅem vÄrÄ. Ja ÄÄ·is tika izpildÄ«ts ar kļūdu, tad pÄc noklusÄjuma tÄ bÅ«s pÄrzvanÄ«t lÄ«dz veiksmÄ«gai pabeigÅ”anai (Å”o uzvedÄ«bu var mainÄ«t).
Tas eksportÄ metriku par Prometheus, ar kuru jÅ«s varat saprast, vai Äaulas operators darbojas, uzziniet katra ÄÄ·a kļūdu skaitu un paÅ”reizÄjo rindas lielumu.
Lai apkopotu Å”o ziÅojuma daļu:
PapildinÄjumu instalÄÅ”ana
Ärtam darbam ar Kubernetes tika pieminÄta arÄ« nepiecieÅ”amÄ«ba instalÄt papildinÄjumus. Es jums par to pastÄstÄ«Å”u, izmantojot piemÄru par mÅ«su uzÅÄmuma ceļu uz to, kÄ mÄs to darÄm tagad.
Ar Kubernetes sÄkÄm strÄdÄt ar vairÄkiem klasteriem, kuru vienÄ«gais papildinÄjums bija Ingress. KatrÄ klasterÄ« tas bija jÄinstalÄ atŔķirÄ«gi, un mÄs izveidojÄm vairÄkas YAML konfigurÄcijas dažÄdÄm vidÄm: tukÅ”s metÄls, AWS...
TÄ kÄ bija vairÄk kopu, bija vairÄk konfigurÄciju. TurklÄt mÄs paÅ”i uzlabojÄm Ŕīs konfigurÄcijas, kÄ rezultÄtÄ tÄs kļuva diezgan neviendabÄ«gas:
Lai visu sakÄrtotu, sÄkÄm ar skriptu (install-ingress.sh), kas par argumentu izmantoja klastera veidu, kurÄ mÄs izvietosim, Ä£enerÄja nepiecieÅ”amo YAML konfigurÄciju un izlaida to Kubernetes.
ÄŖsÄk sakot, mÅ«su tÄlÄkais ceļŔ un ar to saistÄ«tie argumenti bija Å”Ädi:
lai strÄdÄtu ar YAML konfigurÄcijÄm, ir nepiecieÅ”ams veidÅu dzinÄjs (pirmajos posmos tas ir vienkÄrÅ”s sed);
palielinoties klasteru skaitam, radÄs nepiecieÅ”amÄ«ba pÄc automÄtiskÄs atjauninÄÅ”anas (agrÄkais risinÄjums bija ievietot skriptu Git, atjauninÄt to izmantojot cron un palaist);
lÄ«dzÄ«gs skripts bija vajadzÄ«gs Prometejam (install-prometheus.sh), tomÄr tas ir ievÄrojams ar to, ka tas prasa daudz vairÄk ievades datu, kÄ arÄ« to glabÄÅ”anas (labÄ nozÄ«mÄ - centralizÄti un klasterÄ«), un daži dati (paroles) varÄtu tikt Ä£enerÄti automÄtiski:
PastÄvÄ«gi pieauga risks ieviest kaut ko nepareizu arvien lielÄkam skaitam klasteru, tÄpÄc mÄs sapratÄm, ka instalÄtÄji (t.i., divi skripti: Ingress un Prometheus) bija nepiecieÅ”ama inscenÄÅ”ana (vairÄki zari GitÄ, vairÄki kroni, lai tos atjauninÄtu atbilstoÅ”ajos: stabilajos vai testa klasteros);
Ń kubectl apply ar to ir kļuvis grÅ«ti strÄdÄt, jo tas nav deklaratÄ«vs un var tikai izveidot objektus, bet nevar pieÅemt lÄmumus par to statusu/dzÄst;
Mums trÅ«ka dažas funkcijas, kuras mÄs tobrÄ«d nemaz nebijÄm ieviesuÅ”i:
TÄ pamatÄ ir jau pieminÄtais Äaulas operators. Visa sistÄma izskatÄs Å”Ädi:
Apvalka operatora ÄÄ·iem ir pievienots:
vÄrtÄ«bu glabÄÅ”ana,
Stūres diagramma,
sastÄvdaļa, kas uzrauga vÄrtÄ«bu krÄtuvi un - jebkÄdu izmaiÅu gadÄ«jumÄ - lÅ«dz Helmu pÄrrullÄt diagrammu.
TÄdÄjÄdi mÄs varam reaÄ£Ät uz notikumu Kubernetes, palaist ÄÄ·i un no Ŕī ÄÄ·a veikt izmaiÅas krÄtuvÄ, pÄc tam diagramma tiks atkÄrtoti lejupielÄdÄta. IegÅ«tajÄ diagrammÄ mÄs sadalÄm ÄÄ·u kopu un diagrammu vienÄ komponentÄ, ko mÄs saucam modulis:
Var bÅ«t daudz moduļu, un tiem mÄs pievienojam globÄlos ÄÄ·us, globÄlo vÄrtÄ«bu krÄtuvi un komponentu, kas uzrauga Å”o globÄlo veikalu.
Tagad, kad kaut kas notiek Kubernetes, mÄs varam uz to reaÄ£Ät, izmantojot globÄlo ÄÄ·i un kaut ko mainÄ«t globÄlajÄ veikalÄ. Å Ä«s izmaiÅas tiks pamanÄ«tas un izraisÄ«s visu klastera moduļu izlaiÅ”anu:
Å Ä« shÄma atbilst visÄm iepriekÅ” minÄtajÄm pievienojumprogrammu instalÄÅ”anas prasÄ«bÄm:
Helms ir atbildÄ«gs par Å”ablonu veidoÅ”anu un deklarativitÄti.
AutomÄtiskÄs atjauninÄÅ”anas problÄma tika atrisinÄta, izmantojot globÄlo ÄÄ·i, kas pÄc grafika tiek novirzÄ«ts uz reÄ£istru un, ja tajÄ tiek parÄdÄ«ts jauns sistÄmas attÄls, to izlaiž (t.i., āpatsā).
IestatÄ«jumu glabÄÅ”ana klasterÄ« tiek Ä«stenota, izmantojot ConfigMap, kurÄ ir krÄtuvju primÄrie dati (palaiÅ”anas laikÄ tie tiek ielÄdÄti krÄtuvÄs).
ProblÄmas ar paroļu Ä£enerÄÅ”anu, atklÄÅ”anu un nepÄrtrauktu atklÄÅ”anu tika atrisinÄtas, izmantojot ÄÄ·us.
UzstÄdÄ«Å”ana tiek panÄkta, pateicoties tagiem, kurus Docker atbalsta no kastes.
RezultÄts tiek uzraudzÄ«ts, izmantojot metriku, pÄc kuras mÄs varam saprast statusu.
Visa Ŕī sistÄma Go ir ieviesta viena binÄra formÄtÄ, ko sauc par addon-operator. Tas padara diagrammu vienkÄrÅ”Äku:
Å Ä«s diagrammas galvenÄ sastÄvdaļa ir moduļu komplekts (zemÄk izcelts pelÄkÄ krÄsÄ). Tagad mÄs varam ar nelielu piepÅ«li uzrakstÄ«t moduli vajadzÄ«gajam papildinÄjumam un bÅ«t droÅ”i, ka tas tiks instalÄts katrÄ klasterÄ«, tiks atjauninÄts un reaÄ£Äs uz nepiecieÅ”amajiem notikumiem klasterÄ«.
"Flant" lietojumi papildinÄjumu operators uz 70+ Kubernetes klasteriem. PaÅ”reizÄjais statuss - alfa versija. Tagad mÄs gatavojam dokumentÄciju beta versijas izlaiÅ”anai, bet pagaidÄm repozitorijÄ pieejami piemÄri, uz kuras pamata jÅ«s varat izveidot savu papildinÄjumu.
Kur es varu iegÅ«t moduļus addon-operatoram? BibliotÄkas izdoÅ”ana mums ir nÄkamais posms; plÄnojam to paveikt vasarÄ.