Kubernetesel on mitmeid vĂ”imalusi ressursside uuendamiseks: apply, edit, patch ja replace. On segadust selle ĂŒle, mida igaĂŒhe puhul teha ja millal neid rakendada. Vaatame ĂŒle.

Kui fraasi "kubernetes apply vs replace", leitakse , mis ei ole Ă”ige. "kubernetes apply vs patch" on esimene link â dokumentatsioon kubectl patch, mis ei sisalda vĂ”rdlust apply ja patch. Selles artiklis kĂ€sitletakse erinevaid vĂ”imalusi ning igaĂŒhe Ă”iget kasutamist.
Kubernetes ressursi elutsĂŒkli jooksul (teenus, deployment, ingress jne) on mĂ”nikord vajalik muuta, lisada vĂ”i eemaldada mĂ”ningaid selle ressursi omadusi. NĂ€iteks lisada kommentaar vĂ”i suurendada/vĂ€heneda replikate arvu.
Kubernetes CLI
Kui töötate juba Kubernetes klastritega CLI kaudu, siis olete juba tuttav apply ja edit. KÀsk apply mis loeb ressursi specifikatsiooni failist ja teeb "upsert" Kubernetes klastrisse, st loob ressursi, kui seda ei ole, ja uuendab seda, kui see eksisteerib. KÀsk edit loeb ressursi API kaudu, seejÀrel kirjutab ressursi specifikatsiooni kohalikku faili, mis avatakse seejÀrel tekstiredaktoris. PÀrast seda, kui olete faili redigeerinud ja salvestanud, kubectl saadab tehtud muudatused tagasi API kaudu, mis hoolikalt rakendab need muudatused ressursile.
Mitmed inimesed ei tea, et kÀsk patch ja replace. KÀsk patch lubab muuta osa ressursi spetsifikatsioonist, esitades ainult muudetud osa kÀsureas. KÀsk replace töötab sama moodi nagu edit, kuid kÔik tuleb teha kÀsitsi: peate alla laadima ressursi praeguse versiooni, nÀiteks kasutades kubectl get -o yaml, redigeerige seda, seejÀrel kasutage replace ressursi uuendamiseks muudetud spetsifikatsiooni pÔhjal. KÀsk replace ei tööta, kui ressursi lugemise ja asendamise vahel on toimunud muudatuseid.
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 abil. Raamatukogu haldab neid meetodeid HTTP-protokolli kaudu tehtud pÀringute abil, kasutades meetodeid PUT ja PATCH. Sellega samas update ja replace kasutavad PUT, vaid patch, kuidas see ka ei kÔlaks, kasutab PATCH.
Oluline on mĂ€rkida, et kubectl töötab samuti klastritega API kaudu. TeisisĂ”nu, kubectlon see on Go keele klienditeegi kohal olev wrapper, mis annab suuresti vĂ”imaluse esitada subkomande kompaktsemal ja loetavamal viisil, lisaks API vaikimisi funktsioonidele. NĂ€iteks, nagu olete juba vĂ”ib-olla tĂ€hele pannud, meetod apply ei olnud eelnevas lĂ”igus mainitud. Praegu (mai 2020, tĂ”lkija mĂ€rkus) kogu loogika kubectl apply, st mitteeksteerivate ressursside loomine ja olemasolevate vĂ€rskendamine, töötab tĂ€iesti koodipoolsel kĂŒljel kubectl. Tehakse katseid apply API poole, kuid see on endiselt beetatestimise faasis. Kirjeldan allpool lĂ€hemalt.
VaikevÀrskendus
On parim rakendada patch, kui soovite ressurssi vĂ€rskendada. Nii töötavad nii klienditeegid API ÙÙÙ Kubernetes kui ka kubectl (pole ĂŒllatav, et see on klienditeegi wrapper, tĂ”lkija mĂ€rkus).
Töötada strateegiliselt
KĂ”ik kĂ€sud kubectl apply, edit ja patch kasutavad meetodit PATCH HTTP taotlustes olemasoleva ressursi vĂ€rskendamiseks. Kui vaadata kĂ€su rakendusi lĂ€hemalt, siis kĂ”igis kasutatakse lĂ€henemist ressursside vĂ€rskendamiseks, kuigi kĂ€sk patch vĂ”ib kasutada ka teistsuguseid lĂ€henemisi (selle kohta rohkem allpool). Strateegilise ĂŒhinemise vĂ€rskendamine ĂŒritab "teha kĂ”ike Ă”igesti", kui liita antud spetsifikatsioon olemasoleva spetsifikatsiooniga. TĂ€psemalt ĂŒritab see ĂŒhendada nii objekte kui ka massiive, mis tĂ€hendab, et muudatused on reeglina liituvad. NĂ€iteks, kĂ€sk patch uue keskkonnamuutujaga pod-i konteineri spetsifikatsioonis, viib selleni, et see keskkonnamuutuja lisatakse olemasolevatele keskkonnamuutujatele, mitte ei asenda neid. Selle lĂ€henemisega eemaldamiseks tuleb antud spetsifikatsioonis parameetri vÀÀrtus nulliks sundida. Millised kĂ€sud kubectl vĂ€rskendamiseks on kĂ”ige paremad?
Kui loote ja haldate oma ressursse kubectl apply, on vĂ€rskenduste tegemisel alati parem kasutada kubectl apply, et kubectl saaks hallata konfiguratsiooni ja Ă”igesti jĂ€lgida taotletud muudatusi rakenduste seas. Eelis, mida alati kasutada apply on see, et see jĂ€lgib varasemalt rakendatud spetsifikatsiooni, vĂ”imaldades tal teada, millal spetsifikatsiooni omadused ja massiivi elemendid on selgelt eemaldatud. See vĂ”imaldab kasutada apply massiivide omaduste ja elementide eemaldamiseks, samas kui tavapĂ€rane strateegiline ĂŒhinemine ei toimi. KĂ€sklused edit ja patch ei vĂ€rskenda mĂ€rkmeid, mida kubectl apply rakendab oma muudatuste jĂ€lgimiseks, seetĂ”ttu ei ole kĂ”ik muudatused, mis jĂ€lgitakse ja tehakse lĂ€bi API Kubernetes, kuid tehtud kĂ€skude kaudu edit ja patch, nĂ€htamatud jĂ€rgmiste kĂ€skude jaoks apply, see tĂ€hendab apply ei eemalda neid, isegi kui need ei ilmu sisendspekifikatsioonis apply Dokumendis on öeldud, et edit ja patch teevad mĂ€rkmete vĂ€rskendusi, mida apply, aga praktikas â ei).
Kui te ei kasuta kĂ€sku apply, saab kasutada nii edit, kui ka patch, valides selle kĂ€su, mis sobib rohkem muudetava muudatusega. Omaduste lisamisel ja muutmisel on mĂ”lemad lĂ€henemisviisid suurusjĂ€rgus samad. Spetsifikatsiooni omaduste vĂ”i massiivielementide eemaldamisel edit kĂ€itub kui ĂŒhekordne kĂ€ivitamine apply, sealhulgas jĂ€lgib, milline oli spetsifikatsioon enne ja pĂ€rast selle redigeerimist, seetĂ”ttu on vĂ”imalik selgelt eemaldada omadused ja massiivielemendid ressursist. Tuleb selgelt seada omaduse vÀÀrtus nulliks spetsifikatsioonis patch, et eemaldada see ressursist. Massiivielemendi eemaldamine strateegilise ĂŒhinemise patchimisega on keerulisem, kuna nĂ”uab ĂŒhinemisdirektiivide kasutamist. Vaadake allpool teisi uuendamise lĂ€henemisviise, et valida sobivamad alternatiivid.
Klienditeegis uuendamise meetodite rakendamiseks, mis kĂ€ituvad sarnaselt ĂŒlaltoodud kĂ€skudele kubectl, tuleks pĂ€ringutes mÀÀrata content-type ja application/strategic-merge-patch+json. Kui soovite spetsifikatsioonis omadusi eemaldada, tuleb nende vÀÀrtused selgelt seada nulliks sarnaselt kubectl patch. Kui on vajalik massiivielementide eemaldamine, tuleks lisada ĂŒhinemisdirektiive uuendamise spetsifikatsiooni vĂ”i kasutada muud lĂ€henemisviisi uuendustele.
Teised lÀhenemisviisid uuendustele
Kubernetes toetab kahte muud lÀhenemisviisi uuendustele: ja . JSON merge patch lÀhenemine vÔtab Kubernetes'e osalise spesifikatsiooni sisendina ja toetab objektide sulandumist nagu strategic-merge patching lÀhenemist. Nende vahe seisneb selles, et see toetab ainult massiivide asendamist, sealhulgas konteinerite massiivi pod'i spesifikatsioonis. See tÀhendab, et JSON merge patch'i kasutamisel peate esitama tÀiseditsioonid kÔigi konteinerite jaoks, kui muudate mÔne konteineri omadust. SeetÔttu on see lÀhenemine kasulik elementide eemaldamiseks massiivist spetsifikatsioonis. KÀskude rida kasutades saate valida JSON merge patch'i, kasutades kubectl patch --type=merge. Kubernetes API-ga töötades tuleks kasutada pÀringumeetodit PATCH ja seadistamine content-type ja application/merge-patch+json.
JSON patch lĂ€henemine, selle asemel et esitada osaline spetsifikatsioon ressursist, kasutab muudatuste esitamist, mida soovite ressursis teha, massiivina, kus iga massiivi element esindab muudatuse kirjeldust, mis tehakse ressursis. See lĂ€henemine on paindlikum ja vĂ”imsam muudatuste vĂ€ljendamise viis, kuid sellest tulenevalt, et muudatuste loetelu on eraldi, mitte Kubernetes'e formaadis, selle asemel, et saata osaline ressursi spetsifikatsioon. Saate valida JSON patch'i, kasutades kubectl kubectl patch --type=json . Kubernetes API kasutamisel töötab see lĂ€henemine pĂ€ringumeetodigaapplication/json-patch+json PATCH ja seadistamine content-type ja Vajad usaldusvÀÀrsust â kasutame replace'i.
MÔnel juhul on vajalik kindel veendumus, et ressursse ei muudeta vahetult enne selle lugemist ja vÀrskendamist. TeisisÔnu, on oluline veenduda, et kÔik muudatused oleksid
aatomaarne . Sel juhul tasub kasutada ressursi vĂ€rskendamiseks. NĂ€iteks, kui on ConfigMap, mille loendurit uuendavad mitmed allikad, tuleks olla kindel, et kaks allikat ei uuenda loendurit samal ajal, mis tooks kaasa vĂ€rskenduse kaotamise. NĂ€iteks kujutage ette sĂŒndmuste jĂ€rjestust, kasutades lĂ€henemist replaceA ja B saavad ressursi praeguse oleku API-st patch:
- MĂ”lemad uuendavad kohalikult spetsifikatsiooni, suurendades loenduri vÀÀrtust ĂŒhe vĂ”rra ning lisades vastavalt "A" vĂ”i "B" tĂ€helepanekusse "updated-by"
- A uuendab ressursi veidi kiiremini
- B uuendab ressursi
- B uuendab ressursi
Seega A uuendus on kadunud. Viimane operatsioon patch vĂ”idab, loendur suureneb ĂŒhe asemel kahe vĂ”rra ja mĂ€rkuse "updated-by" vÀÀrtus lĂ”ppeb "B"-ga ning ei sisalda "A". Vaatame, kuidas see vĂ”rreldes eelneva kontekstiga, kui uuendusi teostatakse lĂ€henemisega replace:
- MĂ”lemad uuendavad kohalikult spetsifikatsiooni, suurendades loenduri vÀÀrtust ĂŒhe vĂ”rra ning lisades vastavalt "A" vĂ”i "B" tĂ€helepanekusse "updated-by"
- A uuendab ressursi veidi kiiremini
- B uuendab ressursi
- B pĂŒĂŒab ressurssi uuendada, kuid API tagastab uuenduse tagasi, kuna ressursi versioon spetsifikatsioonis
replaceei kattu Kubernetes'e praeguse ressursi versiooniga, kuna ressursi versioon on A poolt toimunud asendamise operatsiooni kÀigus suurenenud.
Ălaltoodud juhul peab B ressursi uuesti hankima, tegema muudatused uude seisundisse ja proovima jĂ€lle teha replace. Seega suureneb loendur kahe vĂ”rra ja mĂ€rkuses "updated-by" on lĂ”pus "AB".
Eeltoodud nĂ€ide tĂ€hendab, et teostatakse replace kogu ressursi tĂ€ielik asendamine. Spetsifikatsioon, mida kasutatakse replace, peab olema mitte osaline ega osadeks nagu apply, vaid tĂ€ielik, sealhulgas resourceVersion spetsifikatsiooni metadata. Kui te ei sisalda resourceVersion vĂ”i teie esitatud versioon ei ole praegune, siis asendamine lĂŒkatakse tagasi. Seega on parim lĂ€henemine kasutada replace â lugeda ressursi, uuendada seda ja kohe asendada. Kasutades kubectl, vĂ”ib see vĂ€lja nĂ€ha nii:
$ kubectl get deployment my-deployment -o json
| jq '.spec.template.spec.containers[0].env[1].value = "new value"'
| kubectl replace -f -Siiski tuleb mÀrkida, et jÀrgmised kaks kÀsku, mis on teostatud jÀrjestikku, Ônnestuvad, kuna deployment.yaml ei sisalda omadust .metadata.resourceVersion
$ kubectl create -f deployment.yaml
$ kubectl replace -f deployment.yamlNÀib, et see on vastuolus eelnevalt mainituga, st "lisamine resourceVersion spetsifikatsiooni metadata". Kas on vale nii vÀita? Ei, see ei ole vale, kuna kui kubectl tÀhele paneb, et te ei ole mÀÀranud resourceVersion, siis loeb ta selle ressursist ja lisab teie mÀÀratud spetsifikatsiooni ning alles siis teeb ta replace. Kuna see on potentsiaalselt ohtlik, kui toetuda aatomilisusele, töötab see tÀielikult kubectlkÀeulatuses, seega ei tohi selle peale toetuda, kui kasutada API-dega töötavaid kliendi raamatukogusid. Sel juhul peate lugema praeguse ressursi spetsifikatsiooni, uuendama selle ja seejÀrel sooritama PUT pÀringu.
Ei saa teha patch â teeme replace
MÔnikord on vaja teha muudatusi, mida API ei saa töödelda. Sellistel juhtudel on vÔimalik sundida ressurssi asendama, kustutades ja luues selle uuesti. Seda tehakse kasutades kubectl replace --force. Komando kÀivitamine kustutab ressursid viivitamatult ja seejÀrel loob need etteantud spetsifikatsiooni alusel. API-s ei ole "sundasendamise" kÀitlejat, ja selle tegemiseks API kaudu tuleb tÀita kaks toimingut. Alustuseks tuleb kustutada ressurss, seadistades selle gracePeriodSeconds nulliks (0) ja propagationPolicy "Background", ja seejÀrel luua see ressurss uuesti soovitud spetsifikatsiooniga.
TÀhelepanu: see lÀhenemine on potentsiaalselt ohtlik, see vÔib viia mÀÀramatute seisunditeni
Serveri poolse rakendamisega
Nagu eelnevalt mainitud, töötavad Kubernetes'i arendajad vÀlja loogikat apply API-s kubectl Kubernetes. Loogika apply on saadaval Kubernetes 1.18 kaudu kubectl apply --server-side vÔi API kaudu, kasutades meetodit PATCH jot content-type application/apply-patch+YAML.
MĂ€rkus: JSON on samuti korrektne YAML, nii et spetsifikatsiooni saab saata JSON-ina, isegi kui
content-typesee onapplication/apply-patch+yaml.
Lisaks sellele, et loogika kubectl saab kÔikide jaoks kÀtte API kaudu, apply serveri pool jÀlgib spetsifikatsioonis vÀljade eest vastutajaid, vÔimaldades seega ohutut mitmekordset juurdepÀÀsu konfliktivabaks redigeerimiseks. TeisisÔnu, kui apply serveri pool saab laiemat levikut, ilmub universaalne turvaline rajatis ressursside haldamiseks erinevatelt klientidelt, nÀiteks kubectl, Pulumi vÔi Terraform, GitOps ja ka kohandatud skriptid, mis kasutavad kliendiraamatukogusid.
Summary
Loodan, et see lĂŒhike ĂŒlevaade erinevatest viisidest klastrite ressursside vĂ€rskendamiseks oli teile kasulik. Kasulik on teada, et ei ole ainult apply vs replace, kuna ressurssi saab uuendada apply, edit, patch vĂ”i replace abil. Igal lĂ€henemisel on oma rakendusala. Atomaarsete muudatuste puhul on eelistatav replace, muul juhul tuleks kasutada strateegilist ĂŒhinemispatchi lĂ€bi apply. LĂ”ppkokkuvĂ”ttes loodan, et mĂ”istsite, et ei tohiks usaldada Google'it vĂ”i StackOverflow'd otsingul "kubernetes apply vs replace". vĂ€hemalt kuni selle artikli asendamiseni praeguse vastusega.

Allikas: habr.com
