Tootevalmis pildid k8s-ile

See lugu rÀÀgib sellest, kuidas kasutame konteinerite rakendusi tootmisĂŒmbritsuse, eriti Kubernetes'i all. Artikkel on pĂŒhendatud mÔÔdikute ja logide kogumisele konteineritest ning piltide koostamisele.

Tootevalmis pildid k8s-ile

Me oleme finansitehnoloogia ettevĂ”te Exness, mis loob teenuseid veebikaubanduse ja finantsteaduste saavutamiseks B2B ja B2C valdkondades. Meie teadus- ja arendustegevuses on palju erinevaid meeskondi, arendusosakonnas ĂŒle 100 töötaja.

Esindame meeskonda, kes vastutab meie arendajate koodi kogumise ja kĂ€itamise platvormi eest. TĂ€psemalt vastutame mÔÔdikute, logide ja rakendustest pĂ€rinevate sĂŒndmuste kogumise, salvestamise ja esitamise eest. Praegu opereerime umbes kolme tuhande Docker-konteineriga tootmisĂŒmbritsuses, toetame 50 TB suurust big data ladustamist ning pakume arhitektuurilisi lahendusi, mis pĂ”hinevad meie infrastruktuuril: Kubernetes, Rancher ja erinevad avalikud pilveteenuse pakkujad. 

Meie motivatsioon

Mis pĂ”leb? Keegi ei oska vastata. Kus on tulekold? Seda on raske aru saada. Millal see sĂŒttis? Selle vĂ€ljaselgitamine on vĂ”imalik, kuid mitte kohe. 

Tootevalmis pildid k8s-ile

Miks mĂ”ned konteinerid tĂ”usevad, samas kui teised langevad? Milline konteiner on selle pĂ”hjuseks? Kuigi konteinerite vĂ€limus on sama, on igaĂŒhes sees oma Neo.

Tootevalmis pildid k8s-ile

Meie arendajad on targa mĂ”tlemisega. Nad loovad hĂ€id teenuseid, mis toovad ettevĂ”ttele kasumit. Kuid juhtuvad ka ebaĂ”nnestumised, kui rakenduste konteinerid lĂ€hevad sassi. Üks konteiner tarbib liiga palju CPU-d, teine - vĂ”rku, kolmas - sisendi ja vĂ€ljundi operatsioone, neljas ei selgu ĂŒldse, mis ta pistikute kĂŒlge teeb. KĂ”ik see kukub kokku ja alus pĂ”hjavette. 

Agenid

Kuna tahame aru saada, mis toimub sees, otsustasime paigutada agendid otse konteineritesse.

Tootevalmis pildid k8s-ile

Need agendid on piiravad programmid, mis hoiavad konteinerid olukorras, kus nad ĂŒksteist ei rikuks. Agendid on standardiseeritud, mis vĂ”imaldab standardiseerida lĂ€henemisviisi konteinerite hooldamisele. 

Meie puhul peavad agendid esitama logisid standardses vormingus, mÀrgistatuna ja trottlinguga. Samuti peavad nad esitama meile standardiseeritud mÔÔdikud, mis on Àrirakenduste jaoks laiendatavad.

Agente tĂ€hendab ka utiliite, mis on mĂ”eldud ekspluateerimiseks ja hooldamiseks ning suudavad töötada erinevates orkestreerimissĂŒsteemides, toetades erinevaid images (Debian, Alpine, Centos jne).

LÔpuks peavad agendid toetama lihtsat CI/CD-d, mis hÔlmab Docker-failide kasutamist. Vastasel juhul laev laguneb, kuna konteinerid hakatakse tarnima "kÔveratel" rööbastel.

Kogumisprotsess ja siht-image struktuur

Kuna kĂ”ik peab olema standardiseeritud ja hallatav, on vajalik jĂ€rgida mĂ”nda standardset kogumisprotsessi. SeetĂ”ttu otsustasime koguda konteinerid konteinerite abil — selline rekursioon.

Tootevalmis pildid k8s-ile

Siin on konteinerid esitatud ĂŒhtsete kontuuride kujul. Samuti otsustasime lisada neisse distributsioonid, et "elu ei tunduks liiga magus". Miks see tehti, selgitame allpool.
 
Tulemusena saime tööriista kogumiseks — kindla versiooniga konteineri, mis viitab kindlatele distrubutsiooniversioonidele ja kindlatele skriptiversioonidele.

Kuidas me seda rakendame? Meil on Docker Hub, kus on konteiner. Me peegeldame selle oma sĂŒsteemi, et vĂ€ltida vĂ€liseid sĂ”ltuvusi. Tulemusena saame kollaseks mĂ€rgistatud konteineri. Loome ĆĄablooni, et paigaldada konteinerisse kĂ”ik vajalikud distributsioonid ja skriptid. PĂ€rast seda kogume valmis kasutamiseks mĂ”eldud pildi: arendajad panevad sinna oma koodi ja erilised sĂ”ltuvused. 

Miks on see lÀhenemine hea? 

  • Esiteks, tĂ€ielik versioonikontroll ehitusvahendite ĂŒle – ehituskonteiner, skriptide ja distributsioonide versioonid. 
  • Teiseks, oleme saavutanud standardiseerimise: loome ĆĄabloone, vahepealseid ja valmis kasutamiseks mĂ”eldud pilte ĂŒhtselt. 
  • Kolmandaks, konteinerid tagavad meile kaasaskantavuse. TĂ€na kasutame Gitlab'i, aga homme vĂ”ime ĂŒle minna TeamCity'le vĂ”i Jenkins'ile ning saame oma konteinerid sealgi kĂ€ivitada. 
  • Neljandaks, sĂ”ltuvuste minimeerimine. Me ei pannud konteinerisse distributsioone juhuslikult, kuna see vĂ”imaldab meil neid iga kord internetist alla laadida. 
  • Viies, ehitamise kiirus on suurenenud – kohalike piltide olemasolu vĂ”imaldab mitte kulutada aega allalaadimisele, kuna kohaliku pildi olemasolu. 

TeisisÔnu, oleme saavutanud kontrollitava ja paindliku ehitusprotsessi. Kasutame kÔigi konteinerite ehitamiseks samu vahendeid koos tÀieliku versioonihaldusega. 

Kuidas meie ehitusprotseduur töötab

Tootevalmis pildid k8s-ile

Ehitamine kĂ€ivitub ĂŒhe kĂ€sklusega, protsess viiakse lĂ€bi pildis (mĂ€rgitud punasega). Arendajal on Docker-fail (mĂ€rgitud kollasega), me renderdame selle, asendades muutuja vÀÀrtustega. Samal ajal lisame pĂ€ise ja jaluse – need on meie agentid. 

PÀis lisab jaotised vastavatest piltidest. Jalus seadistab meie teenused, konfigureerib töökoormuse, logimise ja teiste agentide kÀivitamise, asendab sisenemispunkti jne. 

Tootevalmis pildid k8s-ile

Me mĂ”tlesime kaua, kas vĂ”tta superviisor vĂ”i mitte. LĂ”puks otsustasime, et see on vajalik. Valisime S6. Superviisor haldab konteinerit: see vĂ”imaldab pÀÀseda sellele juurde, kui pĂ”hiprotsess kukub ning tagab kĂ€sitsi haldamise konteinerit uuesti loomata. Logid ja metrika on protsessid, mis töötavad konteineri sees. Neid tuleb samuti kontrollida, ja me teeme seda superviisori abil. LĂ”puks vĂ”tab S6 enda alla koristustööd, signaalide töötlemise ja muud ĂŒlesanded.

Kuna kasutame erinevaid orkestreerimissĂŒsteeme, peab konteiner pĂ€rast ehitamist ja kĂ€ivitamist mĂ”istma, milles keskkonnas ta asub ja tegutsema vastavalt sellele. NĂ€iteks:
See vĂ”imaldab meil luua ĂŒhe pildi ja kĂ€ivitada selle erinevates orkestreerimissĂŒsteemides, kusjuures kĂ€ivitamine toimub selle sĂŒsteemi spetsiifikat arvesse vĂ”ttes.

 Tootevalmis pildid k8s-ile

Ühe ja sama konteineri jaoks saame Dockeris ja Kuberneteses erinevad protsessipuu.

Tootevalmis pildid k8s-ile

Kasulik koormus töötab superviisor S6 all. Pange tĂ€hele collectorit ja events'i — need on meie agendid, mis vastutavad logide ja metrika eest. Kuberneteses neid pole, kuid Dockeris on. Miks? 

Kubernetesi podi spetsifikatsiooni vaatamisel mĂ€rkame, et konteiner events kĂ€ivitatakse podis, kus on eraldi konteiner collector, mis tĂ€idab meetrikate ja logide kogumise funktsiooni. Saame kasutada Kubernetes'e vĂ”imalusi: konteinerite kĂ€ivitamine ĂŒhes podis, ĂŒhes protsessi- ja/vĂ”i vĂ”rgu ruumis. Tegelikult saame oma agente juurutada ja teatud funktsioone tĂ€ita. Ja kui sama konteiner kĂ€ivitatakse Dockeri keskkonnas, saab ta kĂ”ik need samad vĂ”imed, st suudab logisid ja meetrikate edastada, kuna agendid on kĂ€ivitatud siseselt. 

Metrikad ja logid

Metrikate ja logide edastamine on keeruline ĂŒlesanne. Selle lahendamisega on seotud mitmeid aspekte.
Infrastruktuur luuakse kasuliku koormuse tĂ€itmiseks, mitte logide massiliseks edastamiseks. Seega peaks see protsess toimuma minimaalsete nĂ”udmistega konteinerite ressursside osas. PĂŒĂŒame aidata meie arendajatel: 'VĂ”tke Docker Hub'i konteiner, kĂ€ivitage see, ja me suudame logid edastada.' 

Teine aspekt on logide mahtude piiramine. Kui mitmes konteineris tekib logide mahu tĂ”us (rakendus tsĂŒklis vĂ€ljastab stack-trace), suureneb koormus CPU-le, sideteedele ja logide töötlemise sĂŒsteemile, mis mĂ”jutab kĂ”igi hostitud konteinerite töökindlust, ning see vĂ”ib pĂ”hjustada hosti "kukkumise". 

Kolmas aspekt on vajadus pakkuda vĂ”imalikult palju meetodeid mÔÔdikute kogumiseks juba vaikimisi. See hĂ”lmab failide lugemist ja Prometheuse lĂ”pp-punktide kĂŒsitlemist kuni rakendustele spetsiifiliste protokollide kasutamiseni.

Ja viimane aspekt on kohustust vÀhendada ressursikulu.

Oleme valinud avatud lĂ€htekoodiga lahenduse Go-s nimega Telegraf. See on universaalne konnektor, mis toetab ĂŒle 140 erinevat sisendkanalit (input plugins) ja 30 erinevat vĂ€ljundit (output plugins). Oleme teinud sellele tĂ€iendusi ja nĂŒĂŒd rÀÀgime, kuidas seda Kuberneteses kasutada. 

Tootevalmis pildid k8s-ile

Kujutage ette, et arendaja juurutab koormust ja Kubernetes saab pĂ€ringu podi loomise jaoks. Sel hetkel luuakse automaatselt iga podi jaoks konteiner nimega Collector (kasutame mutation webhook'i). Collector on meie agent. KĂ€ivitamisel seadistab see konteiner end töötama koos Prometheuse ja logide kogumise sĂŒsteemiga.

  • Selle jaoks kasutab ta podi annotatsioone ning olenevalt nende sisust loob nĂ€iteks Prometheuse lĂ”pppunkti (end-point); 
  • Podi spetsifikatsiooni ja konteinerit eristavate seadete pĂ”hjal otsustab ta, kuidas logisid edastada.

Logisid kogume Docker API kaudu: arendajad peavad need lihtsalt stdout vĂ”i stderr panema, ja edasi tegeleb Collector. Logid kogutakse chunk'idena teatud viivitusega, et vĂ€ltida vĂ”imalikke hosti ĂŒlekoormusi. 

Metoodikat kogutakse töökoormuse (protsesside) eksemplaride jĂ€rgi konteinerites. KĂ”ik mĂ€rgistatakse siltidega: namespace, pod jms, ja seejĂ€rel konverteeritakse Prometheuse vormingusse – ja muutub kergesti kogutavaks (logide puhul vĂ€lja arvatud). Samuti saadame logid, mÔÔdikud ja sĂŒndmused Kafka kaudu edasi:

  • Logid on saadaval Graylogis (visuaalse analĂŒĂŒsi jaoks);
  • Logid, mÔÔdikud ja sĂŒndmused saadetakse Clickhouse'i pikaajaliseks sĂ€ilitamiseks.

Sama töötab ka AWS-is, lihtsalt me asendame Graylogi Kafka ja Cloudwatchiga. Saadetakse logid sinna ja kÔik muutub vÀga mugavaks: kohe on arusaadav, kelle klastriga ja konteineriga need seotud on. Sama kehtib ka Google Stackdriveri kohta. Seega meie skeem töötab nii on-premise'i Kafka kui ka pilves. 

Kui meil pole Kubernetes't koos podidega, siis skeem muutub veidi keerulisemaks, kuid töötab samade pÔhimÔtete jÀrgi.

Tootevalmis pildid k8s-ile

Konteineri sees kĂ€ivitatakse samad protsessid, neid orkestreeritakse S6 abil. KĂ”ik samad protsessid on kĂ€ivitatud ĂŒhes konteineris.

In conclusion,

Oleme loonud tervikliku lahenduse piltide koostamiseks ja tootmisse kÀivitamiseks, koos logide ja mÔÔdikute kogumise ja edastamise valikutega:

  • Oleme vĂ€lja töötanud standardiseeritud lĂ€henemise piltide koostamiseks, mille alusel oleme loonud CI-malle;
  • Andmete kogumise agentideks on meie Telegrafi laiendused. Oleme neid hĂ€sti testinud tootmises;
  • Kasutame mutation webhook'i, et sisestada agente podidesse; 
  • Oleme integreerunud Kubernetes/Rancheri ökosĂŒsteemi;
  • Saame kĂ€ivitada samu konteinerite erinevates orkestreerimissĂŒsteemides ja saavutada oodatud tulemuse;
  • Loodi tĂ€ielikult dĂŒnaamiline konteinerite haldamise konfiguratsioon. 

Kaastööline: Ilja Prudnikov

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster