„Helm“ įrenginys ir jo spąstai

„Helm“ įrenginys ir jo spąstai
„Typhon“ krovininio vežėjo koncepcija, Anton Swanepoel

Mano vardas Dmitrijus Sugrobovas, aš esu Leroy Merlin kūrėjas. Šiame straipsnyje papasakosiu, kam reikalingas „Helm“, kaip supaprastina darbą su „Kubernetes“, kas pasikeitė trečiojoje versijoje ir kaip ją naudoti gamybinėms programoms atnaujinti be prastovų.

Tai santrauka, pagrįsta kalba konferencijoje @Kubernetes konferencija by Mail.ru debesų sprendimai - jei nenorite skaityti, žiūrėkite vaizdo įrašą.

Kodėl mes naudojame Kubernetes gamyboje

„Leroy Merlin“ yra „pasidaryk pats“ mažmeninės prekybos rinkos lyderis Rusijoje ir Europoje. Mūsų įmonėje dirba daugiau nei šimtas kūrėjų, 33 000 vidinių darbuotojų ir daugybė žmonių, besilankančių prekybos centruose ir svetainėje. Kad jie visi būtų laimingi, nusprendėme laikytis pramonės standartų. Kurti naujas programas naudojant mikro paslaugų architektūrą; naudoti konteinerius, kad izoliuotų aplinką ir užtikrintų tinkamą pristatymą; ir orkestravimui naudokite Kubernetes. Orkestratorių naudojimo kaina sparčiai mažėja: rinkoje daugėja technologiją išmanančių inžinierių, atsiranda tiekėjų, siūlančių Kubernetes kaip paslaugą.

Viską, ką daro „Kubernetes“, žinoma, galima padaryti ir kitais būdais, pavyzdžiui, uždengiant kai kuriuos Jenkins ir „docker-compose“ scenarijus, bet kam apsunkinti gyvenimą, jei yra paruoštas ir patikimas sprendimas? Štai kodėl mes atėjome į „Kubernetes“ ir jau metus naudojame jį gamyboje. Šiuo metu turime dvidešimt keturias „Kubernetes“ klasterius, iš kurių seniausia yra daugiau nei metų, turi apie du šimtus ankščių.

Didelių YAML failų prakeiksmas „Kubernetes“.

Norėdami paleisti mikropaslaugą Kubernetes, sukursime bent penkis YAML failus: diegimui, paslaugai, įėjimui, konfigūracijos žemėlapiui, paslaptims ir išsiųsime juos į klasterį. Kitai aplikacijai rašysime tą patį staktų paketą, su trečia dar vieną ir t.t. Jei dokumentų skaičių padauginsime iš aplinkų skaičiaus, jau gausime šimtus failų, ir tai dar neatsižvelgiama į dinamines aplinkas.

„Helm“ įrenginys ir jo spąstai
Adamas Reese, pagrindinis Helm prižiūrėtojas, pristatė koncepcijąKūrimo ciklas Kubernetes“, kuris atrodo taip:

  1. Kopijuoti YAML – nukopijuokite YAML failą.
  2. Įklijuokite YAML – įklijuokite.
  3. Pataisyti įtraukas – taisyti įtraukas.
  4. Pakartokite – pakartokite dar kartą.

Parinktis veikia, bet jūs turite daug kartų kopijuoti YAML failus. Norėdami pakeisti šį ciklą, buvo išrastas Helmas.

Kas yra Helmas

Pirma, Helmas - paketo valdytojas, kuri padeda rasti ir įdiegti reikalingas programas. Norėdami įdiegti, pavyzdžiui, MongoDB, jums nereikia eiti į oficialią svetainę ir atsisiųsti dvejetainių failų, tiesiog paleiskite komandą helm install stable/mongodb.

Antra, vairas - šablono variklis, padeda parametruoti failus. Grįžkime prie situacijos su YAML failais Kubernetes. Lengviau parašyti tą patį YAML failą, pridėti prie jo keletą rezervuotųjų ženklų, į kuriuos Helm pakeis reikšmes. Tai yra, vietoj didelio pastolių rinkinio bus šablonų rinkinys, į kurį reikiamu laiku bus pakeistos reikiamos reikšmės.

Trečia, Helmas - dislokavimo meistras. Su juo galite įdiegti, atšaukti ir atnaujinti programas. Išsiaiškinkime, kaip tai padaryti.

„Helm“ įrenginys ir jo spąstai

Kaip naudoti „Helm“ savo programoms diegti

Įdiegkime „Helm“ klientą jūsų kompiuteryje, vadovaudamiesi oficialiais nurodymais instrukcijos. Tada sukursime YAML failų rinkinį. Užuot nurodę konkrečias reikšmes, paliksime vietos žymeklius, kuriuos Helm ateityje užpildys informacija. Tokių failų rinkinys vadinamas vairo diagrama. Jis gali būti išsiųstas „Helm“ konsolės klientui trimis būdais:

  • nurodykite aplanką su šablonais;
  • supakuoti archyvą į .tar ir nukreipti į jį;
  • įdėkite šabloną į nuotolinę saugyklą ir pridėkite nuorodą į saugyklą Helm kliente.

Taip pat reikia failo su reikšmėmis - Values.yaml. Duomenys iš ten bus įterpti į šabloną. Sukurkime ir jį.

„Helm“ įrenginys ir jo spąstai
Antroji „Helm“ versija turi papildomą serverio programą – „Tiller“. Jis kabo už „Kubernetes“ ribų ir laukia „Helm“ kliento užklausų, o kai iškviečiamas, pakeičia reikiamas reikšmes į šabloną ir siunčia jį į „Kubernetes“.

„Helm“ įrenginys ir jo spąstai
„Helm 3“ yra paprastesnis: vietoj šablonų apdorojimo serveryje, informacija dabar apdorojama tik „Helm“ kliento pusėje ir siunčiama tiesiai į „Kubernetes“ API. Šis supaprastinimas pagerina grupių saugumą ir palengvina diegimo schemą.

Kaip visa tai veikia

Vykdykite komandą helm install. Nurodykime programos leidimo pavadinimą ir nurodykime kelią į values.yaml. Pabaigoje nurodysime saugyklą, kurioje yra diagrama, ir diagramos pavadinimą. Pavyzdyje tai yra atitinkamai „lmru“ ir „bestchart“.

helm install --name bestapp --values values.yaml lmru/bestchart

Komanda gali būti vykdoma tik vieną kartą, kai ji vykdoma dar kartą install reikia naudoti upgrade. Paprastumo dėlei vietoj dviejų komandų galite paleisti komandą upgrade su papildomu raktu --install. Kai vykdoma pirmą kartą, Helm išsiųs komandą įdiegti leidimą ir ją atnaujins ateityje.

helm upgrade --install bestapp --values values.yaml lmru/bestchart

Naujų programos versijų su Helm diegimo spąstai

Šioje istorijos vietoje su žiūrovais žaidžiu „Kas nori tapti milijonieriumi“ ir sugalvojame, kaip priversti Helmą atnaujinti programos versiją. Žiūrėti video įrašą.

Kai mokiausi, kaip veikia Helm, mane nustebino keistas elgesys bandant atnaujinti veikiančių programų versijas. Atnaujinau programos kodą, įkėliau naują vaizdą į Docker registrą, išsiunčiau diegimo komandą – ir nieko neįvyko. Žemiau pateikiami keli ne visai sėkmingi programų atnaujinimo būdai. Išsamiau išnagrinėję kiekvieną iš jų, pradėsite suprasti vidinę instrumento struktūrą ir šio neaiškio elgesio priežastis.

1 būdas. Nekeiskite informacijos nuo paskutinio paleidimo

Kaip sakoma oficiali svetainė Helmas, „Kubernetes diagramos gali būti didelės ir sudėtingos, todėl Helmas stengiasi nieko per daug neliesti“. Todėl, jei atnaujinsite naujausią programos vaizdo versiją docker registre ir paleisite komandą helm upgrade, tada nieko nebus. Helmas manys, kad niekas nepasikeitė ir nereikia siųsti komandos Kubernetes atnaujinti programą.

Čia ir toliau naujausia žyma rodoma tik kaip pavyzdys. Kai nurodysite šią žymą, „Kubernetes“ kiekvieną kartą atsisiųs vaizdą iš docker registro, neatsižvelgiant į „imagePullPolicy“ parametrą. Naudoti naujausią gamybą yra nepageidautina ir sukelia šalutinį poveikį.

2 būdas. Atnaujinkite LABEL paveikslėlyje

Kaip parašyta tame pačiame dokumentacija„Helm atnaujins programą tik tuo atveju, jei ji pasikeitė nuo paskutinio leidimo“. Atrodytų, kad logiška parinktis yra LABEL atnaujinimas pačiame „Docker“ vaizde. Tačiau Helmas nenagrinėja programos vaizdų ir neturi supratimo apie jokius jų pakeitimus. Atitinkamai, atnaujindamas paveikslėlyje esančias etiketes, „Helm“ apie jas nežinos, o programos atnaujinimo komanda nebus siunčiama „Kubernetes“.

3 būdas: naudokite raktą --force

„Helm“ įrenginys ir jo spąstai
Atsiverskime žinynus ir ieškokime reikiamo rakto. Raktas yra prasmingiausias --force. Nepaisant akivaizdaus pavadinimo, elgesys skiriasi nuo laukiamo. Užuot priverstinai atnaujinusi programą, jos tikrasis tikslas yra atkurti leidimą, kurio būsena FILED. Jei nenaudojate šio klavišo, komandas reikia vykdyti nuosekliai helm delete && helm install --replace. Vietoje to rekomenduojama naudoti raktą --force, kuri automatizuoja nuoseklų šių komandų vykdymą. Daugiau informacijos čia traukti prašymą. Deja, norint nurodyti Helm atnaujinti programos versiją, šis raktas neveiks.

4 būdas. Pakeiskite etiketes tiesiogiai Kubernetes

„Helm“ įrenginys ir jo spąstai
Etiketės atnaujinimas tiesiai klasteryje naudojant komandą kubectl edit - bloga idėja. Šis veiksmas sukels informacijos nenuoseklumą tarp veikiančios programos ir tos, kuri iš pradžių buvo išsiųsta diegti. „Helm“ elgsena diegiant šiuo atveju skiriasi nuo jos versijos: „Helm 2“ nieko nepadarys, o „Helm 3“ įdiegs naują programos versiją. Norėdami suprasti, kodėl, turite suprasti, kaip veikia Helm.

Kaip veikia Helmas?

Norėdami nustatyti, ar programa pasikeitė nuo paskutinio leidimo, „Helm“ gali naudoti:

  • veikia programa Kubernetes;
  • naujos reikšmės.yaml ir dabartinė diagrama;
  • „Helm“ vidinė išleidimo informacija.

Smalsesniems: kur Helm saugo vidinę informaciją apie leidimus?Vykdydami komandą helm history, gausime visą informaciją apie versijas, įdiegtas naudojant Helm.

„Helm“ įrenginys ir jo spąstai
Taip pat yra išsami informacija apie siunčiamus šablonus ir vertes. Galime paprašyti:

„Helm“ įrenginys ir jo spąstai
Antrojoje „Helm“ versijoje ši informacija yra toje pačioje vardų erdvėje, kurioje veikia „Tiller“ (pagal numatytuosius nustatymus „kube“ sistema), „ConfigMap“, pažymėtoje etikete „OWNER=TILLER“:

„Helm“ įrenginys ir jo spąstai
Kai pasirodė trečioji „Helm“ versija, informacija persikėlė į paslaptis ir į tą pačią vardų erdvę, kurioje veikė programa. Dėl šios priežasties atsirado galimybė vienu metu paleisti kelias programas skirtingose ​​vardų srityse tuo pačiu leidimo pavadinimu. Antrojoje versijoje tai buvo rimtas galvos skausmas, kai vardų erdvės yra izoliuotos, bet gali turėti įtakos viena kitai.

„Helm“ įrenginys ir jo spąstai

Antrasis Helm, bandydamas suprasti, ar reikia atnaujinimo, naudoja tik du informacijos šaltinius: tai, kas jam pateikiama dabar, ir vidine informacija apie leidimus, esančią ConfigMap.

„Helm“ įrenginys ir jo spąstai
Trečiasis Helm naudoja trijų krypčių sujungimo strategiją: be šios informacijos, ji taip pat atsižvelgia į programą, kuri šiuo metu veikia Kubernetes.

„Helm“ įrenginys ir jo spąstai
Dėl šios priežasties senoji „Helm“ versija nieko nedarys, nes neatsižvelgia į klasteryje esančią programos informaciją, tačiau „Helm 3“ gaus pakeitimus ir išsiųs naują programą diegti.

5 būdas. Naudokite jungiklį --recreate-pods

Su raktu --recreate-pods su raktu galite pasiekti tai, ką iš pradžių planavote pasiekti --force. Sudėtiniai rodiniai bus paleisti iš naujo ir, atsižvelgiant į „imagePullPolicy“: visada naujausios žymos politiką (daugiau apie tai aukščiau esančioje išnašoje), „Kubernetes“ atsisiųs ir paleis naują vaizdo versiją. Tai nebus padaryta geriausiu būdu: neatsižvelgdama į diegimo strategiją, ji staiga išjungs visus senus programų egzempliorius ir pradės paleisti naujus. Perkrovimo metu sistema neveiks, nukentės vartotojai.

Pačiame Kubernetes panaši problema taip pat egzistavo ilgą laiką. Ir dabar, praėjus 4 metams po atidarymo Emisija, problema buvo išspręsta, o nuo 1.15 Kubernetes versijos atsiranda galimybė iš naujo paleisti blokus.

Helm tiesiog išjungia visas programas ir netoliese paleidžia naujus konteinerius. Negalite to padaryti gamyboje, kad nesukeltumėte programos prastovos. Tai reikalinga tik tobulinimo poreikiams ir gali būti atliekama tik sceninėje aplinkoje.

Kaip atnaujinti programos versiją naudojant „Helm“?

Mes pakeisime Helm siunčiamas vertes. Paprastai tai yra reikšmės, kurios pakeičiamos vietoje vaizdo žymos. Naujausios, dažnai naudojamos neproduktyviose aplinkose, atveju keičiama informacija yra anotacija, kuri pačiai Kubernetes yra nenaudinga, o Helm ji veiks kaip signalas, kad reikia atnaujinti programą. Anotacijos reikšmės užpildymo parinktys:

  1. Atsitiktinė vertė naudojant standartinę funkciją - {{ randAlphaNum 6 }}.
    Yra įspėjimas: po kiekvieno diegimo naudojant diagramą su tokiu kintamuoju anotacijos reikšmė bus unikali, o Helm manys, kad yra pakeitimų. Pasirodo, mes visada paleisime programą iš naujo, net jei nepakeitėme jos versijos. Tai nėra kritiška, nes prastovų nebus, tačiau vis tiek nemalonu.
  2. Įklijavimo srovė data ir laikas - {{ .Release.Date }}.
    Variantas yra panašus į atsitiktinę reikšmę su nuolatiniu unikaliu kintamuoju.
  3. Teisingesnis būdas yra naudoti kontrolines sumas. Tai yra vaizdo SHA arba paskutinio git įsipareigojimo SHA - {{ .Values.sha }}.
    Jie turės būti suskaičiuoti ir išsiųsti Helm klientui iš skambinančios pusės, pavyzdžiui, Jenkins. Jei programa pasikeitė, kontrolinė suma pasikeis. Todėl „Helm“ programą atnaujins tik prireikus.

Apibendrinkime savo bandymus

  • „Helm“ atlieka pakeitimus mažiausiai invaziniu būdu, todėl bet koks programos vaizdo lygio pakeitimas „Docker“ registre nebus atnaujintas: įvykdžius komandą nieko neatsitiks.
  • Raktas --force naudojamas probleminiams leidimams atkurti ir nėra susijęs su priverstiniais atnaujinimais.
  • Raktas --recreate-pods priverstinai atnaujins programas, bet darys tai vandališkai: staigiai išjungs visus konteinerius. Nuo to nukentės vartotojai; neturėtumėte to daryti gamyboje.
  • Tiesiogiai atlikite Kubernetes klasterio pakeitimus naudodami komandą kubectl edit nedarykite: sulaužysime nuoseklumą, o elgesys skirsis priklausomai nuo Helm versijos.
  • Išleidus naują „Helm“ versiją, atsirado daug niuansų. Helm saugyklos problemos aprašytos aiškia kalba, jos padės suprasti detales.
  • Jei prie diagramos pridėsite redaguojamą komentarą, ji taps lankstesnė. Tai leis jums tinkamai įdiegti programą be prastovų.

„Pasaulio taikos“ mintis, kuri veikia visose gyvenimo srityse: perskaitykite instrukcijas prieš naudodami, o ne po to. Tik su visa informacija bus galima sukurti patikimas sistemas ir pradžiuginti vartotojus.

Kitos susijusios nuorodos:

  1. Pažintis su Šalmas 3
  2. Helm oficiali svetainė
  3. „Helm“ saugykla „GitHub“.
  4. 25 Naudingi „Kubernetes“ įrankiai: diegimas ir valdymas

Ši ataskaita pirmą kartą buvo pristatyta @Kubernetes konferencija pateikė Mail.ru Cloud Solutions. Žiūrėk видео kitus pasirodymus ir užsiprenumeruokite renginių pranešimus Telegramoje Aplink Kubernetes Mail.ru grupėje.

Šaltinis: www.habr.com

Добавить комментарий