Kubernetesel on mitu ressursside uuendamise varianti: apply, edit, patch ja replace. On tekkinud segadus, mida igaĂŒks neist teeb ja millal neid rakendada. Vaatame lĂ€hemalt.

Kui fraasi "kubernetes apply vs replace", leiate , mis ei ole Ă”ige. "kubernetes apply vs patch" esimene link on dokumentatsioon kubectl patch, mis ei sisalda vĂ”rdlust rakenda ja patch. Selles artiklis kĂ€sitletakse erinevaid variante ja ka igaĂŒhe korrektset kasutamist.
Kubernetesi ressursi elutsĂŒkli jooksul (nt teenus, deployment, ingress jne) on vahel vajalik muuta, lisada vĂ”i eemaldada teatud omadusi sellest ressursist. NĂ€iteks lisada kommentaar vĂ”i suurendada vĂ”i vĂ€hendada replika arvu.
Kubernetes CLI
Kui te juba töötate Kubernetes klastritega CLI kaudu, siis olete juba tuttav rakenda ja muuda. KÀsk rakenda spetsifikatsiooni lugemisega ressurssi failist ja teeb "upsert" Kubernetes klastrisse, st loob ressursi, kui seda ei ole, ja uuendab, kui see olemas on. KÀsk muuda loob ressursi API kaudu, seejÀrel kirjutab ressursi spetsifikatsiooni kohalikku faili, mida avatakse seejÀrel tekstiredaktorisse. PÀrast faili redigeerimist ja salvestamist, kubectl saab tagasi saadetud muudatused lÀbi API, mis hoolikalt rakendab need muudatused ressursile.
KÔik ei tea kÀskudest patch ja asenda. KÀsk patch lubab muuta osa ressursi spetsifikatsioonist, edastades ainult muudetud osa kÀsureas. KÀsk asenda töötab samamoodi nagu muuda, kuid kÔik tuleb teha kÀsitsi: tuleb alla laadida ressursi praegune spetsifikatsioon, nÀiteks kasutades kubectl get -o yaml, redigeerida seda ning seejÀrel kasutada asenda ressursi uuendamiseks muudetud spetsifikatsiooni alusel. KÀsk asenda ei tööta, kui ressursi lugemise ja asendamise vahel on toimunud mingeid muudatusi.
Kubernetes API
Te olete tÔenÀoliselt tuttav meetoditega CoreV1().Pods().Update(), replaceNamespacedService vÔi patch_namespaced_deployment, kui töötate klastritega lÀbi mÔne programmeerimiskeele kasutamisega. Teek kÀsitleb neid meetodeid HTTP protokolli kaudu, kasutades meetodeid PUT ja PATCH. Sellega update ja asenda kasutatud PUT, ja patch, kui iganes see ei tunduks iseenesestmÔistetav, kasutab PATCH.
Oluline on mĂ€rkida, et kubectl ka töötab klastritega lĂ€bi API. TeisisĂ”nu, kubectlâ on klientteegi ĂŒmbris Go keele jaoks, mis vĂ”imaldab oluliselt esitada alamsĂ”nu kompaktses ja loetavas vormis koos API vaikimisi funktsioonidega. NĂ€iteks nagu olete juba mĂ€rganud, meetod rakenda ei olnud eespool eelmises lĂ”igus mainitud. Praegu (mai 2020, tĂ”lkija mĂ€rk.) kogu loogika kubectl apply, st mitteeksisteerivate ressursside loomine ja olemasolevate vĂ€rskendamine, toimub tĂ€ielikult koodi poolel kubectl. Tehakse pingutusi rakenda API poolele, kuid see on endiselt beetatesti faasis. Ăksikasjalikumalt selgitan allpool.
Vaikimisi Patch
Parim on rakendada patch, kui soovite ressurssi uuendada. Nii töötavad klienditeegid API Kubernetes'i peal, nagu ka kubectl (pole ĂŒllatav, sest see on klientteegi ĂŒmbris, tĂ”lkija mĂ€rk.).
Töötage strateegiliselt
KĂ”ik kĂ€sud kubectl rakenda, muuda ja patch kasutavad meetodit PATCH HTTP pĂ€ringutes olemasoleva ressursi uuendamiseks. Kui sĂŒveneda kĂ€skude elluviimisse, siis kĂ”ik kasutavad lĂ€henemist ressursside uuendamiseks, kuigi kĂ€sk patch vĂ”ib kasutada ka muid lĂ€henemisviise (rohkem selle kohta allpool). Strateegiline ĂŒhinemise patchimine pĂŒĂŒab "kĂ”ike Ă”igesti teha", ĂŒhendades antud spetsifikatsiooni olemasoleva spetsifikatsiooniga. TĂ€psemalt öeldes, ta pĂŒĂŒab liita nii objekte kui ka massiive, mis tĂ€hendab, et muudatused on tavaliselt liituvad. NĂ€iteks, kĂ€ivitades kĂ€sk patch uue keskkonnamuutuja lisamisega pod konteineri spetsifikatsiooni, tĂ”ukab see selle keskkonnamuutuja olemasolevatele keskkonnamuutujatele lisandumiseks, mitte nende ĂŒlekatteks. Selle lĂ€henemisega eemaldamiseks tuleks parameetri vÀÀrtus etteantud spetsifikatsioonis sundida nulliks. Millised kĂ€skude kubectl uuendamiseks oleks kĂ”ige paremad kasutada?
Kui te haldate oma ressursse kubectl apply, on uuendamisel alati parem kasutada kubectl apply, et kubectl vĂ”is hallata konfiguratsiooni ja Ă”igesti jĂ€lgida taotletud muudatusi rakenduste kaupa. Eelis on alati kasutada rakenda kaasas on see, et see jĂ€lgib varem rakendatud spetsifikatsiooni, vĂ”imaldades tal teada, millal spetsifikatsiooni omadused ja massiivi elemendid on selgelt eemaldatud. See vĂ”imaldab kasutada rakenda omaduste ja massiivi elementide eemaldamiseks, samal ajal kui tavapĂ€rane strateegiline ĂŒhinemine ei tööta. KĂ€sud muuda ja patch ei uuenda mĂ€rkmeid, mida kubectl apply rakendab oma muudatuste jĂ€lgimiseks, seega on kĂ”ik muudatused, mis on jĂ€lgitavad ja tehtud Kubernetes API kaudu, kuid mis on tehtud kĂ€sudega muuda ja patch, nĂ€htamatud jĂ€rgnevatele kĂ€skudele rakenda, st rakenda ei eemalda neid, isegi kui need ei ilmu sisendspetsifikatsioonis rakenda (Dokumendis on öeldud, et muuda ja patch teevad mĂ€rkmete uuendusi, mida kasutatakse rakenda, kuid praktikas â ei).
Kui te ei kasuta kĂ€sku rakenda, vĂ”ib kasutada nagu muuda, kui ka patch, valides kĂ€su, mis sobib rohkem tehtava muudatuse jaoks. Omaduste lisamisel ja muutmisel toimivad mĂ”lemad lĂ€henemisviisid umbes samamoodi. Spetsifikatsiooni omaduste vĂ”i massiivi elementide eemaldamisel muuda kĂ€itub see nagu ĂŒhekordne jooks rakenda, sealhulgas jĂ€lgib, milline oli spetsifikatsioon enne ja pĂ€rast redigeerimist, seega saab selgelt eemaldada omadused ja massiivi elemendid ressursist. Omaduse vÀÀrtus tuleb selgelt mÀÀrata nulliks spetsifikatsioonis, et patch, et seda ressursist eemaldada. Massiivi elemendi eemaldamine strateegilise ĂŒhinemise patchimise kaudu on keerulisem, kuna see nĂ”uab ĂŒhinemisdirektiivide kasutamist. Vaata allpool muid uuendamisvĂ”imalusi, et valida sobivamaid alternatiive.
Kliendi teegis uuendamise meetodite rakendamiseks, mis kĂ€ituvad sarnaselt ĂŒlaltoodud kĂ€skudele, kubectl, tuleks pĂ€ringutes mÀÀrata content-type ĂŒhes application/strategic-merge-patch+json. Kui soovite eemaldada omadusi spetsifikatsioonis, peate nende vÀÀrtused selgelt mÀÀrama nulliks sarnaselt kubectl patch. Kui tuleb eemaldada massiivi elemente, peaksite uuendamise spetsifikatsioonis lisama ĂŒhinemisdirektiivid vĂ”i kasutama muud uuendamise lĂ€henemist.
Teised uuendamise lÀhenemised
Kubernetes toetab kahte muud uuendamise lĂ€henemist: ja . JSON merge patch lĂ€henemine aktsepteerib osalist Kubernetesi spetsifikatsiooni sisendina ja toetab objektide ĂŒhendamist nagu strategic-merge patching lĂ€henemine. Nende vahelise erinevuse tĂ”ttu toetab see ainult massiivide asendust, sealhulgas konteinerite massiivi podi spetsifikatsioonis. See tĂ€hendab, et JSON merge patchi kasutamisel peate esitama kĂ”ikide konteinerite tĂ€ielikud spetsifikatsioonid, kui muudate mĂ”ne konteineri omadust. Seega on see lĂ€henemine kasulik elementide eemaldamiseks massiivist spetsifikatsioonis. KĂ€skude read kasutades saate valida JSON merge patchi, kasutades kubectl patch --type=merge. Kubernetes API-ga töötades tuleks kasutada pĂ€ringu meetodit PATCH ja seadmise content-type ĂŒhes application/merge-patch+json.
JSON-patchi lĂ€henemine, selle asemel, et esitada osaline ressursi spetsifikatsioon, kasutab muudatusi, mida soovite ressursis teha, massiivina, kus iga massiivi element esindab muudatuse kirjelduse, mis tehakse ressursile. See lĂ€henemine on paindlikum ja vĂ”imsam viis tehtud muudatuste vĂ€ljendamiseks, kuid see toob kaasa selle, et tehtud muudatuste loend on eraldi vormingus, mis ei ole Kubernetes, selle asemel, et saata osaline ressursi spetsifikatsioon. kubectl Te saate valida JSON-patchi, kasutades kubectl patch --type=json. Kubernetes API kasutamisel töötab see lĂ€henemine pĂ€ringu meetodi abil PATCH ja seadmise content-type ĂŒhes application/json-patch+json.
Vajad usaldusvÀÀrsust â kasutame replace
MĂ”nel juhul on vajalik veenduda, et ressurssi ei muudeta ressurssi lugemise ja selle vĂ€rskendamise vahel. TeisisĂ”nu, tasub veenduda, et kĂ”ik muudatused jÀÀksid atomaarseteks. Sel juhul tuleks ressursside vĂ€rskendamiseks kasutada asenda. NĂ€iteks, kui olemas on ConfigMap, mille loendurit uuendavad mitmed allikad, tuleb olla kindel, et kaks allikat ei uuenda loendurit samaaegselt, mis tooks kaasa uuenduse kadumise. Demonstreerimise eesmĂ€rgil kujutage ette sĂŒndmuste jĂ€rjestust, kasutades lĂ€henemist patch:
- A ja B vÔtavad ressursi praeguse oleku API-st
- Kumbki neist uuendab kohalikult spetsifikatsiooni, suurendades loendurit ĂŒhe vĂ”rra ning lisades vastavalt "A" vĂ”i "B" mĂ€rkusesse "updated-by"
- A uuendab ressurssi veidi kiiremini
- B uuendab ressurssi
Tulemuseks on uuendus A kadumine. Viimane operatsioon patch vĂ”idab, loendur suureneb ĂŒhe vĂ”rra kahe asemel ning "updated-by" mĂ€rkus lĂ”ppeb "B"-ga, mitte sisaldades "A"-t. Vaatame, kuidas see vĂ”rreldes eelnimetatuga, kui uuendused toimuvad lĂ€henemisviisi jĂ€rgi asenda:
- A ja B vÔtavad ressursi praeguse oleku API-st
- Kumbki neist uuendab kohalikult spetsifikatsiooni, suurendades loendurit ĂŒhe vĂ”rra ning lisades vastavalt "A" vĂ”i "B" mĂ€rkusesse "updated-by"
- A uuendab ressurssi veidi kiiremini
- B proovib ressurssi uuendada, kuid API tagastab uuenduse tagasilĂŒkkamise, kuna ressursi versioon spetsifikatsioonis
asendaei ĂŒhti Kuberneteses oleva ressursi praeguse versiooniga, kuna ressursi versioon suurenes A poolt asendamise operatsiooni kĂ€igus.
Ălaltoodud juhul peab B ressurssi uuesti hankima, tegema muudatusi uues olekus ja proovima uuesti. asenda. Tulemusena suureneb loendur kahe vĂ”rra ning mĂ€rge "updated-by" sisaldab lĂ”pus "AB".
Eelmainitud nĂ€ide eeldab, et tĂ€idetakse asenda kogu ressursi tĂ€ielik asendamine. Spetsifikatsioon, mida kasutatakse asenda, peab olema mitte osaline, nagu rakenda, vaid tĂ€isteenus, sealhulgas lisamine resourceVersion spetsifikatsiooni metaandmetesse. Kui te ei ole lisanud resourceVersion vĂ”i antud versioon ei ole praegune, asendamise taotlus lĂŒkatakse tagasi. Seega on parim lĂ€henemine asenda â lugeda resurssi, vĂ€rskendada seda ja kohe asendada. Kasutades kubectl, nĂ€eks see vĂ€lja jĂ€rgmine:
$ kubectl get deployment my-deployment -o json
| jq '.spec.template.spec.containers[0].env[1].value = "new value"'
| kubectl replace -f -Tasub mÀrkida, et jÀrgmised kaks kÀsku, kui need tÀidetakse jÀrjestikku, Ônnestuvad, kuna deployment.yaml ei sisalda omadust .metadata.resourceVersion
$ kubectl create -f deployment.yaml
$ kubectl replace -f deployment.yamlTundub, et see on vastuolus ĂŒlaltooduga, s.t. "lisamine resourceVersion metandmete spetsifikatsioonis. Kas on vale nii vĂ€ita? Ei, see ei ole nii, kuna kui kubectl tĂ€heldatakse, et te ei ole mÀÀranud resourceVersion, loeb ta selle ressursist ja lisab teie mÀÀratud spetsifikatsiooni ning alles siis tĂ€idab asenda. Kuna see on potentsiaalselt ohtlik, kui tugineda aatomaroodile, töötab kogu see maagia tĂ€ielikult serveripoolselt kubectl, ei tasu sellele toetuda klientide teeki kasutades, mis töötavad API-ga. Sel juhul peate lugema praegust ressursi spetsifikatsiooni, vĂ€rskendama seda ja siis tĂ€itma PUT pĂ€ringut.
Ei saa kasutada patchâi â teeme replace
MÔnikord tuleb teha muutusi, mida API ei suuda töödelda. Sellistel juhtudel saab ressurssi sundiselt asendada, kustutades ja luues selle uuesti. See tehakse jÀrgmiselt kubectl replace --force. KÀsku kÀivitades kustutatakse ressursid koheselt ja seejÀrel luuakse need uuesti pakutud spetsifikatsioonide jÀrgi. API-s ei ole sunnitud asendamise töötlejat ning selle saavutamiseks API kaudu tuleb teha kaks toimingut. Esiteks tuleb kustutada ressurss, mÀÀrates sellele gracePeriodSeconds nulliks (0) ja propagationPolicy ennom 'Background', ja seejÀrel luua see ressurss soovitud spetsifikatsiooniga uuesti.
Oluline: see lÀhenemine on potentsiaalselt ohtlik ja vÔib viia mÀÀramatute olekuteni.
Kasutage serveripoolset rakendamist.
Nagu eespool mainitud, töötavad Kubernetes'e arendajad loogika rakendamise kallal. rakenda kohast kubectl Kubernetes API-s. Loogika rakenda on saadaval Kubernetes 1.18 kaudu kubectl apply --server-side vÔi API kaudu, kasutades meetodit PATCH koos content-type application/apply-patch+YAML.
MÀrkus: JSON on samuti Ôige YAML, seega on vÔimalik saata spetsifikatsioon JSON-vormingus, isegi kui
content-typerakendatakseapplication/apply-patch+yaml.
Lisaks sellele, et loogika kubectl on kÔigile saadaval API kaudu, rakenda serveripoolne jÀlgib spetsiifikatsioonis vÀljade eest vastutavaid, vÔimaldades seega turvalise mitme juurdepÀÀsu selle konfliktivabaks redigeerimiseks. TeisisÔnu, kui rakenda serveripoolne laiemalt levib, ilmub universaalne turvaline veebirakenduste haldamise liides erinevate klientide jaoks, nÀiteks kubectl, Pulumi vÔi Terraform, GitOps ning ka isetegemise skriptide jaoks, mis kasutavad klienditeegi.
KokkuvÔte
Loodetavasti oli see lĂŒhike ĂŒlevaade erinevatest viisidest klastrite ressursside vĂ€rskendamiseks teile kasulik. Hea on teada, et vastandused ei ole lihtsalt apply ja replace, kuna saab ressurssi vĂ€rskendada ka apply, edit, patch vĂ”i replace abil. Igal lĂ€henemisviisil on oma rakendusala. Aatomaarsete muudatuste jaoks on parem kasutada replace, muul juhul tasub kasutada strategic-merge patchi lĂ€bi apply. Loodan, et mĂ”istsite, et ei tasu usaldada Google'i vĂ”i StackOverflow't otsides "kubernetes apply vs replace". VĂ€hemalt seni, kuni see artikkel ei asenda hetke vastuseid.

Allikas: habr.com
