Toimus see, mida me (ja mitte ainult meie) oleme kaua oodanud: , meie avatud lĂ€htekoodiga tööriist rakenduste koostamiseks ja nende edastamiseks Kubernetesesse toetab nĂŒĂŒd muudatuste rakendamist 3-way-merge-patchide abil! Lisaks on nĂŒĂŒd vĂ”imalik olemasolevate K8s-resursside vĂ”tmine Helm-releasidesse ilma nende ressursside uuesti loomata.

LĂŒhidalt öeldes, seadistame WERF_THREE_WAY_MERGE=enabled â saame ânagu kubectl applyâ, mis on ĂŒhilduv olemasolevate Helm 2 installatsioonidega ja isegi veidi rohkem.
Aga alustame teooriast: mis on 3-way-merge-patchid, kuidas inimesed on jĂ”udnud selle lĂ€henemiseni ja miks need on olulised CI/CD-protsessides, mis pĂ”hinevad Kubernetesel? SeejĂ€rel vaatame, mis on 3-way-merge werfis, milliseid reĆŸiime kasutatakse vaikimisi ja kuidas sellega hallata.
Mis on 3-way-merge-patch?
Seega alustame ressursside vĂ€ljastamise ĂŒlesandest, mis on kirjeldatud YAML-manifestides Kuberneteses.
Kubernetes API pakub ressursside haldamiseks selliseid pÔhitegevusi nagu create, patch, replace ja delete. Eeldatakse, et nende abil tuleb luua mugav jÀrjepidev ressursside vÀljastamine klastrisse. Kuidas?
Implisiitilised kubectl kÀsklused
Esimene lÀhenemine Kubernetesese objektide haldamiseks on implitseeritud kubectl kÀskluste kasutamine nende objektide loomiseks, muutmiseks ja kustutamiseks. Lihtsalt öeldes:
- kÀsklusega
kubectl runsaab kÀivitada Deploymenti vÔi Töö:kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE - kÀsklusega
kubectl scaleâ muuta repliikide arvu:kubectl scale --replicas=3 deployment/mysql - jne.
See lÀhenemine vÔib esialgu tunduda mugav. Kuid on probleeme:
- Seda on raske automatiseerida.
- Kuidas peegeldada konfiguratsioonis Git'is? Kuidas teha ĂŒlevaadet muudatustest, mis toimuvad klastris?
- Kuidas tagada konfiguratsiooni korduvus taaskÀivitamisel?
- âŠ
On selge, et selline lĂ€henemine ei sobi hĂ€sti koos rakenduse koodiga ja infrastruktuurina koodina (IaC; vĂ”i isegi nagu tĂ€napĂ€evane variant, mis saavutanud populaarsust Kubernetes-ökosĂŒsteemis). SeetĂ”ttu ei saanud need kĂ€sklused kubectl-s edasist arengut.
Tegevused create, get, replace ja delete
Esialgse loomisega on kÔik lihtne: saadame manifesti kube API operatsiooni ja ressurss on loodud. YAML-esitus manifestist saab hoida Git'is ning loomise jaoks kasutada kÀsku create kubectl create -f manifest.yaml kustutamine.
A on samuti lihtne: asendame sama manifest.yaml Git'ist kÀsus kubectl delete -f manifest.yaml kubectl delete -f manifest.yaml.
Tehe replace vĂ”imaldab tĂ€ielikult asendada ressursi konfiguratsiooni uuega, ilma et oleks vaja ressursi uuesti luua. See tĂ€hendab, et enne muudatuste tegemist ressursil on mĂ”istlik kĂŒsida praegust versiooni operatsiooniga get, muuta see ja uuendada operatsiooniga replace. Kube API serverisse on sisse ehitatud ja, kui objekti pĂ€rast operatsiooni get olek muutub, siis operatsioon replace ei Ă”nnestu.
Kuna konfiguratsiooni tuleb salvestada Git'i ja uuendada kasutades replace'i, tuleb teha operatsioon get, sulandada konfigureerimine Git'ist saadud andmetega ning teostada replace. Kubectl vĂ”imaldab vaid kasutada kĂ€sku kubectl replace -f manifest.yaml, kus Git'ist kĂ€sus â juba tĂ€ielikult ette valmistatud (meie puhul â sulandatud) manifest, mille tuleb installida. Tulemuseks on see, et kasutajal tuleb implementeerida manifestide sulandumine, mis pole sugugi triviaalneâŠ
Samuti on oluline mĂ€rkida, et kuigi Git'ist kĂ€sus see on salvestatud Git'i, ei saa me ette teada, kas objekt tuleb luua vĂ”i uuendada â seda peab tegema kasutaja tarkvara.
KokkuvÔtteks: Kas saame ehitada pideva vÀljalaset ainult create, replace ja delete abil, tagades infrastruktuuri konfiguratsiooni salvestamise Git'isse koos koodiga ning mugava CI/CD?
PĂ”himĂ”tteliselt saame⊠Selleks on vaja teostada manifestide sulandumise operatsioon ja mingi ĂŒmberprojekteerimine, mis:
- kontrollib objekti olemasolu klastris,
- teostab objekti esialgse loomise,
- uuendab vÔi kustutab selle.
Uuendamisel tuleb arvesse vĂ”tta, et ressurss on vĂ”inud muutuda alates viimast get ja automaatselt kĂ€ituda optimistliku lukustuse olukorras â teha uuendamise katseid.
Kuid miks leiutada jalgratast, kui kube-apiserver pakub teistsugust viisi ressursside uuendamiseks: operatsiooni patch, mis vabastab kasutajat mÔnedest eespool kirjeldatud probleemidest?
Patch
NĂŒĂŒd oleme jĂ”udnud patĆĄide juurde.
Patƥid on peamine viis rakenduste muudatuste tegemiseks olemasolevatele objektidele Kuberneteses. Operatsioon patch töötleb nii, et:
- kube-apiserveri kasutajal on vaja saata patƥ JSON-vormingus ja nÀidata objekti,
- ja api server mÔistab ise objekti praegust seisu ning viib selle nÔutud olekusse.
Optimistlik lukustus ei ole sel juhul vajalik. See operatsioon on dekreetiivsem vÔrreldes replace'iga, kuigi alguses vÔib see tunduda vastupidine.
Seega:
- kasutades operatsiooni
createloome objekti Gitâi manifestist, - kasutades
deleteâ eemaldame, kui objekt ei ole enam vajalik, - kasutades
patchâ muudame objekti, viies selle Git'is kirjeldatud olekusse.
Kuid selleks, et seda teha, on vajalik luua Ôige patch!
Kuidas Helm 2 patchid töötavad: 2-way-merge
Helmi vÀlja esmakordsel installimisel toimub create chart'i ressursside jaoks.
Helmi vÀlja vÀrskendamisel iga ressursi jaoks:
- loob patchi eelneva chart'i ressursi versiooni ja praeguse chart'i versiooni vahel,
- rakendab selle patchi.
Seda patchi nimetatakse 2-way-merge patch, kuna selle loomisel osaleb 2 manifesti:
- eelneva vÀlja ressursi manifest,
- praeguse ressursi manifest.
Kustutamise korral toimub operatsioon delete kube apiserveris, mis kutsub esile ressursid, mis olid kuulutatud eelnevas versioonis, kuid ei ole kuulutatud praeguses.
2-way-merge patch lĂ€henemine omab probleemi: see viib ressursi tegeliku oleku ja Git'i manifesti desĂŒnkroniseerimiseni..
Probleemi illustreerimine nÀite abil
- Git'is, chart'is on manifest, mille vÀli
imageDeployment'il on vÀÀrtusubuntu:18.04. - Kasutaja on
kubectl editmuutnud selle vÀlja vÀÀrtustubuntu:19.04. - Helmi chart'i uuesti vÀljalaskmisel ei genereeri patchi, kuna vÀli
imageeelneva versiooni vabanemises ja praeguses chart'is on identsed. - PÀrast uuesti vÀljalaset jÀÀb
image, kuigi chart'is on kirjasubuntu:19.04Oleme saanud desĂŒnkroniseerimise ja kaotanud deklaratiivsuse.ubuntu:18.04.
Mis on sĂŒnkroniseeritud ressurs?
tÀielik
Ăldiselt vastavus töötava klastri ressursi manifesti ja Git'ist saadud manifesti vahel on vĂ”imatu. Kuna tegelikus manifestis vĂ”ivad olla teenuse annotatsioonid/kleebised, tĂ€iendavad konteinerid ja muud andmed, mida mĂ”ni kontrollija dĂŒnaamiliselt ressurssi lisab ja eemaldab. Me ei saa ja ei soovi neid andmeid Git'is hoida. Siiski tahame, et vĂ€ljalaske korral vÀÀrtustavad need vĂ€lja, mida me selgelt Git'is mÀÀratlesime, vastavaid vÀÀrtusi. Tekib selline ĂŒldine
sĂŒnkroniseeritud ressursi reegel : ressursi vĂ€ljalaskmisel vĂ”ib muutuda vĂ”i kustuda ainult need vĂ€ljad, mis on selgelt mÀÀratletud Git'i manifestis (vĂ”i olid mÀÀratletud eelnevas versioonis ja nĂŒĂŒd eemaldatud).3-way-merge patch
: genereerib patchi viimase rakendatud manifesti versiooni ja sihitud manifesti versiooni vahel, arvestades praegust töötava klastri manifesti versiooni. LĂ”pptulemus peab vastama sĂŒnkroniseeritud ressursi reeglile:
PÔhimÔte uusid vÀlju, mis on lisatud sihitud versioonile, lisatakse patchi abil;
- Uued vÀljaanded, mis on lisatud sihtversiooni, lisatakse patch'i kaudu;
- Eelmised vÀljaandmed, mis ei ole olemas sihtversioonis, nullitakse viimase rakendatud versiooni abil patchi kaudu;
- Praeguseid objekti vÀlju, mis erinevad sihtversioonist, uuendatakse patchi kaudu.
Just selle pÔhimÔtte kohaselt genereeritakse patƥe. kubectl apply:
- Viimane rakendatud versioon sÀilitatakse objekti enda annotatsioonis,
- sihtversioon vÔetakse mÀÀratud YAML-failist,
- praegune versioon on töötavast klastrist.
NĂŒĂŒd, kui oleme teooria selgeks teinud, on aeg rÀÀkida, mida me werf-is tegime.
Muudatuste rakendamine werf-is
Varem kasutas werf, nagu ka Helm 2, 2-way-merge patĆĄe.
Repair patch
Et liikuda uue patĆĄi tĂŒĂŒbi â 3-way-merge â juurde, on esimene samm sisse viia nn repair-patchid..
Deployimise ajal kasutatakse standardset 2-way-merge patĆĄi, kuid werf genereerib lisaks sellise patĆĄi, mis sĂŒnkroniseerib ressursi reaalse seisundi sellega, mis on kirjutatud Git-i (see patĆĄ luuakse ĂŒlesande sĂŒnkroniseeritud ressursi reeglite jĂ€rgi, nagu eespool kirjeldatud).
SĂŒnkroonimise probleemi korral saab kasutaja deployimise lĂ”puks WARNING-i koos vastava sĂ”numi ja patĆĄiga, mida tuleb rakendada, et tuua ressurss sĂŒnkroniseeritud seisu. Samuti salvestatakse see patĆĄ spetsiaalsesse annotatsiooni werf.io/repair-patch. Eeldatakse, et kasutaja rakendab selle patĆĄi kĂ€sitsi: kasutaja rakendab selle patĆĄi: werf ei rakenda seda pĂ”himĂ”tteliselt.
Repair-patchide genereerimine on ajutine meetod, mis vĂ”imaldab proovida 3-way-merge pĂ”himĂ”ttel patĆĄide loomist, kuid neid patĆĄe ei rakendata automaatselt. Praegu on see tööreĆŸiim vaikimisi sisse lĂŒlitatud.
3-way-merge patch ainult uutele vÀljaannetele
Alates 1. detsembrist 2019 hakkavad werf-i beetaversioonid ja alpha-versioonid vaikimisi kÀsitlema tÀielikult 3-way-merge patƥe muudatuste rakendamiseks ainult uute Helm-i vÀljaannetega, mis vÀljastatakse lÀbi werf. Juba olemasolevad vÀljaanded jÀtkavad 2-way-merge + repair-patƥide lÀhenemise kasutamist.
Seda tööreĆŸiimi saab selgesĂ”naliselt lubada seadistusega WERF_THREE_WAY_MERGE_MODE=onlyNewReleases juba praegu.
MĂ€rkus: see funktsioon ilmus werf-is mitme vĂ€ljaande jooksul: alpha-kanalis oli see valmis versiooniga , ja beetakanalis â versiooniga .
3-way-merge patch kÔikide vÀljaannete jaoks
Alates 15. detsembrist 2019 hakkavad werf'i beetaversioonid ja alphasid vaikimisi kasutama tÀielikke 3-way-merge-patch'e muudatuste rakendamiseks kÔigis vÀljaannetes.
Seda tööreĆŸiimi saab selgesĂ”naliselt lubada seadistusega WERF_THREE_WAY_MERGE_MODE=enabled juba praegu.
Kuidas on lood ressursside automaatse skaleerimisega?
Kuberneteses on kaks tĂŒĂŒpi automaatset skaleerimist: HPA (horisontaalne) ja VPA (vertikaalne).
Horisontaalne skaleerimine valib automaatselt koopiate arvu, vertikaalne â ressursside arvu. Nii koopiate arv kui ka ressursside nĂ”udmised on mÀÀratud ressursi manifestis (vt. spec.replicas vĂ”i spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory ja ).
Probleem: kui kasutaja konfigureerib ressursi chart'is nii, et seal on mÀÀratud kindlad ressursi vÔi koopiate vÀÀrtused ja sellele ressursile on lubatud automaatne skaleerimine, siis iga werf'i juurutamisega taastatakse need vÀÀrtused selliseks, nagu need on mÀÀratud chart'i manifestis.
Probleemi lahendamiseks on kaks vÔimalust. Esiteks on parem loobuda automaatsete vÀÀrtuste selgesÔnalisest mÀÀratlemisest chart'i manifestis. Kui see valik mingil pÔhjusel ei sobi (nÀiteks seetÔttu, et chart'is on mugav seada algseid ressursi piiranguid ja koopiate arvu), pakub werf jÀrgmisi annotatsioone:
-
werf.io/set-replicas-only-on-creation=true -
werf.io/set-resources-only-on-creation=true
Kui selline annotatsioon on olemas, ei lÀhtestata werf vastavaid vÀÀrtusi iga juurutamise ajal, vaid seadistatakse need ainult ressursi esmakordsel loomisel.
Lisateabe jaoks vt projekti dokumentatsioonist ja .
Keelata 3-way-merge patch'i kasutamine
Kasutaja saab praegu keelata uusimate patch'ide kasutamise werf'is keskkonnamuutuja abil WERF_THREE_WAY_MERGE_MODE=disabled. Kuid alates 1. mÀrtsist 2020 kaotab see keeld kehtivuse ja vÔimalik on kasutada ainult 3-way-merge-patch'e.
Ressursside vastuvÔtmine werf'is
3-way-merge-patch'ide muutmisviisi omaksvÔtmine vÔimaldas meil kohe rakendada sellist funktsiooni nagu klastris olemasolevate ressursside vastuvÔtmine Helm'i vÀljaande.
Helm 2-l on probleem: ei saa lisada chart'i manifestidesse ressurssi, mis juba eksisteerib klastris, ilma seda ressurssi tÀiesti uuesti loomata (vt. , ). Oleme Ôpetanud werf'i aktsepteerima olemasolevaid ressursse vÀljaandes. Selleks tuleb seadistada klastris töötava ressursi praegusele versioonile annotatsioon (nÀiteks koos kubectl edit):
"werf.io/allow-adoption-by-release": RELEASE_NAMENĂŒĂŒd tuleb ressurss kirjeldada chart'is ja jĂ€rgmisel korral, kui werf'iga versioon juurutatakse, vĂ”etakse olemasolev ressurss sellesse versiooni vastu ning jÀÀb selle haldusse. Veelgi enam, ressurssi versiooni vastuvĂ”tmise protsessis viib werf tööklastri praeguse oleku chart'is kirjeldatud olekusse, kasutades samu 3-way-merge-patch'e ja sĂŒnkroniseeritud ressursi reeglit.
MĂ€rkus: seadistus WERF_THREE_WAY_MERGE_MODE ei mĂ”juta ressursside vastuvĂ”ttu â vastuvĂ”tu korral kasutatakse alati 3-way-merge-patch'i.
Detailid â .
JĂ€reldused ja tulevikuplaanid
Loodan, et pĂ€rast seda artiklit on selgem, mis on 3-way-merge-patch'id ja miks nendeni jĂ”uti. Praktikas werf projekti arendamise mĂ”ttes on nende rakendamine veel ĂŒks samm Helm'i sarnase juurutuse tĂ€iustamise teel. NĂŒĂŒd saab unustada konfigureerimise sĂŒnkroonimise probleemid, mis sageli tekkisid Helm 2 kasutamise ajal. Samuti on lisatud uus kasulik funktsioon juba saadud Kubernetes-resursside vastuvĂ”tu (adoption) jaoks Helm versioonis.
Helm'i sarnases juurutuses on siiski alles mÔned probleemid ja raskused, nagu Go-mallide kasutamine, ning me jÀtkame nende lahendamist.
Teavet ressursside uuendamise meetodite ja vastuvÔtu kohta leiab samuti .
Helm 3
Erilist tĂ€helepanu vÀÀrib sel nĂ€dalal uus peamine versioon Helm â v3, â mis kasutab samuti 3-way-merge-patch'e ja vabaneb Tiller'ist. Uus versioon Helm nĂ”uab juba olemasolevate paigalduste konverteerimist uue versiooni salvestusformaadi jaoks.
Werf on oma osa pealt juba loobunud Tiller'i kasutamisest, lĂŒlitunud 3-way-merge peale ja lisanud , olles samal ajal ĂŒhilduv juba olemasolevate Helm 2 paigaldustega (migratsiooniskeeme ei ole vaja kĂ€ivitada). Seega, kuni werf ei ole lĂŒlitatud Helm 3 peale, ei kaota werf kasutajad olulisi eeliseid, mida Helm 3 pakub vĂ”rreldes Helm 2-ga (samuti on need werf'is olemas).
Kuid werf'i ĂŒleminek Helm 3 koodibaasile on vĂ€ltimatu ja toimub lĂ€hitulevikus. Eeldatavasti on see werf 1.1 vĂ”i werf 1.2 (praegu on werf'i peamine versioon â 1.0; lisainfot werf'i versioonihaldusest leiate ). Selle aja jooksul jĂ”uab Helm 3 stabiliseeruda.
P.S.
Lugege ka meie blogist:
- Uuenduste mĂ€rkmete tsĂŒkkel werf-is:
- «»;
- «»;
- «».
- «»;
- «»;
- «».
Allikas: habr.com
