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.
Ja 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 PUT
Šø PATCH
... KurÄ vietÄ update
Šø replace
izmantot PUT
Un 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, kubectl
ir 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 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 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 apply
LÄ«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 apply
Tas 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Ä edit
Un 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 patch
lai 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: 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
gribaapplication/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.
Avots: www.habr.com