Kubernetes ir vairÄkas resursu atjauninÄÅ”anas iespÄjas: apply, edit, patch un replace. Ir neskaidrÄ«bas par to, ko katra no tÄm dara un kad tÄs lietot. DarÄ«sim skaidru.

Ja frÄzi "kubernetes apply vs replace", atrodas , kas nav pareiza. "kubernetes apply vs patch", pirmais links ir dokumentÄcija par kubectl patch, kas nesatur salÄ«dzinÄjumu apply un patch. Å ajÄ rakstÄ tiks izskatÄ«tas dažÄdas iespÄjas, kÄ arÄ« pareiza katras no tÄm izmantoÅ”ana.
Kubernetes resursa (servisa, deployment, ingress u.tml.) dzÄ«ves cikla laikÄ dažreiz ir nepiecieÅ”ams mainÄ«t, pievienot vai dzÄst dažas Ŕī resursa Ä«paŔības. PiemÄram, pievienot komentÄru, palielinÄt vai samazinÄt replikÄciju skaitu.
Kubernetes CLI
Ja jÅ«s jau strÄdÄjat ar Kubernetes klasteriem caur CLI, tad esat jau iepazinies ar apply un edit. Komanda apply specifikÄciju lasa no faila un veic "upsert" Kubernetes klasterÄ«, t.i., izveido resursu, ja tÄ nav, un atjaunina to, ja tas pastÄv. Komanda edit resursu lasa caur API, pÄc tam raksta resursa specifikÄciju lokÄlÄ failÄ, kuru pÄc tam atver tekstu redaktorÄ. Kad jÅ«s to rediÄ£Äsit un saglabÄsit failu, kubectl nosÅ«tÄ«s veiktÄs izmaiÅas atpakaļ caur API, kas uzmanÄ«gi attiecina Ŕīs izmaiÅas uz resursu.
Ne visi zina komandas patch un replace. Komanda patch ļauj mainÄ«t resursa specifikÄcijas daļu, norÄdot tikai mainÄ«to daļu komandrindÄ. Komanda replace strÄdÄ tÄpat kÄ edit, bet viss jÄdara manuÄli: ir jÄleij current-specification versija, piemÄram, ar kubectl get -o yaml, jÄrediÄ£Ä tas, pÄc tam jÄdara replace resursa atjauninÄÅ”anai saskaÅÄ ar mainÄ«to specifikÄciju. Komanda replace nestrÄdÄs, ja starp lasīŔanu un resursa apmaiÅu notiks kÄdas izmaiÅas.
Kubernetes API
JÅ«s, iespÄjams, esat pazÄ«stams ar metodÄm CoreV1().Pods().Update(), replaceNamespacedService vai patch_namespaced_deployment, ja strÄdÄjat ar klasteriem caur izmantojot noteiktu programmÄÅ”anas valodu. BibliotÄka apstrÄdÄ Å”Ä«s metodes ar HTTP pieprasÄ«jumiem, izmantojot metodes PUT un PATCH. TajÄ paÅ”Ä laikÄ update un replace izmanto PUT, bet patch, kÄ tas varÄtu bÅ«t banÄli, izmanto PATCH.
JÄatzÄ«mÄ, ka kubectl arÄ« strÄdÄ ar klasteriem caur API. Citiem vÄrdiem sakot, kubectlā ir apvalks virs klienta bibliotÄkas Go valodai, kas bÅ«tÄ«bÄ nodroÅ”ina iespÄju sniegt apakÅ”komandas kompaktÄkÄ un viegli lasÄmÄ formÄ papildus standarta API iespÄjÄm. PiemÄram, kÄ jÅ«s jau varÄjÄt ievÄrot, metode apply netika minÄta iepriekÅ”ÄjÄ teikumÄ. PaÅ”laik (2020. gada maijs, piezÄ«me tulkotÄjam) visa loÄ£ika kubectl apply, t.i., jaunu resursu izveide un esoÅ”o atjauninÄÅ”ana, darbojas pilnÄ«bÄ koda pusÄ kubectl. Tiek veikti centieni apply uz API pusi, bet tas joprojÄm ir beta testÄÅ”anas fÄzÄ. SÄ«kÄk izskaidroÅ”u turpmÄk.
Patch pÄc noklusÄjuma
VislabÄk ir piemÄrot patch, ja vÄlaties atjauninÄt resursu. TÄ darbojas gan klienta bibliotÄkas virs API Kubernetes, gan arÄ« kubectl (nav pÄrsteigums, jo tas ir klienta bibliotÄkas apvalks, piezÄ«me tulkotÄjam).
Darboties stratÄÄ£iski
Visas komandas kubectl apply, edit un patch izmanto metodi PATCH HTTP pieprasÄ«jumos esoÅ”Ä resursa atjauninÄÅ”anai. Ja iedziļinÄmies komandu Ä«stenoÅ”anÄ, tad visÄs tiek izmantots pieejas resursu atjauninÄÅ”anai, lai gan komanda patch var izmantot arÄ« citas pieejas (sÄ«kÄk par to zemÄk). Pieeja strategic-merge patching cenÅ”as 'izdarÄ«t visu pareizi', apvienojot sniegto specifikÄciju ar esoÅ”o specifikÄciju. VairÄk konkrÄti, tÄ cenÅ”as apvienot gan objektus, gan masÄ«vus, kas nozÄ«mÄ, ka izmaiÅas parasti ir aditÄ«vas. PiemÄram, komandas izpilde patch ar jaunu vides mainÄ«go konteineru pod specifikÄcijÄ, noved pie tÄ, ka Å”is vides mainÄ«gais tiek pievienots esoÅ”ajiem vides mainÄ«gajiem, nevis tos pÄrraksta. Lai dzÄstu, izmantojot Å”o pieeju, vajadzÄtu piespiest parametra vÄrtÄ«bu iestatÄ«t uz null, sniegtajÄ specifikÄcijÄ. Kuri no komandÄm kubectl ir vislabÄk lietot atjauninÄÅ”anai?
Ja jÅ«s izveidojat un pÄrvaldÄt savus resursus, izmantojot kubectl apply, atjaunojot vienmÄr labÄk izmantot kubectl apply, lai kubectl varÄtu pÄrvaldÄ«t konfigurÄciju un pareizi sekot pieprasÄ«tajÄm izmaiÅÄm no lietoÅ”anas uz lietoÅ”anu. PriekÅ”rocÄ«ba vienmÄr izmantot apply ir tÄ, ka tas seko iepriekÅ”Äjo specifikÄciju, ļaujot tam zinÄt, kad specifikÄcijas Ä«paŔības un masÄ«va elementi ir skaidri dzÄsti. Tas ļauj izmantot apply lai izdzÄstu Ä«paŔības un masÄ«vu elementus, kamÄr parastÄ stratÄÄ£iskÄ apvienoÅ”ana nedarbosies. Komandas edit un patch neatjauno piezÄ«mes, kuras kubectl apply tiek izmantotas, lai sekotu lÄ«dz izmaiÅÄm, tÄpÄc visas izmaiÅas, kas tiek uzskaitÄ«tas un veiktas caur Kubernetes API, bet izdarÄ«tas, izmantojot komandas edit un patch, ir neredzamas turpmÄkajÄm komandÄm apply, proti, apply neizdzÄÅ” tÄs, pat ja tÄs neparÄdÄs ieveidoto specifikÄcijÄ apply (DokumentÄcijÄ teikts, ka edit un patch veic piezÄ«mju atjauninÄjumus, kas izmantoti apply, bet praksÄ ā nÄ).
Ja jÅ«s neizmantojat komandu apply, var izmantot kÄ edit, gan patch, izvÄloties to komandu, kas vislabÄk atbilst veiktajai izmaiÅai. Pievienojot un mainot specifikÄcijas Ä«paŔības, abi piekļuve ir aptuveni vienÄdi. IzslÄdzot specifikÄcijas Ä«paŔības vai masÄ«va elementus edit uzvedas kÄ vienreizÄja palaiÅ”ana apply, tajÄ skaitÄ seko, kÄda bija specifikÄcija pirms un pÄc rediÄ£ÄÅ”anas, tÄpÄc var skaidri izdzÄst Ä«paŔības un masÄ«vu elementus no resursa. Ir skaidri jÄnosaka Ä«paŔības vÄrtÄ«ba kÄ nullÄ specifikÄcijÄ patch, lai izdzÄstu to no resursa. MasÄ«va elementa izdzÄÅ”ana, izmantojot stratÄÄ£isku apvienoÅ”anas pieeju, ir sarežģītÄka, jo nepiecieÅ”ams izmantot apvienoÅ”anas direktÄ«vas. Skatiet citas pieejas atjauninÄÅ”anai zemÄk, lai izvÄlÄtos piemÄrotÄkas alternatÄ«vas.
Lai klienta bibliotÄkÄ Ä«stenotu atjauninÄjuma metodes, kas uzvedas lÄ«dzÄ«gi iepriekÅ” minÄtajÄm komandÄm kubectl, jÄizvirza content-type par application/strategic-merge-patch+json. Ja vÄlaties izdzÄst Ä«paŔības specifikÄcijÄ, ir skaidri jÄnosaka to vÄrtÄ«bas kÄ nullÄ lÄ«dzÄ«gi kubectl patch. Ja ir nepiecieÅ”ams izdzÄst masÄ«va elementus, jums jÄiekļauj apvienoÅ”anas direktÄ«vas atjauninÄÅ”anas specifikÄcijÄ vai jÄizmanto cita pieeja atjauninÄjumiem.
Citas pieejas atjauninÄjumiem
Kubernetes atbalsta divas citas pieejas atjauninÄÅ”anai: un . JSON merge patch pieÅem daļÄju Kubernetes specifikÄciju kÄ ievadi un atbalsta objektu apvienoÅ”anu, lÄ«dzÄ«gi kÄ pieeja strategic-merge patching. AtŔķirÄ«ba starp tÄm ir tÄda, ka tÄ atbalsta tikai masÄ«vu nomaiÅu, tostarp konteineru masÄ«vu pod specifikÄcijÄ. Tas nozÄ«mÄ, ka, izmantojot JSON merge patch, jums jÄsniedz pilnas specifikÄcijas visiem konteineriem gadÄ«jumÄ, ja ir izmaiÅas kÄdÄ no konteineru Ä«paŔībÄm. TÄdÄjÄdi Ŕī pieeja ir noderÄ«ga, lai noÅemtu elementus no masÄ«va specifikÄcijÄ. Komandu rindÄ jÅ«s varat izvÄlÄties JSON merge patch, izmantojot kubectl patch --type=merge. StrÄdÄjot ar Kubernetes API, jÄizmanto pieprasÄ«juma metode PATCH un iestatīŔana content-type par application/merge-patch+json.
JSON patch pieeja, nevis sniedzot daļÄju resursa specifikÄciju, izmanto izmaiÅu sniegÅ”anu, kuras vÄlaties veikt resursÄ, kÄ masÄ«vu, kur katrs masÄ«va elements attÄlo izmaiÅas, ko veicat resursÄ. Å Ä« pieeja ir elastÄ«gÄka un jaudÄ«gÄka izmaiÅu izteikÅ”anas metode, taÄu atspoguļo to, ka izmaiÅu saraksts ir atseviŔķÄ, Kubernetes nesaskanÄ«gÄ formÄtÄ, nevis sÅ«tot daļÄju resursa specifikÄciju. JÅ«s kubectl varat izvÄlÄties JSON patch, izmantojot kubectl patch --type=json. Izmantojot Kubernetes API, Ŕī pieeja darbojas, izmantojot pieprasÄ«juma metodi PATCH un iestatīŔana content-type par application/json-patch+json.
NepiecieÅ”ama pÄrliecÄ«ba ā izmantojam replace
Dažreiz ir nepiecieÅ”ama pÄrliecÄ«ba, ka resursÄ netiks veiktas izmaiÅas starp laiku, kad tiek lasÄ«ts resurss, un tÄ atjauninÄÅ”anu. Citiem vÄrdiem sakot, jÄbÅ«t droÅ”iem, ka visas izmaiÅas bÅ«s atomÄras. Å ÄdÄ gadÄ«jumÄ resursu atjauninÄÅ”anai labÄk izmantot replace. PiemÄram, ja ir ConfigMap ar skaitÄ«tÄju, kuru atjaunina vairÄki avoti, jÄbÅ«t pÄrliecinÄtiem, ka divi avoti vienlaikus neatsvaidzinÄs skaitÄ«tÄju, kas var novest pie atjauninÄjuma zuduma. Lai ilustrÄtu, iedomÄjieties scenÄriju, izmantojot pieeju patch:
- A un B iegÅ«st paÅ”reizÄjo resursa stÄvokli no API
- Katrs no viÅiem lokÄli atjaunina specifikÄciju, palielinot skaitÄ«tÄju par vienu, kÄ arÄ« pievienojot "A" vai "B", attiecÄ«gi, pie piezÄ«mes "updated-by"
- A nedaudz ÄtrÄk atjaunina resursu
- B atjaunina resursu
KÄ rezultÄtÄ A atjauninÄjums ir zaudÄts. PÄdÄjÄ operÄcija patch uzvar, skaitÄ«tÄjs palielinÄs par vienu, nevis diviem, un piezÄ«mes "updated-by" vÄrtÄ«ba beidzas ar "B" un nesatur "A". SalÄ«dzinÄsim iepriekÅ” minÄto ar to, kas notiek, kad atjauninÄjumi tiek veikti izmantojot pieeju replace:
- A un B iegÅ«st paÅ”reizÄjo resursa stÄvokli no API
- Katrs no viÅiem lokÄli atjaunina specifikÄciju, palielinot skaitÄ«tÄju par vienu, kÄ arÄ« pievienojot "A" vai "B", attiecÄ«gi, pie piezÄ«mes "updated-by"
- A nedaudz ÄtrÄk atjaunina resursu
- B mÄÄ£ina atjauninÄt resursu, taÄu API noraida atjauninÄjumu, jo resursa versija specifikÄcijÄ
replacenesakrÄ«t ar paÅ”reizÄjo resursa versiju Kubernetes, jo resursa versija tika palielinÄta, veicot aizvietoÅ”anas operÄciju no A puses.
IepriekÅ” minÄtajÄ gadÄ«jumÄ B bÅ«s jÄiegÅ«st resurss no jauna, jÄveic izmaiÅas jaunajÄ stÄvoklÄ« un jÄmÄÄ£ina vÄlreiz replace. RezultÄtÄ skaitÄ«tÄjs tiks palielinÄts par diviem, un piezÄ«me "updated-by" beigsies ar "AB".
IepriekÅ” minÄtais piemÄrs norÄda, ka, veicot replace tiek veikta pilnÄ«ga visu resursu aizvietoÅ”ana. SpecifikÄcija, kas tiek izmantota replace, jÄbÅ«t nevis daļÄjai, vai daļÄm kÄ apply, bet pilnai, iekļaujot pievienoÅ”anas resourceVersion metadatu specifikÄcijÄ. Ja jÅ«s neiekļÄvÄt resourceVersion vai sniegtÄ versija nav paÅ”reizÄjÄ, aizvietoÅ”ana tiks noraidÄ«ta. TÄdÄjÄdi labÄkÄ pieeja izmantoÅ”anai replace ir izlasÄ«t resursu, atjauninÄt to un nekavÄjoties aizvietot. Izmantojot kubectl, tas var izskatÄ«ties Å”Ädi:
$ kubectl get deployment my-deployment -o json
| jq '.spec.template.spec.containers[0].env[1].value = "new value"'
| kubectl replace -f -VÄrts atzÄ«mÄt, ka nÄkamÄs divas komandas, kas izpildÄ«tas secÄ«gi, izpildÄ«sies veiksmÄ«gi, jo deployment.yaml nesatur Ä«paÅ”umu .metadata.resourceVersion
$ kubectl create -f deployment.yaml
$ kubectl replace -f deployment.yamlIzskatÄs, ka tas ir pretrunÄ ar to, kas tika teikts iepriekÅ”, proti, "pievienojot resourceVersion metadatiem specifikÄcijÄ". Apgalvot tÄ ir nepareizi? NÄ, tÄ nav, jo, ja kubectl pamanÄ«s, ka jÅ«s neesat norÄdÄ«jis resourceVersion, tas izlasÄ«s to no resursa un pievienos norÄdÄ«tajai specifikÄcijai un tikai tad izpildÄ«s replace. Å
emot vÄrÄ, ka tas potenciÄli ir bÄ«stami, ja paļaujas uz atomaritÄti, Ŕī burvÄ«ba strÄdÄ pilnÄ«bÄ no kubectl, nevajadzÄtu uz to paļauties, lietojot klientu bibliotÄkas, kas strÄdÄ ar API. Å ajÄ gadÄ«jumÄ jums bÅ«s jÄizlasa paÅ”reizÄjÄ resursa specifikÄcija, jÄatjaunina tÄ un pÄc tam jÄveic PUT pieprasÄ«jums.
Nav iespÄjams veikt patch ā mÄs veicam replace
Dažreiz ir nepiecieÅ”ami izmaiÅas, kuras nevar apstrÄdÄt API. Å Ädos gadÄ«jumos var piespiedu kÄrtÄ aizstÄt resursus, tos izdzÄÅ”ot un atkal izveidojot. To var izdarÄ«t ar kubectl replace --force. Komandas izpilde nekavÄjoties izdzÄÅ” resursus un pÄc tam tos izveido no sniegtÄs specifikÄcijas. API nav "piespiedu aizstÄÅ”anas" apstrÄdÄtÄja, un, lai to izdarÄ«tu caur API, ir jÄveic divas darbÄ«bas. Vispirms jÄdara izdzÄst resurss, iestatot tam gracePeriodSeconds uz nulli (0) un propagationPolicy uz āBackgroundā, un pÄc tam atkal jÄizveido Å”is resurss ar vÄlamo specifikÄciju.
BrÄ«dinÄjums: Ŕī pieeja potenciÄli ir bÄ«stama, var novest pie nenoteikta stÄvokļa
Apply servera pusÄ
KÄ jau minÄts iepriekÅ”, Kubernetes izstrÄdÄtÄji strÄdÄ pie loÄ£ikas Ä«stenoÅ”anas apply no kubectl Kubernetes API. LoÄ£ika apply ir pieejama Kubernetes 1.18 versijÄ, izmantojot kubectl apply --server-side vai caur API, izmantojot metodi PATCH ar content-type application/apply-patch+YAML.
PiezÄ«me: JSON arÄ« ir derÄ«gs YAML, tÄpÄc specifikÄciju var nosÅ«tÄ«t JSON formÄtÄ, pat ja
content-typetiksapplication/apply-patch+yaml.
TurklÄt, loÄ£ika kubectl ir pieejama visiem caur API, apply servera pusÄ uzrauga atbildÄ«gos par specifikÄcijas laukiem, tÄdÄjÄdi ļaujot droÅ”u vairÄku piekļuvi tÄs konfliktu bezredaktÄÅ”anai. Citiem vÄrdiem sakot, ja apply servera pusÄ tiks iegÅ«ti plaÅ”Äki izplatÄ«jumi, parÄdÄ«sies universÄla droÅ”a resursu pÄrvaldÄ«bas saskarne dažÄdiem klientiem, piemÄram, kubectl, Pulumi vai Terraform, GitOps, kÄ arÄ« pielÄgotiem skriptiem, kas izmanto klientu bibliotÄkas.
SecinÄjumi
Ceru, ka Å”is Ä«sais pÄrskats par dažÄdajiem veidiem, kÄ atjauninÄt resursus klasteros, bija noderÄ«gs jums. Ir noderÄ«gi zinÄt, ka nav tikai āapplyā pret āreplaceā, jo resursu var atjauninÄt, izmantojot apply, edit, patch vai replace. Galu galÄ katra pieeja ir piemÄrota savai lietoÅ”anai. AtomÄrÄm izmaiÅÄm labÄk izmantot replace, pretÄjÄ gadÄ«jumÄ ir jÄizmanto strategic-merge patch, izmantojot apply. Visbeidzot, es ceru, ka jÅ«s sapratÄt, ka nevajadzÄtu paļauties uz Google vai StackOverflow, meklÄjot "kubernetes apply vs replace". Vismaz lÄ«dz brÄ«dim, kad Å”is raksts aizstÄs paÅ”reizÄjo atbildi.

Avots: habr.com
