Helm seadme ja selle miinused

Helm seadme ja selle miinused
Typhon freight hauler concept, Anton Swanepoel

Minu nimi on Dmitri Sugrobov, olen arendaja «Leroy Merlinis». Artiklis rÀÀgin, miks on Helm vajalik, kuidas see lihtsustab Kubernetesega töötamist, mis on muutunud kolmandas versioonis ja kuidas selle abil uuendada rakendusi tootmises seisaku ajal.

See on kokkuvĂ”te konverentsi ettekandest @Kubernetes Conference by Mail.ru Pilve Lahendused — kui te ei soovi lugeda, vaadake videot.

MĂ€ngi videot

Miks me kasutame Kubernetesit tootmises

«Leroy Merlin» on DIY-kaubanduse turuliider Venemaal ja Euroopas. Meie ettevĂ”ttes töötab ĂŒle saja arendaja, 33 000 sisemist töötajat ja tohutu hulk inimesi, kes kĂŒlastavad hĂŒpermarketeid ja veebisaiti. KĂ”igi nende Ă”nnelikuks tegemiseks otsustasime jĂ€rgida tööstuse standardseid lĂ€henemisviise. Arendame uusi rakendusi mikroteenuste arhitektuuri kasutades, kasutame keskkondade isolatsiooniks ja Ă”igeks tarnimiseks konteinerit, ning orkestreerimisel Kubernetesit. Orkestreerijate kasutamise hind langeb kiiresti: turul suureneb inseneride arv, kes valdab tehnoloogiat, ja ilmuvad teenusepakkujad, kes pakuvad Kubernetesit teenusena.

KĂ”ik, mida Kubernetes teeb, on loomulikult vĂ”imalik teha ka muul viisil, nĂ€iteks skriptides mĂ”ne Jenkinsiga ja docker-compose’iga, aga miks elu keerulisemaks teha, kui on olemas usaldusvÀÀrne lahendus? SeetĂ”ttu jĂ”udsime Kubernetesini ja oleme seda juba aasta tootmises kasutanud. Praegu on meil kakskĂŒmmend neli Kubernetes klastrit, kĂ”ige vanem neist on ĂŒle aasta vana, selles on umbes kakssada podi.

Paljude YAML-failide needus Kuberneteses

Mikroteenuse kĂ€ivitamiseks Kuberneteses loome vĂ€hemalt viis YAML-faili: Deployment, Service, Ingress, ConfigMap, Secrets — ja saadame need klastrisse. JĂ€rgmise rakenduse jaoks kirjutame sama komplekti YAML-failidest, kolmanda jaoks veel ĂŒhe ja nii edasi. Korruta dokumentide arv keskkondade arvuga ja saame juba sadu faile, ja see ei arvestagi dĂŒnaamilisi keskkondi.

Helm seadme ja selle miinused
Adam Reese, Helm'i pĂ”hihooldaja, tutvustas mĂ”istet «ArendussĂŒkkel Kuberneteses», mis nĂ€eb vĂ€lja nii:

  1. Copy YAML — kopeeri YAML-fail.
  2. Paste YAML — kleebi see.
  3. Fix Indents — paranda sisesid.
  4. Repeat — korda uuesti.

Variant on töökindel, kuid tuleb palju kordi YAML-faile kopeerida. Selle ringi muutmiseks leiutati Helm.

Mis on Helm

Esiteks, Helm — paketihaldur, mis aitab leida ja installida vajalikke programme. NĂ€iteks MongoDB installimiseks ei pea ametlikule veebisaidile minema ja binaare alla laadima, piisab kĂ€su tĂ€itmisest helm install stable/mongodb.

Teiseks, Helm — malligeneraator, mis aitab failide parametriseerimisel. Naaseme Kuberneteses YAML-failide olukorra juurde. Lihtsam on kirjutada sama YAML-fail, lisada sinna mĂ”ned kohatĂ€itjad, kuhu Helm sobitab vÀÀrtused. TeisisĂ”nu, selle asemel, et kasutada suurt hulka YAML-e, on olemas mallide kogum (ĆĄabloonid), kuhu Ă”igel ajal sobitatakse vajalikud vÀÀrtused.

Kolmandaks, Helm — paigalduse meister. Selle abil saab installida, tagasi pöörata ja uuendada rakendusi. Vaatame, kuidas seda teha.

Helm seadme ja selle miinused

Kuidas kasutada Helmi oma rakenduste paigaldamiseks

Installime Helmi kliendi arvutisse, jÀrgides ametlikku juhendis. SeejÀrel loome komplekti YAML-failidest. Konkreetsete vÀÀrtuste nÀitamise asemel jÀtame kohatÀitjad, mille Helmi hiljem teabega tÀidab. Sellesugust failide kogumit nimetatakse Helmi kaardiks. Helmi konsooli kliendile saab selle saata kolmel viisil:

  • nĂ€idates mallide kausta;
  • pakendades .tar arhiivi ja viidates sellele;
  • paneme ĆĄablooni kaugrepositorysse ja lisame linki repo Helmi kliendile.

Veel on vajalik vÀÀrtuste fail — values.yaml. Siit saadud andmed sobitatakse ĆĄablooni. Loome selle samuti.

Helm seadme ja selle miinused
Teises Helmi versioonis on lisanduv serveri rakendus — Tiller. See asub Kubernetesest vĂ€ljaspool ja ootab Helmi kliendi pĂ€ringuid ning sobitab nĂ”utud vÀÀrtused ĆĄablooni ja saadab need Kubernetesesse.

Helm seadme ja selle miinused
Helm 3 on lihtsam: ĆĄabloonide töötlemise asemel serveris töödeldakse info nĂŒĂŒd tĂ€ielikult Helmi kliendi poolel ja saadetakse otse Kubernetes API-le. See lihtsustus suurendab klastrite turvalisust ja lihtsustab levitamisstrateegiat.

Kuidas see kÔik töötab

KÀivitame kÀsu helm install. NÀitame rakenduse vÀljaande nime, mÀÀrame teed values.yaml failini. LÔpus nimetame repository, kus kaardi asub, ja kaardi nime. NÀiteks on need 'lmru' ja 'bestchart'.

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

KĂ€sku saab tĂ€ita ainult ĂŒks kord. Korduva tĂ€itmise korral asemel install tuleb kasutada upgrade. Lihtsuse huvides vĂ”ib kasutada kahte kĂ€sku ĂŒhe kĂ€skude kombinatsioonina upgrade lisavĂ”tmega --installEsimese kĂ€ivitamise korral saadab Helm kĂ€su vĂ€ljaande installimiseks ja edaspidi uuendab seda.

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

Uute versioonide rakendamise probleemid Helmiga

Selle loo juures mĂ€ngin saalis „Kes tahab saada miljonĂ€riks” ja selgitame vĂ€lja, kuidas sundida Helmi rakenduse versiooni vĂ€rskendama. Vaata videot.

Kui uurisin Helmi tööd, ĂŒllatas mind kummaline kĂ€itumine, kui proovisin kĂ€ivitatud rakenduste versioone vĂ€rskendada. Rakenduskoodi uuendasin, laadisin Docker registrisse uue pildi, saatsin kĂ€skluse rakenduse kĂ€ivitamiseks – ja midagi ei juhtunud. Allpool on mĂ”ned mitte just kĂ”ige paremad viisid rakenduste vĂ€rskendamiseks. IgaĂŒht neist sĂŒgavamalt uurides hakkad mĂ”istma tööriista sisemist ĂŒlesehitust ja pĂ”hjuseid selle ebaselge kĂ€itumise taha.

Viis 1. Mitte muuta teavet alates viimati kÀivitamisest

Kuidas ĂŒtleb ametlik veebisait Helm, „Kubernetesi graafikud vĂ”ivad olla suured ja keerulised, seetĂ”ttu pĂŒĂŒab Helm mitte midagi liiga tihti muuta.” Seega, kui uuendada pildi latest versiooni Docker registris ja kĂ€ivitada kĂ€sk helm upgrade, siis ei juhtu midagi. Helm arvab, et midagi ei ole muutunud ja seetĂ”ttu ei pea Kubernetes'ele rakenduse vĂ€rskendamise kĂ€sku saatma.

Siin ja edaspidi on tag 'latest' nÀidatud vaid nÀitena. Selle sildi mÀÀramisel laadib Kubernetes igal korral pildi Docker registrist, sÔltumata imagePullPolicy parameetrist. 'Latest' kasutamine tootmises on soovitatav vÀltida ja vÔib pÔhjustada kÔrvaltoimeid.

Viis 2. VĂ€rskendada LABELi imajas

Nagu on öeldud samas dokumentatsioon, „Helm vĂ€rskendab rakendust, ainult kui see on muutunud alates viimase vĂ€ljaande.” Loogiliseks variandiks tundub olla LABEL'i sildi vĂ€rskendamine ise Docker-pildis. Siiski, Helm ei piilu rakenduste piltidesse ja ei tea nende muutustest. SeetĂ”ttu, kui sildi vĂ€rskendamisel on eeldatav, et Helm neist teada ei saa ja rakenduse vĂ€rskendamise kĂ€sk Kubernetes'esse ei jĂ”ua.

Viis 3. Kasutada vÔtmeid --force

Helm seadme ja selle miinused
Vaatame manuaale ja otsime vajalikke vÔtmeid. KÔige rohkem sobib konteksti vÔtme --force. Hoolimata kÔnelevast nimest, kÀitumine erineb ootamatust. Selle asemel, et sundida rakendust vÀrskendama, on selle tegelik eesmÀrk taastada FAILED olekus oleva versiooni. Kui seda vÔtit ei kasutata, tuleb jÀrjestikku teostada kÀske. helm delete && helm install --replace. Selle asemel soovitatakse kasutada vÔtit --force, mis automatiseerib nende kÀskude jÀrjestikulise tÀitmise. Rohkem teavet leiate sellest pull-requestist.. Et öelda Helmile, et rakenduse versioon ikkagi uuendada, ei sobi kahjuks see vÔti.

Viis 4. Muuda labels otse Kuberneteses.

Helm seadme ja selle miinused
Labeli otse uuendamine klastris kĂ€su abil kubectl edit — halb mĂ”te. See tegevus toob kaasa teabe jĂ€rjepidevuse rikkumise töötava rakenduse ja selle vahel, mis algselt saadeti juurutamiseks. Helmi kĂ€itumine juurutamisel on sel juhul erinev selle versioonist: Helm 2 ei tee midagi, samas kui Helm 3 juurutab rakenduse uue versiooni. Selle pĂ”hjuse mĂ”istmiseks tuleb aru saada, kuidas Helm töötab.

Kuidas Helm töötab?

Et mÀÀrata, kas rakendus on viimasest vÀljaandest alates muutunud, vÔib Helm kasutada:

  • Kuberneteses kĂ€ivitatud rakendust;
  • uut values.yaml faili ja asjakohast chart'i;
  • Helmi siseteavet vĂ€ljaannete kohta.

KĂ”ige uudishimu ĂŒle: kus Helm salvestab siseteabe vĂ€ljaannete kohta?KĂ€sku tĂ€ites helm history, saame kogu teabe versioonide kohta, mis on Helmi abil installitud.

Helm seadme ja selle miinused
Seal on ka ĂŒksikasjalik teave saadetud mallide ja vÀÀrtuste kohta. Saame seda kĂŒsida:

Helm seadme ja selle miinused
Helmi teises versioonis on see teave samas nimiruumis, kus Tiller töötab (vaikimisi — kube-system), ConfigMap'is, mis on mĂ€rgistatud sildiga 'OWNER=TILLER':

Helm seadme ja selle miinused
Kolmanda versiooni saabudes kolis teave saledatesse, kes töötab samas nimiruumis, kus rakendus on kÀimas. See vÔimaldas samal ajal kÀitada mitut rakendust erinevates nimiruumides sama vÀljaande nimega. Teises versioonis oli see tÔsine peavalu, kuna nimiruumid on isoleeritud, kuid saavad omavahel mÔjutada.

Helm seadme ja selle miinused

Teine Helm, kui ta ĂŒritab aru saada, kas uuendamine on vajalik, kasutab ainult kahte teabeallikat: seda, mida talle praegu pakuti, ja siseteavet vĂ€ljaannete kohta, mis on ConfigMap'is.

Helm seadme ja selle miinused
Kolmas Helm kasutab kolme ĂŒhinemise strateegiat: lisaks sellele teabele arvestab ta ka rakendusega, mis hetkel Kuberneteses töötab.

Helm seadme ja selle miinused
SeetÔttu ei tee vana versioon Helm midagi, kuna see ei arvestanud klastri rakenduse infot, kuid Helm 3 saab muudatused ja saadab uue rakenduse vÀljastamiseks.

Viis meetodit. Kasutada vĂ”tme —recreate-pods

VĂ”tme --recreate-pods abil on vĂ”imalik saavutada seda, mida algselt sooviti saavutada vĂ”tme --force. Konteinerid taaskĂ€ivituvad ja vastavalt poliitikale imagePullPolicy: Always mĂ€rgis latest (sellest oli juba eespool juttu) laadib Kubernetes alla ja kĂ€ivitab uue pildi versiooni. Kuid see toimub mitte eriti hĂ€sti: jĂ€ttes tĂ€helepanuta StrategyType juurutuse, lĂŒlitab see jĂ€rsku vĂ€lja kĂ”ik vanad rakenduse instantsid ja hakkab kĂ€ivitama uusi. TaaskĂ€ivitamise ajal sĂŒsteem ei tööta, kasutajad kannatavad.

Kuberneteses oli sarnane probleem pikka aega. Ja nĂŒĂŒd, neli aastat pĂ€rast probleemi avastamist Probleem, on probleem lahendatud ning alates 1.15 versioonist on Kuberneteses vĂ”imalik tehtud podide rolling-restart.

Helm lihtsalt lĂ”petab kĂ”ik rakendused ja kĂ€ivitab kĂ”rval uued konteinerid. TootmisreĆŸiimis ei tohi niimoodi teha, et mitte tekitada rakenduse seiskumist. Seda tuleks teha ainult arenduse vajadusteks, seda saab teostada ainult etapi keskkondades.

Kuidas uuendada rakenduse versiooni Helmiga?

Muudame Helmile edastatavaid vÀÀrtusi. Reeglina on need vÀÀrtused, mis asendavad pildi sildi. Juhul, kui kasutatakse latest, mida sageli kasutatakse mitteproduktiivsetes keskkondades, on muudetav teave mÀrk, mis on Kubernetesile kasutu, kuid Helmile annab signaali rakenduse uuendamise vajadusest. Annootatsiooni vÀÀrtuste tÀitmise variandid:

  1. Juhuslik vÀÀrtus kasutades standardfunktsiooni — {{ randAlphaNum 6 }}.
    On nĂŒanss: pĂ€rast iga juurutamist selle chardi abil, millel on selline muutujavÀÀrtus, on annootatsiooni vÀÀrtus ainulaadne ning Helm arvab, et on muutused. Seega taaskĂ€ivitame rakenduse alati, isegi kui me ei ole selle versiooni muutnud. See ei ole kriitiline, kuna seismist ei tule, aga siiski ebameeldiv.
  2. Sisestada praegune kuupĂ€ev ja kellaaeg — {{ .Release.Date }}.
    Variant on sarnane juhuslikule vÀÀrtusele, kuid pidevalt ainulaadse muutujaga.
  3. Õigeim viis on kasutada kontrollsummad. See on SHA pildi vĂ”i SHA viimase git commit'i — {{ .Values.sha }}.
    Need tuleb arvestada ja saata Helm klientile kutsuva poole, nÀiteks Jenkinsis. Kui rakendus muutub, muutub ka kontrollsumma. Seega uuendab Helm rakendust ainult siis, kui see on vajalik.

KokkuvÔtteks meie katsetest

  • Helm teeb muudatused vĂ”imalikult vĂ€hem invasiivsel viisil, seega ei too rakenduse pildi tasemel muutmine Docker Registry's kaasa uuendamist: kĂ€su tĂ€itmisel ei juhtu midagi.
  • VĂ”ti --force kasutatakse probleemsete versioonide taastamiseks ning ei ole seotud sunduuendamisega.
  • VĂ”ti --recreate-pods sunduuendab rakendusi, kuid teeb seda vandalismi meetodil: sulgeb jĂ€rsult kĂ”ik konteinerid. Selle tagajĂ€rjel kannatavad kasutajad, tootmises ei tohiks seda teha.
  • Otse Kubernetes klastrisse muudatuste tegemine kĂ€su abil kubectl edit ei ole vajalik: see rikub jĂ€rjepidevust ja kĂ€itumine sĂ”ltub Helm'i versioonist.
  • Uue Helm'i versiooni vĂ€ljaandmisega on tulnud palju nĂŒansse. Issues Helm'i hoidlas on selgelt kirjeldatud ning need aitavad detailides selgust saada.
  • Muudetava annotatsiooni lisamine charti muudab selle paindlikumaks. See vĂ”imaldab rakenduse Ă”igesti juurutada, ilma seisakuteta.

MĂ”te, mis kehtib igas eluvaldkonnas: loe juhendit enne kasutamist, mitte pĂ€rast. Ainult tĂ€ielikku teavet omades on vĂ”imalik ehitada usaldusvÀÀrseid sĂŒsteeme ja teha kasutajaid Ă”nnelikuks.

Teised seotud lingid:

  1. Tutvumine Helm 3
  2. Helm ametlik veebisait
  3. Helm'i hoidl on GitHubis
  4. 25 kasulikku tööriista Kubernetes: juurutamine ja haldamine

See ettekande kuulutati esmakordselt @Kubernetes Conference Mail.ru Cloud Solutions poolt. NĂ€e video teisi ettekandeid ja jĂ€lgi ĂŒrituste teadaandeid Telegramis Kubernetesest Mail.ru Groupis.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster