Minu nimi on Sergei, ma olen ettevÔttest ITSumma ja tahan rÀÀkida, kuidas me lÀheneme varundamisele Kuberneteses. Viimasel ajal olen palju nÔustamistööd teinud erinevate devops-lahenduste rakendamise nimel, töötades erinevate meeskondadega, sealhulgas projektides, mis kasutavad K8s-i. Uptime day 4 konverentsil, kus arutati keerukate arhitektuuride varundamist, esitlesin ettekannet "kuubiku" varundamisest ning see on selle vabalt tÔlgendatud kokkuvÔte. Avalikult tahan eelnevalt mÀrkida, et see ei ole otsene juhend, vaid pigem toimetuslik kokkuvÔte antud teemal.

PĂ”himĂ”tteliselt on jĂ€lgimine ja varundamine kaks peamist tööriista, mis suurendavad projekti tĂ”rketaluvust. Aga kas Kubernetesis ei ole kĂ”ik ise tasakaalus, kĂŒsiksite te? KĂ”ik skaleerub automaatselt ja kui midagi juhtub, siis tĂ”useb see ise... See tĂ€hendab, et esmapilgul teema uurimisel vastas internet mulle kĂŒsimusele, kuidas lĂ€henetakse K8s-i varundamisele, 'miks ĂŒldse?'. Paljud arvavad, et Kubernetes on nagu maagiline tööriist, mis vabastab kĂ”ikidest infrastruktuuri probleemidest ja tagab, et projekt ei kuku kunagi kokku. Kuid... maailm ei ole see, milleks see nĂ€ib.
Kuidas me varundamisprotsessi varem lĂ€henesime? Meil olid identsed teenusepakkujad â kas see olid virtuaalmasinad vĂ”i fĂŒĂŒsilised serverid, serverid, millele rakendasime kolme pĂ”hipraktikat:
- koodi ja staatika sĂŒnkroniseerimine
- konfiguratsioonide sĂŒnkroniseerimine
- andmebaasi replikatsioon
Ja voilĂ : igal ajal saame ĂŒle lĂŒlituda varuplatsile, kĂ”ik on Ă”nnelikud, tĂ”usame ja lahkume.

Mida meile pakutakse meie kubernetes-rakenduse pideva kĂ€ttesaadavuse suurendamiseks? Esimene asi, millest ĂŒtleb mitteametlik dokumentatsioon, on paigaldada palju masinaid, luua palju meistreid - nende arv peaks rahuldama kvorumi saavutamise tingimusi klastris ja et iga meistri juures oleks töös etcd, api, MC, scheduler⊠Ja nĂ€ib, et kĂ”ik on suurepĂ€rane: kui mĂ”ned töönoodid vĂ”i meistrid rikki lĂ€hevad, siis meie klaster tasakaalustatakse ĂŒmber ja rakendus töötab edasi. JĂ€lle nĂ€eb see vĂ€lja nagu maagia! Kuid tihti on meie klaster ĂŒhe andmekeskuse raames ja see vĂ”ib tekitada teatud kĂŒsimusi. Mis juhtub, kui kaevur tuleb ja kaevab kaabli ĂŒles, vĂ€lk lööb, toimub universaalne uputus? KĂ”ik on katki, meie klastrit enam pole. Kuidas lĂ€heneda varundamisele arvestades seda probleemipoolt?
Esiteks peaks teil olema veel ĂŒks klaster sooja varuna, st klaster, millele saate igal ajal ĂŒle minna. Samuti peaksid infrastruktuuri poolest olema klastrid tĂ€iesti identsed. See tĂ€hendab, et kui on mingeid mitte-standardseid pluginaid failisĂŒsteemiga töötamiseks, kohandatud lahendusi ingressiks, peavad need olema teie kahel (vĂ”i kolmel, vĂ”i kĂŒmnel, siin on see juba raha ja administraatorite jĂ”upingutuste kĂŒsimus) klastril tĂ€iesti identsed. Tuleb selgelt mÀÀratleda kaks rakenduste (deploymentâide, statefulsetâide, daemonsetâide, cronjobâide jne) komplekti: millised neist vĂ”ivad pidevalt töötada varunduses ja milliseid on parem mitte kĂ€ivitada enne otsest ĂŒleminekut.
Kas meie varundusklaster peaks olema tÀiesti identne meie tootmisclusteriga? Ei. Kui varem monoliitsetes projektides, rauainfrastruktuuris hoidsime praktiliselt tÀielikult identset keskkonda, siis kubernekesis ma arvan, et seda ei tohiks olla. Vaatame, miks.
NĂ€iteks alustame Kubernetes'i pĂ”hielementidest â deployments - need peavad olema identsed. Peavad olema kĂ€ivitatud rakendused, mis suudavad igal ajal liiklust töödelda ja vĂ”imaldavad meie projektil edasi elada. Kui rÀÀgime konfigureerimisfailidest, siis tuleb vaadata, kas need peavad olema identsed vĂ”i mitte. St kui me, targad inimesed, ei tarbi mingit keelatud ainet ja ei hoia andmebaasi K8s, siis peaks meie configmaps'ides olema juurdepÀÀsude seadistused peamise andmebaasi jaoks (mille reserveerimisprotsess on korraldatud eraldi). Vastavalt sellele, et tagada juurdepÀÀs varukoopia andmebaasile, peame omama eraldi konfigureerimisfaili (configmap). Just nii töötame ka secret'itega: paroolidega andmebaasi juurdepÀÀsuks, API-vĂ”tmetega; igal ajal vĂ”ib meil olla töötav kas peamine secret vĂ”i varu. KokkuvĂ”ttes on meil juba kaks Kubernetes'e elementi, mille varukoopiad ei tohiks olla identsed peamistega. JĂ€rgmine element, millele tasub peatuda, on cronjob. Varukoopia cronjob'id ei tohi mingil juhul olla identsed tootmisklastri cronjob'idega! Kui me tĂ”stame varuklastri ĂŒles ja kĂ€ivitame selle tĂ€ielikult koos kĂ”igi aktiveeritud cronjob'idega â siis nĂ€iteks saavad inimesed teilt korraga kaks kirja ĂŒhe asemel. VĂ”i mĂ”ne andmete sĂŒnkroniseerimine vĂ€listest allikatest toimub kaks korda, vastavalt sellele hakkame me haiget saama, nutma, karjuma ja sĂ”imama.

Kuidas meedia teab, kuidas korraldada varuklastrit? Teine populaarne vastus peale âmiks?â â Kubernetes Federationi kasutamine.
Mis see on? See on, ĂŒtleme nii, suur meta-klaster. Kui me kujutame ette kube arhitektuuri â kus meil on meester, mitu sĂ”lme â siis föderatsiooni vaatenurgast on meil samuti meister ja mitu sĂ”lme, ainult et iga sĂ”lm on eraldi klaster. See tĂ€hendab, et me töötame nende samade entsĂŒklopediate ja primitiividega, nagu tavalise kube puhul, ainult et toimetame mitte meie fĂŒĂŒsiliste masinatega, vaid tervete klastritega. Föderatsiooni raames toimub tĂ€ielik föderatiivsete ressursside sĂŒnkroonimine vanematest jĂ€reltulijatele. NĂ€iteks kui me kĂ€ivitame mingi deployment'i lĂ€bi föderatsiooni â see paigaldatakse igasse meie tĂŒtarklastrisse. Kui me vĂ”tame mĂ”ne konfiguratsioonikaardi, salajase, ja rakendame seda föderatsioonis â see levib kĂ”igisse meie tĂŒtarklastritesse; samal ajal vĂ”imaldab föderatsioon meil kohandada meie ressursse lastes. See tĂ€hendab, et me vĂ”tsime mĂ”ne konfiguratsioonikaardi, paigaldasime selle lĂ€bi föderatsiooni ja siis, kui meil on vaja midagi konkreetset, me muudame seda eraldi klastris ning see muudatus ei sĂŒnkroonita enam kuhugi.
Kubernetes Federation on hiljuti loodud tööriist ja see toetab kaugel mitte kogu ressursikomplekti, mille K8s ise pakub: dokumendi ĂŒhe varasema versiooni avaldamise ajal rÀÀgiti, et toetas ainult konfiguraatsioonikaarte, rakendusi replikasete all, ingressi. Salajased andmed ei olnud toetatud, töö mahtudega samuti ei olnud toetatud. Liialt piiratud komplekt. Eriti kui me armastame lĂ”butseda - nĂ€iteks edastada oma ressursse Kubernetesile lĂ€bi custom resource definition - ei saa me neid liidame federatsiooni. See on nagu... vĂ€ga tĂ”si lahendus, kuid sunnib meid perioodiliselt endale jalga tulistama. Teisest kĂŒljest vĂ”imaldab federatsioon paindlikult hallata meie replicaset'i. NĂ€iteks kui me tahame, et meie rakendusest töötaks 10 koopiat, jagab federatsioon selle arvu automaatselt klastrite vahel. Ja kĂ”ike seda saab ka konfigureerida! VĂ”ite nĂ€idata, et tootmisklastris peavad olema 6 koopiat meie rakendusest, ning reserveeritud klastris, ressursside kokkuhoiu nimel, vĂ”i oma lĂ”bustamiseks - vaid 4 koopiat meie rakendusest. Mis on samuti ĂŒsna mugav. Kuid federatsiooniga peame kasutama uusi lahendusi, midagi tuleb jooksvalt juurde seadistada, sundima end natuke rohkem mĂ”tlema...
Kas saaksime lĂ€heneda Kubernetes'i varundamisprotsessile kuidagi lihtsamalt? Millised tööriistad meil ĂŒldse on?
Esiteks on meil alati mingisugune CI/CD sĂŒsteem, mis tĂ€hendab, et me ei kĂ€i kĂ€sitsi, ega kirjuta serverites create/apply. SĂŒsteem genereerib YAML-failid meie konteinerite jaoks.
Teiseks on mitu klastrit, meil on kas ĂŒks vĂ”i mitu (kui me oleme targad) registrit, mille oleme samuti reserveerinud. Ja meil on suurepĂ€rane utiliit kubectl, mis oskab töötada mitme klastri jaoks samaaegselt.

Nii et: minu arvates on kĂ”ige lihtsam ja Ă”igem lahendus varukoopia klastrite ĂŒlesehitamiseks primitiivne paralleelne deploy. Seal on mingi CI/CD sĂŒsteemis töötav pipeline; esmalt anname ehituse meie konteineritele, testime ja seadistame rakendusi kubectl kaudu mitmesse sĂ”ltumatutesse klastrisse. Saame teha samal ajal vĂ€ljalaskeid mitmesse klastrisse. Seega lahendame konfiguratsioonide edastamise ka sel hetkel. Saame eelnevalt mÀÀrata konfiguratsioonide kogumi meie tootmisklastri jaoks, varuklastri konfiguratsioonide kogumi ning CI/CD sĂŒsteemi tasemel levitada tootmisvĂ€lja tootmisklastrisse, varuvĂ€lja varuklastrisse. VĂ”rreldes föderatsiooniga pole pĂ€rast föderatiivse ressursi kindlaksmÀÀramist vaja iga mahakantud klastrisse minna ja midagi ĂŒletada. Oleme selle eelnevalt teinud. Kui toredad me oleme.
Kuid... on... ma olin kirjutanud, et on âkĂ”ikide probleemide juurâ, kuid neid on tegelikult kaks. Esiteks, failisĂŒsteem. On mingi PV, vĂ”i kasutame me vĂ€list salvestust. Kui me salvestame faile klastrisse, peame kĂ€ituma vanade praktikate kohaselt, mis on jÀÀnud terasest infrastruktuuride ajast: nĂ€iteks sĂŒnkroniseerima lsync'iga. VĂ”i mĂ”ne muu teie poolt isiklikult eelistatud ning abiainena. Seame kĂ”ik uutele masinatele ja elame edasi.
Teiseks, ja tegelikult isegi olulisem takistuspunkt â andmebaas. Kui me oleme targad inimesed ja ei hoia andmebaasi kuberenetes, siis andmete varundamise protsess on sama vana skeemi jĂ€rgi â master-slave replikatsioon, siis lĂŒlitus ja replikatsioon, hoidke andmebaas kĂ€imas ja elame hĂ€sti. Kuid kui me hoiame oma andmebaasi klastris, siis on olemas palju valmis lahendusi master-slave replikatsiooni korraldamiseks, palju lahendusi andmebaasi kĂ€ivitamiseks kuberenetes.
Andmebaaside varundamisest on juba miljard ettekannet peetud, kirjutatud miljard artiklit, midagi uut siin tegelikult ei ole. Ăldiselt jĂ€rgige oma unistusi, elage nagu soovite, leiutage endale ka mĂ”ned keerulised abivahendid, kuid mĂ”elge kindlasti, kuidas te kĂ”ike seda varundate.
Ja nĂŒĂŒd rÀÀgime sellest, kuidas pĂ”himĂ”tteliselt toimub meie protsess varusĂŒsteemile ĂŒleminek tulekahju korral. Esiteks paigaldame paralleelselt stateless-rakendusi. Need ei mĂ”juta meie rakenduste, meie projekti Ă€riloogikat. Saame pidevalt hoida kahte kĂ€ivitatud rakenduste komplekti, mis vĂ”ivad hakata liiklust vastu vĂ”tma. Ălemineku protsessi kĂ€igus on vĂ€ga oluline jĂ€lgida, kas konfiguratsioone on vaja ĂŒmber seadistada. NĂ€iteks, meil on tootmiscluster Kuberneteses, meil on varucluster Kuberneteses, meil on vĂ€line andmebaas master ja meil on varu andmebaas master. Meil on neli vĂ”imalust, kuidas need rakendused tootmises saavad omavahel suhelda. Andmebaas vĂ”ib minna vahetusse ja selgub, et tootmisclusteris tuleb liiklus suunata uuele andmebaasile, vĂ”i meie cluster vĂ”ib minna katki â ja me oleme ĂŒle lĂ€inud varu peal, aga jĂ€tkame töötamist tootmisandmebaasiga, ning kolmas variant on see, kui see on katki ja too on katki, ja me suuname mĂ”lemad rakendused ĂŒmber, seadistame meie konfiguratsiooni nii, et uued rakendused töötavad juba uue andmebaasiga.
Ja mis jÀreldused me kÔik sellest teha saame?

Esimene jĂ€reldus: varuga on hea elada. Aga see on kallis. Ideaalis ei tohiks elada ainult ĂŒhe varuga. Ideaalis peaks olema mitu varu. Esiteks peab varu olema vĂ€hemalt mitte ĂŒhes andmekeskuses ja teiseks, vĂ€hemalt teise teenusepakkuja juures. Sageli on olnud nii â ja minu praktikas on see tĂ”esti juhtunud. Kahjuks ei saa ma projekte nimetada, kui just ajal, kui toimus tulekahju andmekeskuses⊠Ma ĂŒtlesin: lĂŒlitame varule ĂŒle! Ja varu serverid olid sama rack'i sees...
VĂ”i kujutage ette, et Amazon on Venemaal blokeeritud (ja see on juhtunud). Ja kĂ”ik: mis kasu on sellest, et teises amazonis on meie varu? See ei ole ka ju kĂ€tte saadav. Seega kordasin: hoidke varu vĂ€hemalt teises andmekeskuses ja soovitavalt â teise teenusepakkuja juures.
Teine vĂ€ljund: kui teil on Kubernetesis rakendus, mis suhtleb vĂ€liste allikatega (see vĂ”ib olla nii andmebaas kui ka mĂ”ni vĂ€line API), mÀÀrake see kindlasti teenusena, millel on vĂ€line lĂ”pp-punkt, et lĂŒlitamisel ei peaks iga kord 15 rakendust, mis pöörduvad sama andmebaasi poole, uuesti ĂŒles seadma. MÀÀrake andmebaas eraldi teenusena, pöörduge selle poole justkui see oleks teie klastris: kui teie andmebaas mingil pĂ”hjusel hĂ€vib, muudate ip-d ĂŒhes kohas ja elate edasi Ă”nnelikult.
Ja lĂ”petuseks: ma armastan "kuubikut", nagu ka eksperimente selle alusel. Mulle meeldib jagada nende katsete tulemusi ja ĂŒldiselt oma isiklikku kogemust. SeetĂ”ttu olen salvestanud K8si kohta veebiseminaride seeria, olete oodatud lisainfot saama.
Allikas: habr.com
