Pareizs Kubernetes Apply, Replace un Patch salīdzinājums

Kubernetes resursu atjaunināŔanai ir vairākas iespējas: lietot, rediģēt, labot un aizstāt. Pastāv neskaidrÄ«bas par to, ko katrs dara un kad tos izmantot. Izdomāsim.

Pareizs Kubernetes Apply, Replace un Patch salīdzinājums

Ja meklēt Google atrodas frāze "kubernetes lietot vs aizstāt". atbilde uz StackOverflow, kas nav pareizi. Meklējot "kubernetes lietot vs ielāpu" pirmā saite ir dokumentācija kubectl patch, kas neietver salÄ«dzināŔanu apply Šø patch. Å ajā rakstā tiks aplÅ«kotas dažādas iespējas, kā arÄ« katra pareiza izmantoÅ”ana.

Kubernetes resursa dzÄ«ves cikla laikā (pakalpojums, izvietoÅ”ana, iekļūŔana utt.) dažreiz ir jāmaina, jāpievieno vai jānoņem daži Ŕī resursa rekvizÄ«ti. Piemēram, pievienojiet piezÄ«mi, palieliniet vai samaziniet kopiju skaitu.

Kubernetes CLI

Ja jÅ«s jau strādājat ar Kubernetes klasteriem, izmantojot CLI, jÅ«s jau esat iepazinies ar to apply Šø edit. Komanda apply nolasa resursa specifikāciju no faila un uztaisa Kubernetes klasterim "upsert", t.i. izveido resursu, ja tas neeksistē, un atjaunina to, ja tāds pastāv. Komanda edit nolasa resursu, izmantojot API, pēc tam ieraksta resursa specifikāciju vietējā failā, kas pēc tam tiek atvērts teksta redaktorā. Pēc faila rediģēŔanas un saglabāŔanas, kubectl nosÅ«tÄ«s atpakaļ veiktās izmaiņas, izmantojot API, kas rÅ«pÄ«gi piemēros Ŕīs izmaiņas resursam.

Ne visi zina komandas patch Šø replace. Komanda patch ļauj mainÄ«t daļu resursa specifikācijas, komandrindā nodroÅ”inot tikai mainÄ«to daļu. Komanda replace darbojas tāpat kā edit, bet viss ir jādara manuāli: jums ir jālejupielādē paÅ”reizējā resursa specifikācijas versija, piemēram, izmantojot kubectl get -o yaml, rediģējiet to un pēc tam izmantojiet replace lai atjauninātu resursu atbilstoÅ”i mainÄ«tai specifikācijai. Komanda replace nedarbosies, ja starp resursa lasÄ«Å”anu un aizstāŔanu ir notikuÅ”as izmaiņas.

Kubernetes API

JÅ«s droÅ”i vien esat iepazinuÅ”ies ar metodēm CoreV1().Pods().Update(), replaceNamespacedService vai patch_namespaced_deployment, ja strādājat ar kopām, izmantojot klienta bibliotēka Kubernetes API izmantojot kādu programmÄ“Å”anas valodu. Bibliotēka apstrādā Ŕīs metodes, izmantojot HTTP pieprasÄ«jumus, izmantojot metodes PUT Šø PATCH... Kurā vietā update Šø replace izmantot PUTUn patch, lai cik triviāli tas arÄ« nebÅ«tu, lietojumi PATCH.

JāatzÄ«mē, ka kubectl darbojas arÄ« ar klasteriem, izmantojot API. Citiem vārdiem sakot, kubectlir iesaiņojums klienta bibliotēkas augÅ”pusē Go valodai, kas lielā mērā nodroÅ”ina iespēju nodroÅ”ināt apakÅ”komandas kompaktākā un lasāmākā formā papildus standarta API iespējām. Piemēram, kā jÅ«s, iespējams, jau pamanÄ«jāt, metode apply nebija minēts iepriekŔējā punktā. PaÅ”laik (2020. gada maijs, apm. tulkotājs) visa loÄ£ika kubectl apply, t.i. neesoÅ”u resursu izveidoÅ”ana un esoÅ”o atjaunināŔana, darbojas pilnÄ«bā koda pusē kubectl. Tiek pieliktas pÅ«les par loÄ£isko pārsÅ«tÄ«Å”anu apply uz API pusi, taču tas joprojām ir beta versijā. Tālāk rakstÄ«Å”u sÄ«kāk.

Pēc noklusējuma ielāps

Vislabāk lietots patch, ja vēlaties atjaunināt resursu. Tādā veidā abas klientu bibliotēkas darbojas papildus Kubernetes API un kubectl (nav pārsteidzoÅ”i, jo tas ir klienta bibliotēkas iesaiņojums, apm. tulkotājs).

Strādājiet stratēģiski

Visas komandas kubectl apply, edit Šø patch izmantot metodi PATCH HTTP pieprasÄ«jumos atjaunināt esoÅ”u resursu. Ja sÄ«kāk iedziļināties komandu ievieÅ”anā, tad visas izmanto pieeju stratēģiskā sapludināŔana lai atjauninātu resursus, lai gan komanda patch var izmantot citas pieejas (vairāk par to tālāk). Stratēģiskās sapludināŔanas ielāpu pieeja mēģina "labot", apvienojot piegādāto specifikāciju ar esoÅ”o specifikāciju. PrecÄ«zāk, tas mēģina apvienot gan objektus, gan masÄ«vus, kas nozÄ«mē, ka izmaiņas mēdz bÅ«t aditÄ«vas. Piemēram, palaižot komandu patch ar jaunu vides mainÄ«go pod konteinera specifikācijā, Å”is vides mainÄ«gais tiek pievienots esoÅ”ajiem vides mainÄ«gajiem, nevis tos pārrakstÄ«ts. Lai noņemtu, izmantojot Å”o pieeju, norādÄ«tajā specifikācijā parametra vērtÄ«ba ir jāpiespiež nullei. Kura no komandām kubectl Vai to vislabāk izmantot atjaunināŔanai?

Ja veidojat un pārvaldāt savus resursus, izmantojot kubectl apply, atjauninot labāk vienmēr izmantot kubectl applyLÄ«dz kubectl varētu pārvaldÄ«t konfigurāciju un pareizi izsekot pieprasÄ«tajām izmaiņām no vienas programmas uz citu. PriekÅ”rocÄ«ba vienmēr izmantojiet apply ir tas, ka tas seko iepriekÅ” lietotajai specifikācijai, ļaujot tai zināt, kad specifikācijas rekvizÄ«ti un masÄ«va elementi ir skaidri noņemti. Tas ļauj izmantot apply lai noņemtu rekvizÄ«tus un masÄ«va elementus, kamēr parasta stratēģiskā sapludināŔana nedarbosies. Komandas edit Šø patch neatjauniniet atzÄ«mē, ka kubectl apply izmanto, lai izsekotu tās izmaiņām, tāpēc visas izmaiņas, kas tiek izsekotas un veiktas, izmantojot Kubernetes API, bet tiek veiktas, izmantojot komandas edit Šø patch, neredzams nākamajām komandām applyTas ir, apply nenoņem tos pat tad, ja tie nav norādÄ«ti ievades specifikācijā apply (Dokumentācijā tas teikts edit Šø patch veikt lietoto piezÄ«mju atjauninājumus apply, bet praksē - nē).

Ja neizmantojat komandu apply, var izmantot kā editUn patch, izvēloties komandu, kas vislabāk atbilst veiktajām izmaiņām. Pievienojot un mainot MK rekvizÄ«tus, abas pieejas ir aptuveni vienādas. DzÄ“Å”ot specifikācijas rekvizÄ«tus vai masÄ«va elementus edit darbojas kā vienreizēja palaiÅ”ana apply, tostarp sekot lÄ«dzi tam, kāda specifikācija bija pirms un pēc tās rediģēŔanas, lai jÅ«s varētu skaidri noņemt rekvizÄ«tus un masÄ«va elementus no resursa. Specifikācijā rekvizÄ«ta vērtÄ«ba ir skaidri jāiestata uz nulli patchlai to noņemtu no resursa. MasÄ«va elementa noņemÅ”ana, izmantojot stratēģiskās sapludināŔanas ielāpu, ir sarežģītāka, jo tam ir jāizmanto sapludināŔanas direktÄ«vas. Skatiet tālāk citas jaunināŔanas pieejas, lai iegÅ«tu dzÄ«votspējÄ«gākas alternatÄ«vas.

Lai klienta bibliotēkā ieviestu atjaunināŔanas metodes, kas darbojas lÄ«dzÄ«gi iepriekÅ” minētajām komandām kubectl, jāiestata pieprasÄ«jumos content-type Š² application/strategic-merge-patch+json. Ja vēlaties noņemt rekvizÄ«tus no specifikācijas, jums ir skaidri jāiestata to vērtÄ«bas uz nulli lÄ«dzÄ«gā veidā kubectl patch. Ja jums ir jānoņem masÄ«va elementi, atjauninājumu specifikācijā ir jāiekļauj sapludināŔanas direktÄ«vas vai jāizmanto cita pieeja atjauninājumiem.

Citas pieejas atjauninājumiem

Kubernetes atbalsta divas citas atjaunināŔanas pieejas: JSON sapludināŔanas ielāps Šø JSON ielāps. JSON sapludināŔanas ielāpu pieeja izmanto daļēju Kubernetes specifikāciju kā ievadi un atbalsta objektu sapludināŔanu, kas ir lÄ«dzÄ«gi stratēģiskās sapludināŔanas ielāpu pieejai. AtŔķirÄ«ba starp abiem ir tāda, ka tā atbalsta tikai masÄ«va nomaiņu, ieskaitot konteinera masÄ«vu pod specifikācijā. Tas nozÄ«mē, ka, izmantojot JSON sapludināŔanas ielāpu, jums ir jānodroÅ”ina pilnÄ«gas specifikācijas visiem konteineriem, ja mainās kāda konteinera rekvizÄ«ts. Tāpēc Ŕī pieeja ir noderÄ«ga elementu noņemÅ”anai no masÄ«va masÄ«vā. Komandrindā varat atlasÄ«t JSON sapludināŔanas ielāpu, izmantojot kubectl patch --type=merge. Strādājot ar Kubernetes API, jāizmanto pieprasÄ«juma metode PATCH un uzstādÄ«Å”ana content-type Š² application/merge-patch+json.

JSON ielāpu pieeja, nevis nodroÅ”ina daļēju resursa specifikāciju, izmanto resursā veicamo izmaiņu nodroÅ”ināŔanu kā masÄ«vu, kurā katrs masÄ«va elements atspoguļo resursā veikto izmaiņu aprakstu. Å Ä« pieeja ir elastÄ«gāks un jaudÄ«gāks veids, kā izteikt veiktās izmaiņas, taču par veikto izmaiņu uzskaitÄ«Å”anu atseviŔķā formātā, kas nav Kubernetes, nevis tiek nosÅ«tÄ«ta daļēja resursa specifikācija. IN kubectl Varat atlasÄ«t JSON ielāpu, izmantojot kubectl patch --type=json. Izmantojot Kubernetes API, Ŕī pieeja darbojas, izmantojot pieprasÄ«juma metodi PATCH un uzstādÄ«Å”ana content-type Š² application/json-patch+json.

Mums ir vajadzÄ«ga pārliecÄ«ba ā€” izmantojiet nomaiņu

Dažos gadÄ«jumos jums ir jāpārliecinās, ka starp resursa lasÄ«Å”anas un atjaunināŔanas brÄ«di resursā netiek veiktas nekādas izmaiņas. Citiem vārdiem sakot, jums jāpārliecinās, ka visas izmaiņas tiks veiktas atomu. Å ajā gadÄ«jumā, lai atjauninātu resursus, jums vajadzētu izmantot replace. Piemēram, ja jums ir ConfigMap ar skaitÄ«tāju, kuru atjaunina vairāki avoti, jums jābÅ«t pārliecinātiem, ka divi avoti vienlaikus neatjaunina skaitÄ«tāju, izraisot atjauninājuma pazaudÄ“Å”anu. Lai demonstrētu, iedomājieties notikumu secÄ«bu, izmantojot pieeju patch:

  • A un B iegÅ«st paÅ”reizējo resursa stāvokli no API
  • Katrs no tiem lokāli atjaunina specifikāciju, palielinot skaitÄ«tāju par vienu un pievienojot piezÄ«mei "atjaunināts" attiecÄ«gi "A" vai "B".
  • Un tas nedaudz ātrāk atjaunina resursu
  • B atjaunina resursu

Tā rezultātā tiek zaudēts atjauninājums A. Pēdējā operācija patch uzvar, skaitÄ«tājs tiek palielināts par vienu, nevis diviem, un piezÄ«mes "atjaunināja" 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 Å”o pieeju replace:

  • A un B iegÅ«st paÅ”reizējo resursa stāvokli no API
  • Katrs no tiem lokāli atjaunina specifikāciju, palielinot skaitÄ«tāju par vienu un pievienojot piezÄ«mei "atjaunināts" attiecÄ«gi "A" vai "B".
  • Un tas nedaudz ātrāk atjaunina resursu
  • B mēģina atjaunināt resursu, bet API noraidÄ«ja atjauninājumu, jo resursa versija ir norādÄ«ta specifikācijā replace neatbilst paÅ”reizējai Kubernetes resursa versijai, jo resursa versiju palielināja A aizstāŔanas darbÄ«ba.

IepriekÅ” minētajā gadÄ«jumā B bÅ«s atkārtoti jāiegÅ«st resurss, jāveic izmaiņas jaunajā stāvoklÄ« un jāmēģina vēlreiz replace. Tādējādi skaitÄ«tājs tiks palielināts par diviem un piezÄ«mes "atjaunināja" beigās tiks iekļauts "AB".

IepriekÅ” minētais piemērs norāda, ka izpildes laikā replace Viss resurss ir pilnÄ«bā aizstāts. Izmantotā specifikācija replace, nedrÄ«kst bÅ«t daļēja vai pa daļām, kā norādÄ«ts apply, bet pilnÄ«gs, ieskaitot papildinājumu resourceVersion specifikācijas metadatos. Ja neesat iespējojis resourceVersion vai jÅ«su sniegtā versija nav aktuāla, aizstāŔana tiks noraidÄ«ta. Tāpēc labākā pieeja lietoÅ”anai ir replace ā€“ izlasiet resursu, atjauniniet to un nekavējoties nomainiet. Izmantojot kubectl, tas varētu izskatÄ«ties Ŕādi:

$ kubectl get deployment my-deployment -o json 
    | jq '.spec.template.spec.containers[0].env[1].value = "new value"' 
    | kubectl replace -f -

Ir vērts atzÄ«mēt, ka divas sekojoŔās komandas, kas tiek izpildÄ«tas secÄ«gi, tiks veiksmÄ«gi izpildÄ«tas kopÅ” deployment.yaml nesatur Ä«paÅ”umu .metadata.resourceVersion

$ kubectl create -f deployment.yaml
$ kubectl replace -f deployment.yaml

Tas it kā bÅ«tu pretrunā ar iepriekÅ” teikto, t.i. "pievienojot resourceVersion specifikācijas metadatos." Vai tā teikt ir nepareizi? Nē, tā nav, jo, ja kubectl atzÄ«mē, ka jÅ«s nenorādÄ«jāt resourceVersion, tas nolasÄ«s to no resursa un pievienos jÅ«su norādÄ«tajai specifikācijai un tikai pēc tam izpildÄ«s replace. Tā kā tas ir potenciāli bÄ«stami, ja paļaujaties uz atomitāti, maÄ£ija darbojas tikai no sāniem kubectl, jums nevajadzētu uz to paļauties, izmantojot klientu bibliotēkas, kas darbojas ar API. Å ajā gadÄ«jumā jums bÅ«s jāizlasa paÅ”reizējā resursa specifikācija, jāatjaunina un pēc tam jāizpilda PUT pieprasÄ«jumu.

JÅ«s nevarat veikt ielāpu ā€” mēs veicam nomaiņu

Dažreiz jums ir jāveic dažas izmaiņas, kuras nevar apstrādāt API. Šādos gadÄ«jumos varat piespiest aizstāt resursu, to dzÄ“Å”ot un izveidojot no jauna. Tas tiek darÄ«ts, izmantojot kubectl replace --force. Palaižot komandu, resursi tiek nekavējoties noņemti un pēc tam tiek atkārtoti izveidoti no piegādātās specifikācijas. API nav ā€œpiespiedu nomaiņasā€ apdarinātāja, un, lai to izdarÄ«tu, izmantojot API, jums ir jāveic divas darbÄ«bas. Vispirms jums ir jāizdzÄ“Å” resurss, iestatot to gracePeriodSeconds uz nulli (0) un propagationPolicy sadaļā ā€œFonsā€ un pēc tam atkārtoti izveidojiet Å”o resursu ar vēlamo specifikāciju.

Brīdinājums: Ŕī pieeja ir potenciāli bīstama un var izraisīt nenoteiktu stāvokli.

Pieteikties servera pusē

Kā minēts iepriekÅ”, Kubernetes izstrādātāji strādā pie loÄ£ikas ievieÅ”anas apply no kubectl Kubernetes API. LoÄ£ika apply pieejams Kubernetes 1.18 caur kubectl apply --server-side vai izmantojot API, izmantojot metodi PATCH с content-type application/apply-patch+YAML.

Piezīme. JSON ir derīgs arī YAML, tāpēc varat nosūtīt specifikāciju kā JSON, pat ja content-type griba application/apply-patch+yaml.

Papildus Å”ai loÄ£ikai kubectl kļūst pieejams ikvienam, izmantojot API, apply servera pusē seko lÄ«dzi tam, kurÅ” ir atbildÄ«gs par specifikācijas laukiem, tādējādi nodroÅ”inot droÅ”u vairākkārtēju piekļuvi tās rediģēŔanai bez konfliktiem. Citiem vārdiem sakot, ja apply servera pusē kļūs arvien izplatÄ«tāks, parādÄ«sies universāls droÅ”as resursu pārvaldÄ«bas interfeiss dažādiem klientiem, piemēram, kubectl, Pulumi vai Terraform, GitOps, kā arÄ« paÅ”u rakstÄ«ti skripti, izmantojot klientu bibliotēkas.

Rezultāti

Es ceru, ka Å”is Ä«sais pārskats par dažādiem veidiem, kā atjaunināt resursus klasteros, jums bija noderÄ«gs. Ir labi zināt, ka tas nav tikai lietot pret aizstāŔanu; ir iespējams atjaunināt resursu, izmantojot lietotni, rediģēt, labot vai aizstāt. Galu galā principā katrai pieejai ir sava piemēroÅ”anas joma. Atomu izmaiņām ir vēlams aizstāt; pretējā gadÄ«jumā izmantojiet stratēģiskās sapludināŔanas ielāpu, izmantojot lietotni. Es ceru, ka vismaz jÅ«s sapratÄ«sit, ka nevarat uzticēties Google vai StackOerflow, meklējot ā€œkubernetes piemērot vai aizstātā€. Vismaz lÄ«dz brÄ«dim, kad Å”is raksts aizstās paÅ”reizējo atbildi.

Pareizs Kubernetes Apply, Replace un Patch salīdzinājums

Avots: www.habr.com

Pievieno komentāru