Tere kĂ”igile! Minu nimi on Pavel Agaletckiy. Olen tiimi juht, mis arendab Lamoda tarnesĂŒsteemi. Aastal 2018 esinesin konverentsil HighLoad++, ja tĂ€na soovin tutvustada oma ettekande transkripti.
Minu teema on pĂŒhendatud meie ettevĂ”tte kogemusele sĂŒsteemide ja teenuste juurutamisel erinevates keskkondades. Alustame meie eelajaloolistest aegadest, kui juurutati kĂ”ik sĂŒsteemid tavapĂ€rastel virtuaalserveritel, ning liigume jĂ€rk-jĂ€rgult ĂŒle Nomadilt Kubernetesesse juurutamisele. RÀÀgin, miks me seda tegime ja millised probleemid meil protsessi kĂ€igus olid.

Rakenduste juurutamine VM-idele
Alustame sellest, et 3 aastat tagasi juurutati kĂ”ik ettevĂ”tte sĂŒsteemid ja teenused tavapĂ€rastel virtuaalserveritel. Tehniliselt oli see korraldatud nii, et kogu meie sĂŒsteemide kood olid kogutud automatiseeritud koostamise vahendite abil Jenkins'i kaudu. Ansible'i abil laaditi see meie versioonihaldussĂŒsteemist juba virtuaalserveritesse. Igal sĂŒsteemil, mis meie ettevĂ”ttes oli, juurutati vĂ€hemalt kahte serverisse: ĂŒks neist oli head, teine tail. Need kaks sĂŒsteemi olid omavahel tĂ€iesti identsed kĂ”iki seadistuste, jĂ”udluse, konfiguratsiooni ja muude omaduste osas. Erinevus nende vahel oli vaid see, et head sai kasutaja liiklust, samas kui tail ei saanud kunagi kasutaja liiklust.
Miks see nii tehti?
Kui me juurutame uusi versioone meie rakendusest, soovisime tagada sujuva juurutamise vÔimaluse, see tÀhendab, et ilma kasutajatele mÀrgatavate tagajÀrgedeta. See saavutati sellega, et jÀrgmine koostatud versioon jagati Ansible'i kaudu tail'ile. Seal said juurutamisega tegelejad kontrollida ja veenduda, et kÔik on korras: kÔik mÔÔdikud, osad ja rakendused töötavad; vajalikud skriptid kÀivitatakse. Alles pÀrast seda, kui nad veendusid, et kÔik on hÀsti, suunati liiklus. See hakkas minema serverile, mis oli varem olnud tail. Ja see, mis oli varem olnud head, jÀi ilma kasutajaliikluseta, samas kui sellel oli eelmine versioon meie rakendusest.
Seega oli see kasutajatele lÀbipaistev. Kuna vahetus toimub hetkega, kuna see on lihtsalt koormuse tasakaalustaja vahetamine. Eelmine versioon on vÀga lihtne tagasi vÔtta, lihtsalt vahetades koormuse tasakaalustajat tagasi. Samuti saime veenduda rakenduse vÔimes tootmises veel enne, kui kasutajate liiklus sellele suundub, mis oli vÀga mugav.
Milliseid eeliseid me kÔik selle juures nÀgime?
- Esiteks, see on piisavalt lihtsalt toimiv. KÔigile on selge, kuidas selline juurutusmehhanism töötab, sest enamik inimesi on kunagi juurutanud tavaliselt virtuaalsetele serveritele.
- See on piisavalt usaldusvÀÀrne, kuna juurutustehnoloogia on lihtne ja testitud tuhandeid ettevÔtteid. Miljonid serverid juurutatakse just nii. Midagi on keeruline katki teha.
- Ja lÔpuks saime aatomse juurutuse. Juurutused toimuvad kasutajatele momentaalselt, ilma mÀrgatava etapita vana ja uue versiooni vahel.
Kuid kogu selle juures nÀgime ka mÔningaid puuduseid:
- Lisaks tootmisĂŒsteemile, arendussĂŒsteemile, on olemas ka teised keskkonnad. NĂ€iteks qa ja eeltoodang. Sellel hetkel oli meil palju servereid ja umbes 60 teenust. Sel pĂ”hjusel oli vajalik iga teenuse jaoks hoida selle jaoks asjakohast versiooni virtuaalsest masinast. Ja kui soovite uuendada teeke vĂ”i installida uusi sĂ”ltuvusi, peate seda tegema kĂ”ikides keskkondades. Samuti pidi sĂŒnkroniseerima aja, mil kavatsete juurutada jĂ€rgmise uue versiooni oma rakendusest, ajaga, mil devops teostab keskkonna vajalikud konfiguratsioonid. Sellisel juhul on lihtne sattuda olukorda, kus keskkondade vahel on koos erinevusi jĂ€rjestikku. NĂ€iteks qa keskkonnas on teised teekide versioonid ja tootmises teised, mis toob kaasa probleeme.
- SĂ”ltuvuste uuendamise keerukus teie rakenduses. See ei sĂ”ltu teist, vaid teisest meeskonnast. Nimelt, devops meeskonnast, kes toetab servereid. Peate neile esitama vastava ĂŒlesande ja kirjeldama, mida soovite teha.
- Sellest ajast alates soovisime jagada suured monoliidid vĂ€iksemateks teenusteks, kuna mĂ”istsime, et neid hakkab jĂ€rjest rohkem olema. Tol hetkel oli neid juba ĂŒle 100. Iga uue teenuse jaoks oli vajalik luua eraldi uus virtuaalmasin, mida tuli samuti hallata ja juurutada. Lisaks sellele ei piisanud ĂŒhest masinast, vaid vĂ€hemalt kahest. KĂ”igile nendele lisandus QA-keskkond. See tekitab probleeme ja muudab teie uute sĂŒsteemide loomise ja kĂ€ivitamise keerukaks, kulukaks ja ajamahukaks protsessiks.
SeetĂ”ttu otsustasime, et oleks mugavam liikuda tavalisest virtuaalmasinate juurutamisest oma rakenduste juurutamisele Dockeris. Dockeri olemasolul on vajalik sĂŒsteem, mis suudab rakenduse klastris kĂ€ivitada, kuna te ei saa lihtsalt konteinerit ĂŒles tĂ”sta. Tavaliselt soovitakse jĂ€lgida, kui palju konteinerite on ĂŒles tĂ”stetud, et need automaatselt kĂ€ivituksid. SeetĂ”ttu pidi meil valima juhtimissĂŒsteemi.
Me mĂ”tlesime pikalt, millist neist vĂ”iks kasutada. Probleemiks oli see, et tol hetkel oli meie tavapĂ€raste virtuaalserverite juurutamistehnoloogia pisut aegunud, kuna seal olid vanad operatsioonisĂŒsteemide versioonid. Ăhel hetkel oli seal isegi FreeBSD, mida ei olnud just mugav hallata. Me mĂ”istsime, et peame Dockerisse vĂ”imalikult kiiresti migreerima. Meie devopsid vaatasid oma olemasolevat kogemust erinevate lahendustega ja valisid sĂŒsteemi nimega Nomad.
Ăleminek Nomadile
Nomad on ettevĂ”tte âHashiCorpâ toode. Nad on tuntud ka teiste oma lahenduste poolest:

«Consul» â teenuste avastamiseks mĂ”eldud tööriist.
«Terraform» â serverihalduse sĂŒsteem, mis vĂ”imaldab teil neid konfigureerida infrastruktuuri koodina.
«Vagrant» â vĂ”imaldab teil hankida virtuaalmasinaid kohapeal vĂ”i pilves, kasutades teatud konfigureerimisfaile.
Tol hetkel tundus Nomad piisavalt lihtne lahendus, kuhu saaks kiiresti ĂŒle minna, ilma kogu infrastruktuuri muutmata. Lisaks sellele on seda lihtne Ă”ppida. SeetĂ”ttu valisimegi selle meie konteineri filtreerimise sĂŒsteemiks.
Mida on ĂŒldse vaja, et teie sĂŒsteemi Nomadis juurutada?
- Esiteks on vajalik docker image teie rakendust. Tuleb see koguda ning paigutada docker'i piltide hoidlasse. Meie puhul on selleks artifactory â selline sĂŒsteem, mis vĂ”imaldab erinevaid artefakte erinevat tĂŒĂŒpi sinna saata. See suudab hoida arhiive, docker'i pilte, PHP composer pakette, NPM pakette jms.
- Samuti on vajalik konfiguratsioonifail, mis ĂŒtleb Nomadile, mida, kuhu ja kui palju soovite juurutada.
Kui rÀÀgime Nomadist, kasutab see informatiivse faili formaadina HCL keelt, mis tĂ€histab HashiCorp Configuration Language. See on Yaml'i ĂŒlehulk, mis vĂ”imaldab teil oma teenust Nomadi terminoloogias kirjeldada.

See vÔimaldab teil öelda, kui palju konteinerite soovite juurutada, millistest piltidest nendele erinevaid parameetreid juurutamisel anda. Nii toidate selle faili Nomadile ja see kÀivitab vastavalt sellele konteinerid tootmises.
Meie puhul mĂ”istsime, et lihtsalt iga teenuse jaoks tĂ€iesti identsete HCL-failide kirjutamine poleks vĂ€ga mugav, kuna teenuseid on palju ja neid tahaks vahel uuendada. On juhtumeid, kui ĂŒks teenus ei ole juurutatud ĂŒhes eksemplaris, vaid mitmetes erinevates. NĂ€iteks on ĂŒks meie tootmises olevatest sĂŒsteemidest rohkem kui 100 instantsi tootmises. Need kĂ€ivitatakse samadest piltidest, kuid erinevad konfiguratsiooni seadetest ja konfiguratsioonifailidest.
SeetĂ”ttu otsustasime, et meil oleks mugav hoida kĂ”iki meie juurutamise konfiguratsioonifaile ĂŒhes ĂŒhises hoidlas. Nii muutuvad need lĂ€bipaistvaks: neid on lihtne hallata ja nĂ€ha, millised sĂŒsteemid meil on. Vajadusel ei ole ka raske midagi uuendada vĂ”i muuta. Uue sĂŒsteemi lisamine ei valmista samuti raskusi â piisab lihtsalt, kui luua konfiguratsioonifail uue kausta sisse. Selles kaustas on failid: service.hcl, mis sisaldab meie teenuse kirjeldust, ja mĂ”ned env-failid, mis vĂ”imaldavad seda teenust, olles tootmises juurutatud, seadistada.

Kuid mĂ”ned meie sĂŒsteemidest on tootmises juurutatud mitte ĂŒhes, vaid mitmes eksemplaris korraga. Seega otsustasime, et meile oleks mugav hoida mitte puhtaid konfiguratsioonifaile, vaid nende mallitud kujul. Ja mallimise keeleks valisime jinja 2. Sellise vormingu abil salvestame nii teenuse konfiguratsioonid kui ka selleks vajalikud env-failid.
Lisaks oleme paigutanud projektide ĂŒhisesse hoidlasse ĂŒldise skripti, mis vĂ”imaldab teie teenust kĂ€ivitada ja tootmisse paigaldada sobivasse keskkonda ja sihtkohta. Kui oleme oma HCL-konfiguratsiooni muundanud malliks, siis tundub, et see HCL-fail, mis oli seni tavaline Nomad'i konfiguratsioon, on nĂŒĂŒd pisut muutunud.

See tĂ€hendab, et oleme asendanud teatud konfiguratsiooni muutujad variablitega, mis pĂ€rinevad env-failidest vĂ”i muudest allikatest. Lisaks oleme saanud vĂ”imaluse koguda HCL-faile dĂŒnaamiliselt, st saame rakendada mitte ainult tavalisi variablite sisestusi. Kuna jinja toetab tsĂŒkleid ja tingimusi, saame seal ka luua konfiguratsioonifaile, mis muutuvad sĂ”ltuvalt sellest, kuhu oma rakendusi paigaldate.
NĂ€iteks soovite paigaldada oma teenuse eeltootmisse ja tootmisse. Oletame, et te ei soovi eeltootmises kĂ€ivitada cron-skripte, vaid tahate lihtsalt nĂ€ha teenust eraldi domeenil, et veenduda, et see töötab. IgaĂŒhele, kes teenust paigaldab, tundub protsess vĂ€ga lihtne ja lĂ€bipaistev. Piisab, kui kĂ€ivitate fail deploy.sh, mĂ€rkite, millist teenust soovite paigaldada ja kuhu sihtkohta. NĂ€iteks soovite paigaldada mingit sĂŒsteemi Venemaale, Valgevenesse vĂ”i Kasahstani. Selleks piisab lihtsalt ĂŒhe parameetri muutmisest ja teil on Ă”ige konfiguratsioonifail koostatud.
Kui Nomad teenus on teie klastrisse paigaldatud, nÀeb see vÀlja jÀrgmine.

Esiteks vajate vĂ€listingimustes mĂ”nda tasakaalustajat, mis jĂ€tab kogu kasutajatrafiku enda alla. See töötab koos Consuliga ja kĂŒsib temalt, kus, millisel noodil, millise IP-aadressiga hulgast asub konkreetne teenus, mis vastab mingile domeeninimele. Teenused Consulis ilmuvad otse Nomad'ist. Kuna need on sama ettevĂ”tte tooted, on nad omavahel hĂ€sti seotud. VĂ”ib öelda, et Nomad oskab kohe registreerida kĂ”ik selles kĂ€ivitatud teenused Consulis.
PĂ€rast seda, kui teie vĂ€line koormuse jaotaja saab teada, kuhu teenusesse suunata liiklust, edastab ta selle vastavasse konteinerisse vĂ”i mitmesse konteinerisse, mis vastavad teie rakendusele. Loomulikult tuleb sellega kaasas mĂ”elda ka turvalisusele. Isegi kui kĂ”ik teenused kĂ€ivitatakse samadel virtuaalmasinatel konteinerites, tuleb tavaliselt keelata tasuta juurdepÀÀs igast teenusest igale teisele. Oleme seda saavutanud segmentatsiooni abil. Iga teenus kĂ€ivitati oma virtuaalses vĂ”rgus, kus olid mÀÀratud marsruutimise reeglid ja reeglid juurdepÀÀsu lubamiseks/keelamiseks teistele sĂŒsteemidele ja teenustele. Need vĂ”isid asuda kas selle klastris vĂ”i vĂ€ljaspool seda. NĂ€iteks, kui soovite keelata teenusel teatud andmebaasi ĂŒhendamise, saab seda teha segmentatsiooni abil vĂ”rgu tasemel. Seega pole teil isegi eksikombel vĂ”imalik teie testkeskkonnast tootmisandmebaasi ĂŒhenduda.
Kui palju maksis meile inimressursside poolest ĂŒlemineku protsess?
Umbes 5â6 kuud vĂ”ttis kogu ettevĂ”tte ĂŒleminek Nomadile. Me tegime ĂŒlemineku teenuste kaupa, kuid piisavalt kiiresti. Iga meeskond pidi looma oma konteinerid teenuste jaoks.
Meie lĂ€henemine on selline, et iga meeskond vastutab iseseisvalt oma sĂŒsteemide docker piltide eest. DevOps tagab vajalikud ĂŒhisinfrastruktuurid deploymiseks, st klastrite toetamine, CI-sĂŒsteemi toetamine ja nii edasi. Sel ajal oli meil ĂŒle 60 sĂŒsteemi, mis kolisid Nomadisse, kokku töötati vĂ€lja umbes 2000 konteinerit.
DevOps vastutab kogu infrastuktuuri eest, mis on seotud deploymise ja serveritega. Iga arendustiim vastutab omakorda oma konkreetse sĂŒsteemi konteinerite rakendamise eest, kuna just nemad teavad, mida nad selle vĂ”i tolle konteineri puhul vajavad.
PÔhjused, miks loobuda Nomadist
Milliseid eeliseid me saime, liikudes Nomadi ja dockeriga deploymise suunas?
- Meie tagasime ĂŒhtlased tingimused kĂ”ikides keskkondades. Arenduses, QA-keskkonnas, ettevalmistuses ja tootmises kasutatakse samu konteinerite pilte, samade sĂ”ltuvustega. Seega on teil praktiliselt null vĂ”imalust, et tootmisse satub midagi, mida te ei ole varem kohalikult vĂ”i testkeskkonnas testinud.
- Samuti selgus, et on piisavalt lihtne lisada uus teenus. Iga uus sĂŒsteem on juurutamise vaatenurgast vĂ€ga lihtne kĂ€ivitada. Piisab, kui minna konfiguratsioonide hoidlasse, lisada sinna jĂ€rjekordne konfogi teie sĂŒsteemi jaoks ja kĂ”ik on valmis. Saate juurutada oma sĂŒsteemi tootmisse ilma DevOps'i lisapĂŒĂŒdlusteta.
- Kogu konfiguratsioonifailid ĂŒhes ĂŒhises hoidlas olid ĂŒlevaatavad. Hetkel, kui me juurutasime oma sĂŒsteeme virtuaalserverite, kasutasime Ansible'it, kus konfogid asusid samas hoidlas. Siiski oli enamikule arendajatest sellega töötamine mĂ”nevĂ”rra keerulisem. Siin on konfiguratsioonide ja koodi kogus, mida peate teenuse juurutamiseks lisama, oluliselt vĂ€iksem. Pluss seisukohalt on DevOps'il seda vĂ€ga lihtne parandada vĂ”i muuta. NĂ€iteks uue versiooniga, nĂ€iteks Nomadiga, vĂ”ivad nad lihtsalt ja massiliselt uuendada kĂ”iki operatiivfailide, mis asuvad samas kohas.
Kuid me seisime silmitsi ka mitmete puudustega:
Selgus, et me ei suutnud saavutada sujuvust juurutustes Nomadi korral. Kui konteinerid erinevatest tingimustest vĂ€lja vabastatakse, vĂ”is juhtuda, et see kĂ€ivitati ja Nomad nĂ€gi seda kui valmisolekut liikluse vastuvĂ”tmiseks. See juhtus veel enne, kui rakendus selle sees jĂ”udis kĂ€ivituda. SeetĂ”ttu hakkas sĂŒsteem lĂŒhikeseks ajaks andma 500-e vigu, kuna liiklus hakkas minema konteinerisse, mis ei olnud veel valmis selle vastuvĂ”tmiseks.
Me kohtasime mĂ”ningaid bĂŒge. Peamine probleem seisneb selles, et Nomad ei suuda hĂ€sti töödelda suurt klastrit, kui teil on palju sĂŒsteeme ja konteinerit. Kui soovite vĂ”tta hooldusse ĂŒhe serveri, mis on klastris Nomad, on ĂŒsna suur tĂ”enĂ€osus, et klaster ei tunne end hĂ€sti ja puruneb tĂŒkkideks. Osa konteineritest vĂ”ib nĂ€iteks kukkuda ja mitte tĂ”usta â see vĂ”ib teile hiljem vĂ€ga kalliks maksma minna, kui kĂ”ik teie tootmisse kuuluvad sĂŒsteemid asuvad just Nomadi haldusalas.
SeetĂ”ttu otsustasime mĂ”elda, kuhu edasi minna. Sel hetkel olime juba palju paremini teadlikud, mida tahame saavutada. Nimelt: tahame usaldusvÀÀrsust, natuke rohkem funktsioone kui Nomad pakub, ja kĂŒpsemat, stabiilsemat sĂŒsteemi.
Selles osas langetatud valik langes Kubernetes'e kasuks, kuna see on kĂ”ige populaarsem platvorm klastrite kĂ€itamiseks. Eriti arvestades, et meie konteinerite suurus ja arv olid piisavalt suured. Selliste eesmĂ€rkide saavutamiseks tundus Kubernetes olevat kĂ”ige sobivam sĂŒsteem, mida saime vaadata.
Ăleminek Kubernetes'e
RÀÀgin veidi sellest, millised on pÔhikontseptsioonid Kubernetes'es ja kuidas need erinevad Nomad'st.

Esiteks on Kubernetes'e kĂ”ige alusmĂ”isted pod. Pod â see on ĂŒhe vĂ”i mitme konteineri grupp, mis kĂ€ivitub alati koos. Ja nad töötavad justkui alati rangelt ĂŒhel virtuaalsel masinal. Nad on ĂŒksteisele juurdepÀÀsetavad IP-aadressil 127.0.0.1 erinevatel portidel.
Oletame, et teil on PHP-rakendus, mis koosneb nginx'ist ja php-fpm'ist â klassikaline skeem. TĂ”enĂ€oliselt soovite, et nii nginx kui php-fpm konteinerid oleksid alati koos. Kubernetes vĂ”imaldab seda saavutada, kirjeldades neid ĂŒhise pod'ina. Just seda me ei saanud Nomad'i abil.
Teine mĂ”isted on deployment. Asi on selles, et pod iseenesest on efemeerne asi, see kĂ€ivitub ja kaob. Kas soovite kĂ”igepealt tapada kĂ”ik oma eelnevad konteinerid ja seejĂ€rel kĂ€ivitada kohe uued versioonid vĂ”i soovite neid jĂ€rk-jĂ€rgult vĂ€lja anda â just selle protsessi eest vastutab mĂ”isted deployment. See kirjeldab, kuidas te oma podâe deponeerite, kui palju ja kuidas neid uuendada.
Kolmas mĂ”isted on teenus. Teie teenus on tegelikult teie sĂŒsteem, mis vĂ”tab vastu teatud liikluse ja suunab selle ĂŒhe vĂ”i mitme teie teenusele vastava podi juurde. See tĂ€hendab, et saate öelda, et kogu sissetulev liiklus selle kindla nimega teenusele tuleb suunata just nendele podidele. Ja see tagab teile ka koormuse jaotuse. Seega, kui kĂ€ivitate kaks teie rakenduse poodi, ja kogu sisse tulev liiklus jaotatakse ĂŒhtlaselt nende teenusega seotud podide vahel.
Ja neljas pĂ”hikontseptsioon â Ingress. See on teenus, mis kĂ€ivitatakse Kubernetes klastris. See toimib kui vĂ€line koormuse tasakaalustaja, mis vĂ”tab kĂ”ik pĂ€ringud enda peale. Kubernetes Ingress API kaudu saab mÀÀratleda, kuhu need pĂ€ringud saatma peab. Ja ta teeb seda vĂ€ga paindlikult. Saate öelda, et kĂ”ik selle hosti ja kindla URL-i pĂ€ringud saadetakse sellele teenusele. Need pĂ€ringud, mis tulevad sellele hostile ja teisele URL-ile, saadetakse aga teisele teenusele.
KÔige Àgedam asi arendaja seisukohalt on see, et saate seda kÔike ise hallata. Seades Ingressi konfiguratsiooni, saate kogu liikluse, mis tuleb kindla API-le, suunata eraldi konteineritesse, mis on nÀiteks kirjutatud Go-s. Ja see liiklus, mis tuleb sama domeeni, kuid teisele URL-ile, suunatakse konteineritesse, mis on kirjutatud PHP-s, kus on palju loogikat, kuid nad ei ole eriti kiired.
Kui vÔrrelda neid mÔisteid Nomadi kontekstis, siis vÔib öelda, et esimesed kolm mÔistet on kÔik koos teenus. Viimane mÔisted Nomadi puhul aga puudub. Selle asemel kasutasime vÀlist koormuse tasakaalustajat: see vÔib olla haproxy, nginx, nginx+ ja nii edasi. Kube puhul ei pea te seda tÀiendavat mÔistet eraldi tooma. Siiski, kui vaadata Ingressi seest, siis see on kas nginx, haproxy vÔi traefik, kuid nagu ka Kubernetese sisse ehitatud.
KĂ”ik, mida ma olen kirjeldanud, on pĂ”himĂ”tteliselt ressursid, mis eksisteerivad Kubernetese klastris. Nende kirjeldamiseks kube'is kasutatakse yaml-formaati, mis on loetavam ja harjumusekĂŒllasem kui HCL-failid Nomadi puhul. Kuid struktuurselt kirjeldavad need nĂ€iteks pod-i sama asja. Nad ĂŒtlevad â tahan deployida sellised pod'id sinna, koos selliste imagetega, sellises koguses.

Lisaks sellele mĂ”istsime, et me ei soovi iga eraldi ressursi kĂ€sitsi loomisega tegeleda: deployment, teenused, Ingress jne. Selle asemel soovisime, et saaksime iga meie sĂŒsteemi Kubernetes'e terminite jĂ€rgi kirjeldada, et ei peaks kĂ€sitsi kĂ”iki vajalikke ressursi sĂ”ltuvusi Ă”igesse jĂ€rjekorda taastama. Sellise sĂŒsteemina, mis vĂ”imaldas meil seda teha, valisime Helm.
Peamised mÔisted Helm'is
Helm on paketihaldur Kubernetes'e jaoks. See sarnaneb vĂ€ga programmikeelte paketihaldurite tööle. Need vĂ”imaldavad sul hoida teenust, mis koosneb nĂ€iteks nginx'i deployment'ist, php-fpm deployment'ist, Ingress'i konfiguratsioonist, configmap'idest (see on objekt, mis vĂ”imaldab sul mÀÀrata env'i ja muid parameetreid oma sĂŒsteemi jaoks) nii-öelda chart'idena. Samal ajal töötab Helm Kubernetes'e kohal. See ei ole eraldiseisev sĂŒsteem, vaid lihtsalt veel ĂŒks teenus, mis töötab klusteris. Sa suhtled temaga tema API kaudu kĂ€surea kĂ€su abil. Tema mugavus ja ilu seisneb selles, et isegi kui helm puruneb vĂ”i sa eemaldad selle klastrist, ei kao sinu teenused, kuna helm teenib tegelikult vaid sĂŒsteemi kĂ€ivitamiseks. Teenuste toimivuse ja oleku eest vastutab edaspidi Kubernetes.
Samuti mĂ”istsime, et mallimine, mida olime varem sunnitud ise jinja kaudu oma konfiguratsioonidesse lisama, on helm'i ĂŒks peamisi vĂ”imalusi. KĂ”ik konfiguratsioonid, mille sa oma sĂŒsteemide jaoks loote, hoitakse helm'is mallidena, mis sarnanevad natuke jinja'le, kuid tegelikult kasutavad Go keele mallimist, millel helm on kirjutatud, nagu ka Kubernetes.
Helm lisab meile veel paar tÀiendavat mÔistet.
Diagramm â see on sinu teenuse kirjeldus. Teistes paketihaldurites nimetataks seda paketiks, bundle'iks vĂ”i millegiks sarnaseks. Siin kutsutakse seda chart'iks.
Values â nad on muutujad, mida soovid kasutada oma konfiguratsioonide koostamiseks mallidest.
Release. Iga kord, kui teenus, mis on paigaldatud helm'i abil, saab inkrementaalse versiooni vabastusest. Helm mĂ€letab, milliseks konfiguratsioon teenus oli eelmisel, eel-eelmisel vabastamisel jne. SeetĂ”ttu, kui on vaja tagasi minna, piisab helm callback kĂ€skluse tĂ€itmisest, mÀÀrates selle eelneva vabastuse versiooni. Isegi kui vastav konfiguratsioon teie hoidlas ei ole tagasimineku ajal saadaval, mĂ€letab helm ikkagi, milline see oli, ja viib teie sĂŒsteemi tagasi eelneva vabastuse olekusse.
Kui me kasutame helm'i, muutuvad tavalised konfiguratsioonid Kuberneteses samuti mallideks, kus on vÔimalik kasutada muutujaid, funktsioone ja rakendada tingimuslikke operaatorite. Nii saate oma teenuse konfiguratsiooni koguda vastavalt keskkonnale.

KĂ€ praktikas otsustasime toimida veidi teisiti kui Nomadi puhul. Kui Nomadi puhul hoiti ĂŒhes hoidlas nii paigalduskonfiguratsioone kui ka n-muutujaid, mis on vajalikud meie teenuse paigaldamiseks, siis siin otsustasime need eraldada kahte eraldi hoidlasse. Hoidlas «deploy» hoitakse ainult n-muutujaid, mis on vajalikud paigalduseks, ja hoidlas «helm» hoitakse konfiguratsioone vĂ”i chart'e.

Mida see meile andis?
Kuna me ei hoia endi konfiguratsioonifailides tÔeliselt tundlikke andmeid, nÀiteks andmebaaside paroole. Need hoitakse Kuberneteses secrets kujul, kuid seal on ikkagi eraldi asju, millele me ei taha kÔigile juurdepÀÀsu anda. SeetÔttu on juurdepÀÀs hoidla «deploy» rohkem piiratud, samas kui hoidla «helm» sisaldab lihtsalt teenuse kirjeldust. Selle tÔttu saab sellele ohutult anda juurdepÀÀsu laiemale ringile.
Kuna meil on mitte ainult tootmis- vaid ka teisi keskkondi, siis tĂ€nu sellele eraldamisele saame uuesti kasutada meie helm chart'e, et paigaldada teenuseid mitte ainult tootmisse, vaid nĂ€iteks QA-keskkonda. Isegi nende kohapeal kĂ€ivitamiseks kasutades Minikube â see on selline asi kohaliku Kubernetes'e kĂ€ivitamiseks.
Iga repootris oleme jaganud iga teenuse jaoks eraldi katalooge. See tĂ€hendab, et iga katalooge sisaldab mallide, mis kuuluvad vastavale graafikule ja kirjeldavad ressursse, mis tuleb meie sĂŒsteemi kĂ€ivitamiseks juurutada. Repositooriumis "deploy" on meil ainult env-d. Sellisel juhul ei kasutanud me jinja kaudu mallide koostamist, kuna helm pakub mallide koostamist otse â see on ĂŒks selle pĂ”hifunktsioone.
Olemas on juurutamiseks mĂ”eldud skript â deploy.sh, mis lihtsustab ja standardiseerib juurutamise kĂ€ivitamist helmiga. Seega, igaĂŒhele, kes soovib juurutada, nĂ€eb juurutamise liides vĂ€lja tĂ€pselt sama, nagu see oli Nomadi kaudu juurutamisel. Sama deploy.sh, teie teenuse nimi ja koht, kuhu soovite selle juurutada. See toob kaasa, et helm kĂ€ivitatakse. See kogub seejĂ€rel konfiguratsioonid mallidest, asendab vajalikud value-failid ja juurutab need Kubernetesesse.
JĂ€reldused
Kubernetes teenus nÀeb keerulisem vÀlja kui Nomad.

Siin tuleb vÀljuv liiklus Ingressi. See on tÀpselt front-controller, kes vÔtab kÔik pÀringud vastu ja saadab need hiljem vastavatele teenustele vastavalt pÀringu andmetele. Ta mÀÀrab need konfiguratsioonide pÔhjal, mis on osa teie rakenduse kirjeldusest helmiga ja mida arendajad ise mÀÀratlevad. Teenus saadab pÀringud oma pod-idele, st konkreetsetele konteineritele, tasakaalustades sisenevat liiklust kÔikide konteinerite vahel, mis kuuluvad antud teenusele. Ja loomulikult ei tohi unustada, et turvalisusest vÔrgu tasemel ei saa me lahkuda. SeetÔttu töötab Kubernetes klastris segmentatsioon, mis pÔhineb mÀrgistamisel. KÔigil teenustel on kindlad sildid, millega on seotud teenuste juurdepÀÀsu Ôigused nende vÔi teiste vÀlistest/sisestest ressurssidest klastris vÔi vÀljaspool.
Tehes olles, nĂ€gime, et Kubernetes omab kĂ”iki Nomadi vĂ”imalusi, mida olime varem kasutanud, ning lisab palju uut. Seda saab laiendada pluginatega ja praktiliselt kohandatud ressursside tĂŒĂŒpide kaudu. See tĂ€hendab, et teil on vĂ”imalus mitte ainult kasutada midagi, mis tuleb Kubernetesiga standardina, vaid luua omaenda ressurss ja teenus, mis seda ressurssi loeb. See avab tĂ€iendavad laiendusvĂ”imalused teie sĂŒsteemi jaoks ilma Kubernetes'e uuesti installimata ja muutusteta.
Sellise kasutamise nĂ€iteks on Prometheus, mis töötab meie Kubernetes'i klastris. Selleks, et see hakkaks koguma mÔÔdikuid mĂ”nest teenusest, peame teenuse kirjeldusse lisama tĂ€iendava ressursitĂŒĂŒbi, nn teenuse jĂ€lgija. Prometheus suudab peaaegu automaatselt alustada uue sĂŒsteemi mÔÔdikute kogumist, kuna see oskab lugeda kohandatud ressursside tĂŒĂŒpe töötades Kubernetes'is. See on piisavalt mugav.
Esimene deploy, mille me Kubernetes'e puhul tegime, oli mĂ€rtsis 2018. Ja selle aja jooksul pole me kunagi selle kasutamisel mingeid probleeme kogenud. See töötab piisavalt stabiilselt ja Ă”igetel pĂ”hjustel teeme otsekohe laiendusi. TĂ€nasel pĂ€eval on meil piisavalt vĂ”imalusi, mis seal on, ja meile meeldivad Kubernetes'e arengukiirus. Hetkel on Kubernetes'is ĂŒle 3000 konteineri. Klaster hĂ”lmab mitut Node'i. Samal ajal on see hallatav, stabiilne ja vĂ€ga kontrollitav.
Allikas: habr.com
