Juhtus see, mida me (ja mitte ainult meie) pikalt ootasime: , meie Open Source-i tööriist rakenduste ehitamiseks ja nende toimetamiseks Kubernetesesse toetab nĂŒĂŒd muudatuste rakendamist 3-way-merge-patchide abil! Lisaks on tekkinud vĂ”imalus olemasolevate K8s-resursside edastamise viimine Helm-release'idesse ilma nende ressursside uuesti loomata.

LĂŒhidalt öeldes, paneme WERF_THREE_WAY_MERGE=enabled â saame deploida "nagu kubectl apply", mis on ĂŒhilduv olemasolevate Helm 2 installatsioonidega ja isegi natuke rohkem.
Aga alustame teooriast: mis on 3-way-merge-patchid, kuidas inimesed jĂ”udsid nende genereerimise lĂ€henemiseni ja miks need on olulised CI/CD protsessides, mille infrastruktuuri baasiks on Kubernetes? PĂ€rast seda vaatame, mis 3-way-merge werf'is endast kujutab, milliseid reĆŸiime vaikimisi kasutatakse ja kuidas sellega juhtida.
Mis on 3-way-merge-patch?
Alustame Kubernetesesse YAML-manifestide kaudu ressurside juurutamise ĂŒlesandega.
Kubernetes API abil on sellised pÔhitoimingud nagu create, patch, replace ja delete. Eeldatakse, et nende abil tuleb luua mugav pidev ressursside juurutamine klastrisse. Kuidas?
Imperatiivsed kommandod kubectl
Esimene lÀhenemine Kubernetes'e objektide haldamisele on imperatiivsete kubectl kÀskude kasutamine nende objektide loomiseks, muutmiseks ja kustutamiseks. Lihtsalt öeldes:
- kÀsku
kubectl runsaab kÀivitada Deploymenti vÔi Töö:kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE - kÀsku
kubectl scaleâ muuda replikate arvu:kubectl scale --replicas=3 deployment/mysql - Kui kaua aega kulub vĂ€ljastamiseks?
See lÀhenemine vÔib alguses tunduda mugav. Kuid probleeme on:
- Sellel on raske saab automatiseerida.
- Kuidas peegeldada konfiguratsiooni Git'is? Kuidas teha muudatuste ĂŒlevaatamist, mis toimuvad klastris?
- Kuidas tagada uuendatavus konfiguratsioonide jÀrjepidevus taaskÀivitamisel?
- âŠ
On selge, et see lĂ€henemine ei sobi hĂ€sti koos rakenduse koodi ja infrastruktuuri koodina salvestamisega (IaC; vĂ”i isegi nagu kaasaegsem variant, mis saab populaarsust Kubernetes'i ökosĂŒsteemis). SeetĂ”ttu ei saanud need kĂ€sklused kubectl-s edasist arengut.
Toimingud create, get, replace ja delete
Esmaste loomise juhul on kÔik lihtne: saadame manifesti create kube API-sse ja ressurss on loodud. YAML-esitus manifestist saab salvestada Git'i ja loomise jaoks kasutada kÀsku kubectl create -f manifest.yaml.
C kustutamine on samuti lihtne: sisestame sama manifest.yaml Git'ist kÀsku kubectl delete -f manifest.yaml.
Operatsioon asenda vĂ”imaldab tĂ€ielikult asendada ressursi konfiguratsiooni uuega, ilma et ressursi uuesti looma peaks. See tĂ€hendab, et enne ressursi muutmist on loogiline kĂŒsida praegust versiooni toimingu get, muuta see ja uuendada toiminguga asenda. Kube apiserveris on sisse ehitatud ja kui pĂ€rast toimingut get objekt on muutunud, siis toiming asenda ei toimi.
Et salvestada konfiguratsioon Git'is ja uuendada seda replace kaudu, tuleb teha toiming get, liita Git'i konfiig sellega, mida me saime, ja teha asenda. Vaikimisi vĂ”imaldab kubectl kasutada ainult kĂ€sku kubectl replace -f manifest.yaml, kus manifest.yaml â juba tĂ€ielikult ettevalmistatud (meie puhul â ĂŒhendatud) manifest, mille nĂ”utakse paigaldus. Seega peab kasutaja rakendama manifestide ĂŒhinemist, mis on keeruline ĂŒlesanne ...
Samuti tasub mĂ€rkida, et kuigi manifest.yaml salvestatakse Git'is, ei saa me ette teada, kas on vajalik objekti loomine vĂ”i uuendamine â selle peab tegema kasutaja tarkvara.
Kokku: Kas saame ehitada pideva juurutamise ainult create, replace ja delete kaudu, tagades infrastruktuuri konfiguratsiooni salvestamise Git'is koos koodiga ja mugava CI/CD-ga?
PĂ”himĂ”tteliselt saame⊠Selleks peab olema rakendatud manifestide ĂŒhendamise operatsioon ja mingi ĂŒmbrus, mis:
- kontrollib objekti olemasolu klastris,
- teeb esialgse ressursi loomise,
- uuendab vÔi kustutab selle.
Uuendamisel tuleb arvestada, et ressurss vĂ”is olla muutunud viimase get ja automaatselt kĂ€sitleda optimistliku lukustuse juhtumit â teha korduvad uuendamise katsetused.
Kuid miks leiutada ratast, kui kube-apiserver pakub teisi vahendeid ressursside uuendamiseks: toimingu patch, mis vabastab kasutaja osadest kirjeldatud probleemidest?
Patch
NĂŒĂŒd olemegi jĂ”udnud patĆĄideni.
Patƥid on peamine viis muudatuste rakendamiseks olemasolevatele objektidele Kuberneteses. Toiming patch töötavad nii, et:
- kasutaja kube-apiserver peab saatma patƥi JSON-vormingus ja nÀitama objekti,
- samuti apiserver mÔistab objekti praegust seisundit ja viib selle soovitud kujule.
Sellisel juhul ei ole optimistlik lukustus vajalik. See operatsioon on deklaratiivsem vÔrreldes replace'iga, kuigi alguses vÔidakse tunduda vastupidi.
Seega:
- toimingu abil
createloome objekti Git'i manifesti pÔhjal, - kasutades
kustutaâ kustutame, kui objekti enam ei vajata, - kasutades
patchâ muudame objekti, viies selle kujule, mis on kirja pandud Git'is.
Kuid selleks, et seda teha, on vajalik luua Ôige patƥ!
Kuidas töötavad Helm 2 patch'id: 2-way-merge
Helmi versiooni esmakordsel installimisel teeb Helm toimingu create chart'i ressurside jaoks.
Versiooni uuendamise puhul teeb Helm iga ressursi jaoks:
- vÔrdleb eelmise chart'i ressursi versiooni ja praeguse chart'i versiooni vahel olevat patch'i,
- rakendab selle patch'i.
Seda patch'i nimetame 2-way-merge patch, kuna selle loomises osalevad 2 manifesti:
- eelneva versiooni ressursi manifest,
- praeguse ressursi manifest.
Kustutamisel toimub toiming kustuta kube apiserveris ressurside jaoks, mis olid eelmises versioonis deklareeritud, kuid ei ole praeguses.
2-way merge patch lĂ€henemisviisil on probleem: see toob kaasa ressursi tegeliku seisundi ja manifesti vahelise mittesĂŒnkroonimise Git'is.
Probleemi illustreerimine nÀite abil
- Git'is, chart'is on manifest, mille vÀli
piltDeployment'il on vÀÀrtusubuntu:18.04. - Kasutaja on lÀbi
kubectl editmuutanud selle vÀlja vÀÀrtuseksubuntu:19.04. - Helm'i chart'i kordusel ei genereerita patch'i , sest vÀlieelmises versioonis ja praeguses chart'is on samad.
piltPĂ€rast korduvat deploimentimist - PĂ€rast korduvat juurutamist
piltjÀÀb allesubuntu:19.04, kuigi chart'is on kirjutatudubuntu:18.04.
Oleme saanud mittesĂŒnkroonimise ja kaotanud deklaratiivsuse.
Mis on sĂŒnkroonitud ressurss?
Ăldiselt peab tĂ€ielik vastavus toimiva klastriga ressurssi manifesti ja Git'ist saadud manifesti vahel on vĂ”imatu saavutada. Sest tegelikus manifestis vĂ”ivad olla teenuse annotatsioonid / sildid, lisakonteinerid ja muud andmed, mille dĂŒnaamiliselt lisavad ja eemaldavad mĂ”ned kontrollijad. Need andmed ei saa ja me ei soovi neid hoida Git'is. Siiski soovime, et nende vĂ€ljade vÀÀrtused, mille oleme selgelt Git'is mÀÀranud, vastaksid.
Saades seejĂ€rel selline ĂŒldine sĂŒnkroonitud ressursi reegel: ressursi vĂ€lja kĂ€imisel vĂ”ib muuta vĂ”i eemaldada ainult need vĂ€ljad, mis on selgelt mÀÀratud Git'i manifestis (vĂ”i kirjutati eelnevas versioonis, kuid nĂŒĂŒd on eemaldatud).
3-way-merge patch
Peamine idee : genereeritakse patch viimase rakendatud versiooni manifestist Git'ist ja sihtversiooni manifestist Git'ist, arvestades praegust versiooni toimivas klastris. LĂ”pppatch peab vastama sĂŒnkroonitud ressursi reeglile:
- uusid vÀlju, mis on lisatud sihtversioonile, lisatakse patch'i kaudu;
- varasemad vĂ€ljad viimases rakendatud versioonis ja sihtversioonis, mis ei eksisteeri â nullitakse patch'i kaudu;
- praeguse objekti versioonis olevad vĂ€ljad, mis erinevad sihtversiooni manifestist, â uuendatakse patch'i kaudu.
Just selle pÔhimÔtte jÀrgi genereeritakse patch'id kubectl apply:
- viimane rakendatud versioon manifestist sÀilitatakse objekti enda annotatsioonis,
- siht â vĂ”etakse mÀÀratud YAML-failist,
- praegune â toimivast klastrist.
NĂŒĂŒd, kui me oleme teooriat selgitanud, on aeg rÀÀkida, mida me werf'is tegime.
Muudatuste kohaldamine werf'is
Varem kasutas werf, nagu ka Helm 2, 2-way-merge-patch'e.
Repair patch
Uue patch'i tĂŒĂŒbi, 3-way-merge, juurutamiseks, esimeseks sammuks tutvustasime nn repair-patch'e.
KĂ€ivitamisel kasutatakse standardset 2-way-merge-patch'i, kuid werf genereerib tĂ€iendavalt sellise patch'i, mis sĂŒnkroniseerib ressursi tegeliku seisundi sellekohasega Git'is (loodud patch sĂŒnkroonitud ressursi reegli jĂ€rgi, nagu eespool kirjeldatud).
Kui tekib mittesĂŒnkroonimine, saab kasutaja deploimentimise lĂ”pus WARNING'i vastava sĂ”numiga ja patch'i, mida tuleb rakendada, et tuua ressurss sĂŒnkroniseeritud vĂ€limusele. Samuti salvestatakse see patch spetsiaalsesse annotatsiooni werf.io/repair-patch.Eeldatakse, et kasutaja rakendab selle patch'i kĂ€sitsi: werf ei rakenda seda pĂ”himĂ”tteliselt. Repair-patch'ide genereerimine on ajutine lahendus, mis vĂ”imaldab proovida 3-way-merge pĂ”himĂ”tte alusel patch'ide loomist, kuid neid patch'e automaatselt ei rakendata. Praegu on see tööreĆŸiim vaikimisi sisse lĂŒlitatud. rakendab selle plaastri: werf ei rakenda seda pĂ”himĂ”tteliselt.
Repair-plaastrite genereerimine on ajutine meede, mis vĂ”imaldab praktikas katsetada plaastrite loomist 3-way-merge pĂ”himĂ”ttel, kuid neid plaastreid ei rakendata automaatselt. Praegu on see tööreĆŸiim vaikimisi sisse lĂŒlitatud.
3-way-merge patch ainult uutele vÀljaandele
Alates 1. detsembrist 2019 alustavad werf'i beta- ja alpha-versioonid vaikimisi rakendada tÀieÔiguslikke 3-way-merge-patsh'e muutuste rakendamiseks ainult uutele Helm'i vÀljaannetele, mis on werf'i kaudu vÀlja antud. Juba olemasolevad vÀljaanded jÀtkavad 2-way-merge ja repair-patch'ide lÀhenemist.
Seda tööreĆŸiimi saab selgelt lubada seadistusega WERF_THREE_WAY_MERGE_MODE=onlyNewReleases Seda vĂ”ib juba praegu kasutada.
MĂ€rkus: funktsiooni arendamine toimus werf'is mitme vĂ€ljaande jooksul: alpha-kanalis sai see valmis versiooniga beta-kanalis â alates .
3-way-merge patch kÔigile vÀljaannetele
Alates 15. detsembrist 2019 alustavad werf'i beta- ja alpha-versioonid vaikimisi rakendada tÀieÔiguslikke 3-way-merge-patsh'e muutuste rakendamiseks kÔigile vÀljaannetele.
Seda tööreĆŸiimi saab selgelt lubada seadistusega WERF_THREE_WAY_MERGE_MODE=enabled Seda vĂ”ib juba praegu kasutada.
Kuidas on automaatse ressursside skaleerimisega?
Kuberneteses on 2 tĂŒĂŒpi automaatmÔÔtmisel: HPA (horisontaalne) ja VPA (vertikaalne).
Horisontaalne valib automaatselt koopiate arvu, vertikaalne mÀÀrab ressursse. Nii koopiate arv kui ka ressursinÔuded on mÀrgitud ressursi manifestis (vt. spec.replicas vÔi spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory ja ).
Probleem: kui kasutaja konfigureerib ressursi chartis nii, et seal on mÀÀratud kindlad ressursid vÔi koopiad, ja selle ressursi jaoks on lubatud automaatmÔÔtjad, siis igal deploy'il kÀtkeb werf neid vÀÀrtusi tagasi manifestis loetletud vÀÀrtustele.
Probleemi lahendamiseks on kaks vÔimalust. Esiteks on parem loobuda automaatmÔÔtmisvÀÀrtuste selgesÔnalisest mÀÀramisest charti manifestis. Kui see variant mingil pÔhjusel ei sobi (nÀiteks kuna chartis on mugav mÀÀrata algseid ressursipiiranguid ja koopiate arvu), siis pakub werf jÀrgmisi annotatsioone:
-
werf.io/set-replicas-only-on-creation=true -
werf.io/set-resources-only-on-creation=true
Kuna selline annotatsioon on olemas, ei reseti werf vastavaid vÀÀrtusi igal deploy'il, vaid need mÀÀratakse ainult ressursi esmakordsel loomisel.
TĂ€psemalt vt projekti dokumentatsioonis ja .
Keela 3-way-merge patch'i kasutamine
Kasutaja saab hetkel keelduda uute patchide kasutamisest werfis keskkonnamuutuja abil WERF_THREE_WAY_MERGE_MODE=disabled. Kuid alates 1. mÀrtsist 2020 kaotab see keeld kehtivuse ja vÔimalikuks jÀÀb vaid 3-way-merge patch'ide kasutamine.
Ressursside adopteerimine werfis
3-way-merge patch'ide kasutuselevÔtt vÔimaldas kohe rakendada sellise funktsiooni nagu klastris olemasolevate ressursside adopteerimine Helm'i vÀljaande sisse.
Helm 2-l on probleem: juba klastris olemasolevat ressursi ei saa chartide manifestidesse lisada ilma ressursi nulli tÀiendamiseta (vt. , ). Oleme Ôpetanud werfi aktsepteerima olemasolevaid ressursse vÀljaandes. Selleks tuleb praeguse ressursi versiooni annotatsioon asetada töötavas klastris (nÀiteks kasutades kubectl edit):
"werf.io/allow-adoption-by-release": RELEASE_NAMENĂŒĂŒd tuleb ressurss chartis kirjeldada ja jĂ€rgmise werf'iga selle nimega vĂ€ljaande deploy'imisel vĂ”etakse olemasolev ressurss sellesse vĂ€ljaandesse ja jÀÀb selle juhtimise alla. Veelgi enam, ressursi vastuvĂ”tmise protsessis toob werf ressursi praeguse oleku töötavast klastrist vastavaks chartis kirjeldatud olekule, kasutades samu 3-way-merge patch'e ja ressurssi sĂŒnkroniseerimise reeglit.
MĂ€rkus: seade WERF_THREE_WAY_MERGE_MODE ei mĂ”juta ressurside adopteerimist â adopteerimisel kasutatakse alati 3-way-merge patch'i.
TĂ€psemalt vt .
KokkuvÔtted ja edasised plaanid
Loodan, et pĂ€rast seda artiklit sai selgemaks, mis on 3-way-merge patch'id ja miks need sisse viidi. Projekti werf arendamise praktilises vaates on nende rakendamine veel ĂŒks samm Helm'i sarnaste deploy'ide parandamiseks. NĂŒĂŒd vĂ”ib unustada konfigureerimise sĂŒnkroniseerimisega seotud probleemid, millega tihti seoses Helm 2 kasutamisel kokku puututi. Samuti on lisatud uus kasulik funktsioon juba kasutusele vĂ”etud Kubernetes'i ressursside adopteerimiseks Helm'i vĂ€ljaandesse.
Helm'i sarnases deploy's on endiselt mÔned probleemid ja raskused, nagu Go-mallide kasutamine, ja me jÀtkame nende lahendamist.
Teavet ressursside uuendamise meetodite ja adopteerimise kohta vÔib leida ka .
Helm 3
Erilist tĂ€helepanu vÀÀrib uus peamine versioon Helm â v3, â mis samuti kasutab 3-way-merge patch'e ja loob Tilleri. Uus versioon Helm nĂ”uab juba olemasolevate installatsioonide konverteerimist uude vĂ€ljaande salvestamise formaati.
Werf on enda poolt juba eemaldanud Tilleri kasutamise, lĂ€inud ĂŒle 3-way-merge'ile ja lisanud , olles samas ĂŒhilduv olemasolevate Helm 2 installatsioonidega (migratsiooni skripte ei ole vaja teostada). SeetĂ”ttu, kuni werf ei ole ĂŒle lĂ€inud Helm 3-le, ei kaota werfi kasutajad Helm 3 peamisi eeliseid vĂ”rreldes Helm 2-ga (need on olemas ka werfis).
Siiski on werfi ĂŒleminek Helm 3 koodibaasi ja tuleb lĂ€hiajal. Eeldatavasti on see werf 1.1 vĂ”i werf 1.2 (hetkel on werfi peamine versioon 1.0; lisainfot werfi versioonimise struktuuri kohta vt. ). Selle aja jooksul jĂ”uab Helm 3 stabiliseeruda.
P.S.
Lugege ka meie blogist:
- Werfi uuenduste ring:
- «»;
- «»;
- «».
- «»;
- «»;
- «».
Allikas: habr.com
