
Minu nimi on Dmitri Sugrobov, olen arendaja ettevÔttes 'Leroy Merlin'. Artikli eesmÀrk on rÀÀkida, miks on Helm vajalik, kuidas see lihtsustab Kubernetes'ega töötamist, mis on muutunud kolmandas versioonis ja kuidas selle abil rakendusi tootmises katkematuks uuendada.
See on kokkuvĂ”te kĂ”nest konverentsil by â kui te ei soovi lugeda, vaadake videot.

Miks me kasutame Kubernetes't tootmises
'Leroy Merlin' on DIY-jaemĂŒĂŒgi turuliider Venemaal ja Euroopas. Meie ettevĂ”ttes on ĂŒle saja arendaja, 33 000 sisemist töötajat ja tohutu hulk inimesi, kes kĂŒlastavad hĂŒpermarketeid ja veebisaiti. KĂ”ikide nende Ă”nnelikuks tegemiseks otsustasime jĂ€rgida tööstusharu standardseid lĂ€henemisviise. Arendame uusi rakendusi, kasutades mikroteenuste arhitektuuri; keskkondade isoleerimiseks ja Ă”ige tarnimise tagamiseks kasutame konteinerite tehnoloogiat; ning orkestreerimiseks kasutame Kubernetes't. Orkestreerijate kasutushind vĂ€heneb kiiresti: turule tuleb ĂŒha rohkem insenere, kes valdavad tehnoloogiat, ja ilmuvad teenusepakkujad, kes pakuvad Kubernetes't teenusena.
KĂ”ik, mida Kubernetes teeb, on muidugi vĂ”imalik teha ka muude meetoditega, nĂ€iteks kirjutades skripte Jenkinsile ja docker-compose'ile, kuid miks elamist keerulisemaks teha, kui on olemas valmis ja usaldusvÀÀrne lahendus? SeetĂ”ttu jĂ”udsime Kuberneteseni, mida oleme kasutanud tootmises juba aasta. Praegu on meil kakskĂŒmmend neli Kubernetes'e klastrit, kĂ”ige vanem neist on ĂŒle aasta vana ja selles on umbes kakssada pod'i.
YAML-failide hulk Kuberneteses on tÔeline nuhtlus.
MikrosĂŒsteemi 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-faile, kolmandale lisame veel ĂŒhe ja nii edasi. Korrutades failide arvu keskkondade arvuga, saame juba sadu faile, ja see ei arvestagi dĂŒnaamilisi keskkondi.

Adam Reese, Helm'i peamine hooldaja, tutvustas mĂ”istet ââ, mis nĂ€eb vĂ€lja jĂ€rgmine:
- Kopeeri YAML â kopeeri YAML-fail.
- Kleebi YAML â kleebi see sisse.
- Paranda sisendid â paranda tĂŒkid.
- Korrake â korda uuesti.
See variant töötab, kuid peab korduvalt YAML-faile kopeerima. Selle tsĂŒkli muutmiseks loodi Helm.
Mis on Helm
Esiteks, Helm â paketihaldur, mis aitab leida ja installida vajalikke programme. NĂ€iteks MongoDB installimiseks ei ole vaja minna ametlikule veebisaidile ja allalaadimiseks bin faile, piisab kĂ€su tĂ€itmisest helm install stable/mongodb.
Teiseks, Helm â ĆĄablonigeneraator, aitab parameteriseerida faile. Naaseme Kuberneteses YAML-failide olukorda. Sama YAML faili kirjutamine on lihtsam, kui lisada mĂ”ned kohandatavad vÀÀrtused, mida Helm vahetab. Ehk et suure hulga YAML-failide asemel on olemas ĆĄablonid (template'id), kuhu Ă”igel ajal Ă”iged vÀÀrtused sisse pannakse.
Kolmandaks, Helm â rakenduste juurutamise meister. Selle abil on vĂ”imalik installida, tagasi pöörduda ja vĂ€rskendada rakendusi. Vaadakem, kuidas seda teha.

Kuidas kasutada Helmi oma rakenduste juurutamiseks
Installeerime Helm kliendi arvutisse, jÀrgides ametlikku . SeejÀrel loome komplekti YAML-faile. Konkreetsete vÀÀrtuste mÀÀramise asemel jÀtame kohandatavad vÀÀrtused, mille Helm tulevikus tÀidab. Sellise failide komplekti nimetatakse Helm chart'iks. Helm'i konsoolikliendile saab selle edastada kolme viisi:
- nÀidata ƥablonite kausta;
- pakendada .tar arhiivi ja viidata sellele;
- asetage mall template kaugserverisse ja lisage link repositooriumisse Helm kliendis.
Me vajame ka vÀÀrtuste faili â values.yaml. Sealt olevad andmed asendatakse mallis. Loome selle ka.

Helm 2. versioonis on lisaks serverirakendus â Tiller. See asub vĂ€ljaspool Kubernetes'i ja ootab pĂ€ringuid Helm kliendilt ning kutsudes asendab vajalikud vÀÀrtused mallis ja saadab need Kubernetes'i.

Helm 3 on lihtsam: selle asemel, et töödelda malle serveris, töödeldakse teavet nĂŒĂŒd tĂ€ielikult Helm kliendi poolel ja saadetakse otse Kubernetes API-le. See lihtsustus suurendab klasteri turvalisust ja lihtsustab juurutamise protsessi.
Kuidas see kÔik töötab
KÀivitame kÀsu helm install. NÀitame rakenduse vÀlja nime, anname teed values.yaml failini. LÔpus nÀitame repositooriumi, kus chart asub, ja charti nime. NÀiteks on see «lmru» ja «bestchart» vastavalt.
helm install --name bestapp --values values.yaml lmru/bestchart
KĂ€sku saab teostada ainult ĂŒks kord, korduv tĂ€itmine asendab install peaks kasutama uuenda. Lihtsuse huvides vĂ”ite kahte kĂ€sku asendada kĂ€suga uuenda tĂ€iendava vĂ”tmega --install. Esimese kĂ€ivitamise korral saadab Helm kĂ€su versiooni installimiseks ja seejĂ€rel uuendab seda.
helm upgrade --install bestapp --values values.yaml lmru/bestchart
Uute versioonide rakendamise takistused Helmiga
Selles loo osas mÀngin ma saaliga mÀngu "Kes tahab saada miljonÀriks" ja me selgitame vÀlja, kuidas sundida Helmi rakenduse versiooni uuendama. .
Kui uurisin Helmi toimimist, ĂŒllatas mind kummaline kĂ€itumine rakenduste kĂ€ivitatud versioonide uuendamisel. Rakenduse koodi uuendasin, Docker registry's laadisin uue pildi ĂŒles, saatsin kĂ€su juurutamiseks â ja midagi ei juhtunud. Allpool on mĂ”ned mitte eriti hĂ€sti Ă”nnestunud viisid rakenduste uuendamiseks. IgaĂŒhe pĂ”hjalikum uurimine aitab mĂ”ista tööriista sisemist ĂŒlesehitust ja sellise mitte ilmselge kĂ€itumise pĂ”hjuseid.
Meetod 1. Mitte muuta teavet alates viimati kÀivitamisest
Kuidas öeldakse Helm, "Kubernetesi graafikud vĂ”ivad olla suured ja keerulised, seetĂ”ttu pĂŒĂŒab Helm mitte segada">. Seega, kui uuendada rakenduse viimase versiooni pilt docker registry's ja kĂ€ivitada kĂ€sk. helm upgrade, siis ei juhtu midagi. Helm arvab, et mitte midagi ei ole muutunud ja ei saada Kubernetes'e kĂ€su rakenduse vĂ€rskendamiseks.
Siin ja edaspidi on silt latest esitatud vaid nÀitena. Selle sildi mÀÀramisel laadib Kubernetes iga kord pildi docker registreerimisest, sÔltumata parameetrist imagePullPolicy. Latest'i kasutamine tootmises ei ole soovitatav ja vÔib pÔhjustada kÔrvaltoimeid.
Meetod 2. VĂ€rskenda LABEL'i pildis
Nagu on kirjutatud samas , «Helm vÀrskendab rakendust ainult siis, kui see on viimase vÀljaande ajast alates muutunud». Loogiline variant selle jaoks oleks LABEL'i mÀrgi vÀrskendamine otseselt docker-pildis. Siiski ei vaata Helm rakenduse pilte sisse ega tea nende muudatustest midagi. Seega ei saa Helm pilti tÀhistades neist teadlikuks, ja kÀsk rakenduse vÀrskendamiseks Kubernetes'e ei vÀljastata.
Meetod 3. Kasuta vÔtit --force

Oleme juhtumid ja otsime vajalikku vÔtit. KÔige rohkem sobib tÀhenduse poolest vÔti --force. Kuigi nimi on ise rÀÀkiv, erineb kÀitumine ootusest. Selle asemel, et rakendust sunduuendada, on selle tegelik eesmÀrk taastada FAILED seisundis olev vÀljaanne. Kui seda vÔtit ei kasutata, tuleb kÀsud jÀrjestikku tÀita. helm delete && helm install --replace. Selle asemel on soovitatav kasutada vÔtit --force, mis automatiseerib nende kÀskude jÀrjestikuse tÀitmise. Rohkem teavet leiate sellest . Kahjuks ei sobi see vÔti, et öelda Helmile rakenduse versiooni ikkagi uuendada.
Viis 4. Muuda etikette otse Kuberneteses

Etiketi otse muutmine klastris kÀsu abil kubectl edit on halb mÔte. See tegevus toob kaasa teabe vastuolulisuse töötava rakenduse ja selle vahel, mis algselt saadeti juurutamiseks. Sellisel juhul erineb Helmi kÀitumine juurutamisel oma versioonist: Helm 2 ei tee midagi, samas kui Helm 3 juurutab uue rakenduse versiooni. Probleemi mÔistmiseks on oluline mÔista, kuidas Helm töötab.
Kuidas Helm töötab
Et mÀÀrata, kas rakendus on muutunud alates viimase vÀljaande versioonist, vÔib Helm kasutusele vÔtta:
- Kubernetes'is kÀimasoleva rakendusega;
- uus values.yaml ja аĐșŃŃалŃĐœŃĐč ŃаŃŃ;
- Helmi sisemise teabega versioonide kohta.
Karmeim uurija: kus Helm salvestab sisemise teabe versioonide kohta?KÀivitades kÀsu helm history, saame kogu teabe versioonide kohta, mis on Helmi abil installitud.

Lisaks on saadaval ĂŒksikasjalik teave saadetud malli ja vÀÀrtuste kohta. Saame neid kĂŒsida:

Teises versioonis asub see teave samas nimede ruumis, kus Tiller töötab (vaikimisi - kube-system), ConfigMap'is, mis on mÀrgitud tunnusega «OWNER=TILLER»:

Kolmanda versiooni ilmumisel kolis teave saladustesse, jÀÀdes samasse nimede ruumi, kus rakendus töötab. See vÔimaldas korraga kÀivitada mitu rakendust erinevates nimede ruumides, millel on sama versiooni nimi. Teises versioonis oli see suur peavalu, kuna nimede ruumid olid eraldatud, kuid said omavahel mÔjutada.

Teine Helm, pĂŒĂŒdes mĂ”ista, kas uuendust on vaja, kasutab ainult kahte teabeallikat: seda, mida talle praegu pakutakse, ja sisemist teavet versioonide kohta, mis asub ConfigMap'is.

Kolmas Helm kasutab kolme suuna ĂŒhinemise strateegiat: lisaks sellele, millele ta tĂ€helepanu pöörab, arvestab ta ka rakendust, mis töötab praegu Kuberneteses.

Sel pÔhjusel ei tee vana versioon Helm midagi, kuna ta ei arvesta klastris oleva rakenduse teavet, kuid Helm 3 saab muudatused ja saadab uue rakenduse juurutamiseks.
Viis: Kasuta vĂ”tit ârecreate-pods
VĂ”tme abil --recreate-pods saab saavutada selle, mida algselt plaaniti saavutada vĂ”tmega --force. Konteinerid taaskĂ€ivituvad ja vastavalt imagePullPolicy: Always poliitikale, mis on seotud latest sildiga (selle kohta on mainitud eespool), laadib Kubernetes alla ja kĂ€ivitab uue pildi versiooni. Seda tehakse mitte kĂ”ige paremal viisil: arvestamata juurutamise StrategyTypeâit, lĂŒlitab ta jĂ€rsult vĂ€lja kĂ”ik vana rakenduse instantsid ja hakkab kĂ€ivitama uusi. TaaskĂ€ivitamise ajal ei tööta sĂŒsteem, kasutajad kannatavad.
Samas esines Kuberneteses sarnane probleem pikka aega. Ja voilà , neli aastat pÀrast probleemi avastamist , probleem on lahendatud ja alates Kubernetes 1.15 versioonist on olemas vÔimalus podide rolling-restartiks.
Helm lihtsalt lukustab kÔik rakendused ja kÀivitab kÔrval uusi konteinerite. Toote keskkonnas ei tohi seda teha, et mitte pÔhjustada rakenduse seiskumist. Sellist kÀitumist on vaja ainult arenduse eesmÀrkidel ning seda vÔib teha ainult stseenikeskkondades.
Kuidas uuendada rakenduse versiooni Helmiga?
Muudame vÀÀrtusi, mis saadetakse Helmile. Reeglina on need vÀÀrtused, mis asendavad pildi sildi. Kui tegemist on 'latest' sildiga, mida sageli kasutatakse tootmises, siis on muudetav teave annotatsioon, mis Kubernetes'i jaoks on kasutu, kuid Helmile signaal uuendada rakendust. Annotatsiooni vÀÀrtuse tÀitmise variandid:
- Juhuslik vÀÀrtus standardse funktsiooni abil â
{{ randAlphaNum 6 }}.
On ĂŒks nĂŒanss: iga kord, kui rakendatakse seda muudatuste mÀÀratlemise charti, on annotatsiooni vÀÀrtus ainulaadne ning Helm arvab, et muudatusi on toimunud. Seega kĂ€ivitame rakenduse alati uuesti, isegi kui me ei ole selle versiooni muutnud. See ei ole kriitiline, kuna seisakut ei toimu, aga siiski ebameeldiv. - Sisestada praegune kuupĂ€ev ja kellaaeg â
{{ .Release.Date }}.
Variant on juhuslik vÀÀrtus pidevalt unikaalse muutujaga. - Ăigem viis on kasutada kontrollsummasid. See on SHA pildi vĂ”i viimase git commit'i SHA â
{{ .Values.sha }}.
Need tuleb arvutada ja saata Helm kliendile kutsujapoolel, nÀiteks Jenkinsis. Kui rakendus muutub, muutub ka kontrollsumma. SeetÔttu uuendab Helm rakendust ainult siis, kui on vajalik.
KokkuvÔtteks meie katsetest
- Helm teeb muudatused vÔimalikult vÀhe invasiivselt, seega ei too rakenduse pildi tasemel muudatus Docker Registry's kaasa uuendamist: pÀrast kÀsu tÀitmist ei toimu midagi.
- Ala
--forcekasutatakse probleemsete vÀljalaskude taastamiseks ja ei ole seotud sunduuendamisega. - Ala
--recreate-podssunduuendab rakendusi, kuid teeb seda rĂŒĂŒstamise viisil: kustutab kĂ”ik konteinerid jĂ€rsult. See kahjustab kasutajaid, seda ei tohiks tootmises teha. - Otseselt muudatusi Kubernetese klastrisse kĂ€su
kubectl editteha ei tohi: rikume jĂ€rjepidevust ja kĂ€itumine sĂ”ltub Helm'i versioonist. - Uue Helm versiooni ilmumisega on tulnud palju nĂŒansse. Helm'i repostiitursis olevad kĂŒsimused on selgelt sĂ”nastatud ja aitavad ĂŒksikasjadest aru saada.
- Muudetava annotatsiooni lisamine chart'ile muudab selle paindlikumaks. See vÔimaldab rakendust Ôigesti juurutada ilma seisakuteta.
MĂ”te, mida vĂ”iks nimetada 'rahuks kogu maailmas', toimib igas elu valdkonnas: loe juhendit enne kasutamist, mitte pĂ€rast. Ainult tĂ€ieliku teabe omandamisega on vĂ”imalik ehitada usaldusvÀÀrseid sĂŒsteeme ja muuta kasutajad Ă”nnelikuks.
Teemaga seotud muud lingid:
See ettekannet kĂ”las esmakordselt Mail.ru Cloud Solutions esitlus. Vaadake teisi ettekandeid ja tellige ĂŒrituste teateid Telegramis .
Allikas: habr.com
