Husto nga Pagtandi sa Kubernetes I-apply, Ilisan ug Patch

Ang Kubernetes adunay daghang mga kapilian sa pag-update sa mga kapanguhaan: pag-apply, pag-edit, pag-patch ug pag-ilis. Adunay kalibog kon unsa ang gibuhat sa matag usa ug kanus-a kini gamiton. Atong hisgotan kini.

Husto nga Pagtandi sa Kubernetes I-apply, Ilisan ug Patch

kon pangitaa sa Google ang hugpong sa mga pulong "kubernetes apply vs replace" nahimutang tubag sa StackOverflow, nga dili husto. Sa pagpangita "kubernetes apply vs patch" ang unang link mao ang dokumentasyon para sa kubectl patch, nga wala maglakip sa pagtandi apply ΠΈ patch. Kini nga artikulo magtan-aw sa lainlaing mga kapilian, ingon man ang husto nga paggamit sa matag usa.

Atol sa lifecycle sa usa ka Kubernetes nga kapanguhaan (serbisyo, deployment, ingress, ug uban pa), usahay kinahanglan nimo nga usbon, idugang o tangtangon ang pipila ka mga kabtangan niini nga kapanguhaan. Pananglitan, pagdugang usa ka nota, pagdugang o pagkunhod sa gidaghanon sa mga replika.

Kubernetes CLI

Kung nagtrabaho ka na sa mga cluster sa Kubernetes pinaagi sa CLI, pamilyar ka na apply ΠΈ edit. Team apply mobasa sa resource specification gikan sa file ug maghimo og "upsert" sa Kubernetes cluster, i.e. nagmugna sa kapanguhaan kung wala kini ug gi-update kini kung naa. Team edit nagbasa sa usa ka kapanguhaan pinaagi sa API, dayon isulat ang detalye sa kapanguhaan sa usa ka lokal nga file, nga giablihan dayon sa usa ka editor sa teksto. Human nimo i-edit ug i-save ang file, kubectl ipadala pagbalik ang mga pagbag-o nga gihimo pinaagi sa API, nga maampingon nga magamit kini nga mga pagbag-o sa kapanguhaan.

Dili tanan nahibalo sa mga sugo patch ΠΈ replace. Team patch nagtugot kanimo sa pag-usab sa bahin sa usa ka espesipikasyon sa kahinguhaan, nga naghatag lamang sa nabag-o nga bahin sa command line. Team replace nagtrabaho sama sa edit, apan ang tanan kinahanglan nga buhaton sa mano-mano: kinahanglan nimo nga i-download ang karon nga bersyon sa detalye sa kapanguhaan, pananglitan, gamit ang kubectl get -o yaml, usba kini, dayon gamita replace sa pag-update sa usa ka kapanguhaan sumala sa usa ka giusab nga detalye. Team replace dili molihok kung adunay mga pagbag-o nga nahitabo tali sa pagbasa ug pag-ilis sa kapanguhaan.

Kubernetes API

Tingali pamilyar ka sa mga pamaagi CoreV1().Pods().Update(), replaceNamespacedService o patch_namespaced_deployment, kung nagtrabaho ka sa mga cluster pinaagi sa librarya sa kliyente alang sa Kubernetes API gamit ang pipila ka programming language. Gidumala sa librarya kini nga mga pamaagi pinaagi sa mga hangyo sa HTTP gamit ang mga pamaagi PUT ΠΈ PATCH... Diin update ΠΈ replace paggamit PUTug patch, bisan unsa ka gamay kini, gigamit PATCH.

Kini angay nga isulat kana kubectl nagtrabaho usab sa mga cluster pinaagi sa API. Sa laing pagkasulti, kubectlmao ang usa ka wrapper sa ibabaw sa librarya sa kliyente alang sa Go nga pinulongan, nga kadaghanan naghatag og abilidad sa paghatag og mga subcommands sa usa ka mas compact ug mabasa nga porma dugang pa sa standard nga mga kapabilidad sa API. Pananglitan, ingon nga mahimo nimong namatikdan, ang pamaagi apply wala hisgoti sa ibabaw sa miaging parapo. Sa pagkakaron (Mayo 2020, gibanabana. tighubad) tanan nga lohika kubectl apply, i.e. paghimo sa dili-maglungtad nga mga kapanguhaan ug pag-update sa mga anaa na, nagtrabaho sa hingpit sa kilid sa code kubectl. Ang mga paningkamot gihimo sa pagbalhin sa lohika apply sa bahin sa API, apan kini anaa pa sa beta. Akong isulat ang mas detalyado sa ubos.

Patch pinaagi sa default

Labing maayo nga gigamit patch, kung gusto nimo i-update ang kapanguhaan. Ingon niini kung giunsa ang duha nga mga librarya sa kliyente nagtrabaho sa ibabaw sa Kubernetes API ug kubectl (Dili ikatingala, tungod kay kini usa ka wrapper alang sa librarya sa kliyente, gibanabana. tighubad).

Trabaho sa estratehikong paagi

Tanang team kubectl apply, edit ΠΈ patch gamita ang pamaagi PATCH sa HTTP hangyo sa pag-update sa usa ka kasamtangan nga kapanguhaan. Kung gisusi nimo ang pagpatuman sa mga mando sa mas detalyado, nan ang tanan niini naggamit sa pamaagi estratehikong paghiusa nga patching aron ma-update ang mga kapanguhaan, bisan kung ang mando patch mahimong mogamit ug ubang mga pamaagi (dugang niini sa ubos). Ang estratehikong paghiusa nga pamaagi sa pag-patch misulay sa "pagkuha niini nga husto" pinaagi sa paghiusa sa gihatag nga espesipikasyon sa kasamtangan nga espesipikasyon. Labaw nga espesipiko, gisulayan niini ang paghiusa sa mga butang ug mga array, nga nagpasabut nga ang mga pagbag-o lagmit nga makadugang. Pananglitan, ang pagpadagan sa mando patch nga adunay bag-ong environment variable sa pod container specification, hinungdan nga ang environment variable idugang ngadto sa kasamtangan nga environment variables kay sa overwriting kanila. Aron matangtang gamit kini nga pamaagi, kinahanglan nimo nga pugson ang kantidad sa parameter nga null sa gihatag nga detalye. Kinsa sa mga team kubectl Labing maayo ba nga gamiton alang sa pag-update?

Kung maghimo ka ug magdumala sa imong mga kapanguhaan gamit kubectl apply, kung mag-update mas maayo nga gamiton kanunay kubectl applysa kubectl makadumala sa configuration ug sa hustong paagi masubay ang gihangyo nga mga kausaban gikan sa aplikasyon ngadto sa aplikasyon. Bentaha kanunay gamiton apply mao nga kini nagsubay sa usa ka gigamit nga espesipikasyon kaniadto, nga nagtugot niini nga mahibal-an kung kanus-a ang mga kabtangan sa espesipikasyon ug mga elemento sa han-ay klaro nga gikuha. Kini nagtugot kanimo sa paggamit apply aron makuha ang mga kabtangan ug mga elemento sa array, samtang ang usa ka normal nga estratehikong paghiusa dili molihok. Mga team edit ΠΈ patch ayaw pag-update sa mga nota niana kubectl apply gigamit aron masubay ang mga pagbag-o niini, busa ang bisan unsang mga pagbag-o nga gisubay ug gihimo pinaagi sa Kubernetes API, apan gihimo pinaagi sa mga mando edit ΠΈ patch, dili makita sa sunod nga mga sugo apply, nga mao apply dili tangtangon sila bisan kung dili kini makita sa detalye sa input alang sa apply (Ang dokumentasyon nag-ingon nga edit ΠΈ patch paghimo og mga update sa mga nota nga gigamit apply, apan sa praktis - dili).

Kung dili nimo gamiton ang mando apply, mahimong gamiton isip edit, ug patch, pagpili sa sugo nga labing haum sa pagbag-o nga gihimo. Kung gidugang ug gibag-o ang mga kabtangan sa BOM, parehas ang parehas nga mga pamaagi. Kung gitangtang ang mga kabtangan sa espesipikasyon o mga elemento sa array edit naggawi sama sa usa ka higayon nga paglansad apply, apil ang pagsubay kung unsa ang espesipikasyon sa wala pa ug pagkahuman sa pag-edit, aron klaro nimong makuha ang mga kabtangan ug mga elemento sa array gikan sa usa ka kapanguhaan. Kinahanglan nimo nga tin-aw nga itakda ang kantidad sa kabtangan nga null sa detalye alang sa patcharon makuha kini gikan sa kapanguhaan. Ang pagtangtang sa usa ka elemento sa array gamit ang strategic-merge patching mas komplikado tungod kay kini nagkinahanglan sa paggamit sa merge nga mga direktiba. Tan-awa ang uban pang mga pamaagi sa pag-upgrade sa ubos para sa mas praktikal nga mga alternatibo.

Aron ipatuman ang mga pamaagi sa pag-update sa librarya sa kliyente nga parehas ang pamatasan sa mga mando sa ibabaw kubectl, kinahanglan ibutang sa mga hangyo content-type Π² application/strategic-merge-patch+json. Kung gusto nimong tangtangon ang mga kabtangan sa usa ka detalye, kinahanglan nimo nga klaro nga itakda ang ilang mga kantidad sa null sa parehas nga paagi. kubectl patch. Kung kinahanglan nimo nga tangtangon ang mga elemento sa array, kinahanglan nimo nga ilakip ang mga direktiba sa paghiusa sa detalye sa pag-update o mogamit usa ka lahi nga pamaagi sa mga update.

Uban pang mga pamaagi sa pag-update

Gisuportahan sa Kubernetes ang duha pa nga mga pamaagi sa pag-update: JSON merge patch ΠΈ JSON patch. Ang JSON merge patch approach nagkuha ug partial Kubernetes specification isip input ug nagsuporta sa paghiusa sa mga butang susama sa strategic-merge patching approach. Ang kalainan tali sa duha mao nga kini nagsuporta lamang sa array replacement, lakip na ang container array sa pod specification. Kini nagpasabot nga sa diha nga ang paggamit sa usa ka JSON merge patch, kamo kinahanglan nga mohatag og kompleto nga mga detalye alang sa tanan nga mga sudlanan sa kaso sa bisan unsa nga kabtangan sa bisan unsa nga sudlanan mausab. Busa kini nga pamaagi mapuslanon alang sa pagtangtang sa mga elemento gikan sa usa ka laray sa usa ka BOM. Sa command line mahimo nimong pilion ang JSON merge patch gamit kubectl patch --type=merge. Kung nagtrabaho kauban ang Kubernetes API, kinahanglan nimo gamiton ang pamaagi sa paghangyo PATCH ug pag-instalar content-type Π² application/merge-patch+json.

Ang JSON patch approach, kay sa paghatag ug partial specification sa usa ka resource, naggamit sa paghatag sa mga pagbag-o nga gusto nimong himoon sa resource isip array, diin ang matag elemento sa array nagrepresentar sa deskripsyon sa kausaban nga gihimo sa resource. Kini nga pamaagi usa ka mas flexible ug gamhanan nga paagi sa pagpahayag sa mga pagbag-o nga gihimo, apan sa kantidad sa paglista sa mga pagbag-o nga gihimo sa usa ka bulag, dili-Kubernetes nga pormat, imbes nga magpadala usa ka partial nga detalye sa kapanguhaan. SA kubectl mahimo nimong pilion ang JSON patch gamit kubectl patch --type=json. Kung gigamit ang Kubernetes API, kini nga pamaagi magamit gamit ang pamaagi sa paghangyo PATCH ug pag-instalar content-type Π² application/json-patch+json.

Kinahanglan namon ang pagsalig - gamita ang pag-ilis

Sa pipila ka mga kaso, kinahanglan nimo nga masiguro nga walay mga pagbag-o nga gihimo sa usa ka kapanguhaan tali sa panahon nga ang kapanguhaan gibasa ug kung kini gi-update. Sa laing pagkasulti, kinahanglan nimong siguroon nga ang tanan nga mga pagbag-o mahitabo atomiko. Sa kini nga kaso, aron ma-update ang mga kapanguhaan nga kinahanglan nimong gamiton replace. Pananglitan, kung ikaw adunay usa ka ConfigMap nga adunay usa ka counter nga gi-update sa daghang mga gigikanan, kinahanglan nga sigurado ka nga ang duha nga mga gigikanan dili mag-update sa counter sa parehas nga oras, hinungdan nga nawala ang pag-update. Aron ipakita, hunahunaa ang usa ka han-ay sa mga panghitabo gamit ang pamaagi patch:

  • A ug B makuha ang kasamtangan nga kahimtang sa kapanguhaan gikan sa API
  • Ang matag usa lokal nga nag-update sa detalye pinaagi sa pagdugang sa counter sa usa ug pagdugang usab sa "A" o "B" matag usa sa "updated-by" nga nota
  • Ug kini nag-update sa kapanguhaan nga mas paspas
  • Gi-update ni B ang kapanguhaan

Ingon usa ka sangputanan, nawala ang update A. Katapusan nga operasyon patch daog, ang counter gidugangan sa usa imbes nga duha, ug ang kantidad sa "updated-by" nga nota matapos sa "B" ug wala'y sulod nga "A". Atong itandi ang sa ibabaw sa kung unsa ang mahitabo kung ang mga pag-update gihimo gamit ang pamaagi replace:

  • A ug B makuha ang kasamtangan nga kahimtang sa kapanguhaan gikan sa API
  • Ang matag usa lokal nga nag-update sa detalye pinaagi sa pagdugang sa counter sa usa ug pagdugang usab sa "A" o "B" matag usa sa "updated-by" nga nota
  • Ug kini nag-update sa kapanguhaan nga mas paspas
  • Gisulayan ni B nga i-update ang kapanguhaan, apan ang pag-update gisalikway sa API tungod kay ang bersyon sa kapanguhaan naa sa detalye replace dili mohaum sa kasamtangan nga bersyon sa kapanguhaan sa Kubernetes tungod kay ang bersyon sa kapanguhaan gidugangan pinaagi sa pagpuli nga operasyon ni A.

Sa kaso sa ibabaw, kinahanglan nga kuhaon pag-usab ni B ang kapanguhaan, maghimo mga pagbag-o sa bag-ong estado ug sulayan pag-usab replace. Kini ang hinungdan sa counter nga madugangan sa duha ug ang "updated-by" nga nota nga maglakip sa "AB" sa katapusan.

Ang pananglitan sa ibabaw nagpasabot nga kung ipatuman replace Ang tibuok nga kapanguhaan hingpit nga gipulihan. Ang espesipikasyon nga gigamit alang sa replace, kinahanglan dili partial, o sa mga bahin sama sa apply, apan kompleto, lakip ang pagdugang resourceVersion ngadto sa specification metadata. Kung wala nimo ma-enable resourceVersion o ang bersyon nga imong gihatag dili bag-o, ang kapuli isalikway. Busa ang labing maayo nga paagi sa paggamit mao ang replace – basaha ang kapanguhaan, i-update kini ug ilisan dayon. Paggamit kubectl, mahimong ingon niini:

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

Angay nga hinumdoman nga ang mosunod nga duha ka mga sugo, nga gipatuman nga sunud-sunod, malampuson nga ipatuman, tungod kay deployment.yaml walay kabtangan .metadata.resourceVersion

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

Kini daw sukwahi sa giingon sa ibabaw, i.e. "pagdugang resourceVersion ngadto sa specification metadata." Sayop ba ang pag-ingon niana? Dili, dili, tungod kay kung kubectl mga pahibalo nga wala nimo gitino resourceVersion, basahon kini gikan sa kapanguhaan ug idugang kini sa espesipikasyon nga imong gipiho, ug dayon ipatuman kini replace. Tungod kay kini mahimo’g peligro kung magsalig ka sa atomicity, ang salamangka hingpit nga molihok sa kilid kubectl, dili ka angay magsalig niini kung mogamit mga librarya sa kliyente nga nagtrabaho kauban ang API. Sa kini nga kaso kinahanglan nimo nga basahon ang kasamtangan nga espesipikasyon sa kapanguhaan, i-update kini ug dayon ipatuman PUT hangyo.

Dili nimo mahimo ang usa ka patch - naghimo kami usa ka pag-ilis

Usahay kinahanglan nimo nga maghimo pipila ka mga pagbag-o nga dili madumala sa API. Niini nga mga kaso, mahimo nimong pugson ang pag-ilis sa kapanguhaan pinaagi sa pagtangtang ug paghimo niini pag-usab. Gihimo kini gamit ang kubectl replace --force. Ang pagpadagan sa komand diha-diha dayon nagtangtang sa mga kahinguhaan ug unya gi-recreate kini gikan sa gihatag nga detalye. Walay "force replace" handler sa API, ug aron mahimo kini pinaagi sa API, kinahanglan nimo nga buhaton ang duha ka operasyon. Una kinahanglan nimo nga papason ang kapanguhaan pinaagi sa pagtakda niini gracePeriodSeconds ngadto sa zero (0) ug propagationPolicy sa "Background" ug dayon buhata pag-usab kini nga kapanguhaan nga adunay gusto nga detalye.

Pasidaan: Kini nga pamaagi posibleng delikado ug mahimong mosangpot sa dili matino nga kahimtang.

Pag-apply sa kilid sa server

Sama sa gihisgutan sa ibabaw, ang mga developer sa Kubernetes nagtrabaho sa pagpatuman sa lohika apply gikan sa kubectl sa Kubernetes API. Logika apply anaa sa Kubernetes 1.18 pinaagi sa kubectl apply --server-side o pinaagi sa API gamit ang pamaagi PATCH с content-type application/apply-patch+YAML.

Hinumdomi: Ang JSON balido usab nga YAML, aron mahimo nimong ipadala ang detalye ingon JSON bisan kung content-type mahimong application/apply-patch+yaml.

Gawas pa niana nga lohika kubectl mahimong magamit sa tanan pinaagi sa API, apply sa server nga bahin, nagsubay kung kinsa ang responsable sa mga natad sa espesipikasyon, sa ingon nagtugot sa luwas nga daghang pag-access alang sa wala’y panagbangi nga pag-edit niini. Sa laing pagkasulti, kung apply sa kilid sa server mahimong mas kaylap, ang usa ka unibersal nga luwas nga interface sa pagdumala sa kapanguhaan magpakita alang sa lainlaing mga kliyente, pananglitan, kubectl, Pulumi o Terraform, GitOps, ingon man mga sinulat sa kaugalingon nga mga script gamit ang mga librarya sa kliyente.

Mga resulta

Nanghinaut ko nga kining mubo nga kinatibuk-ang pagtan-aw sa lainlaing mga paagi sa pag-update sa mga kapanguhaan sa mga cluster nakatabang kanimo. Maayo nga mahibal-an nga dili lang kini magamit kumpara sa pag-ilis; posible nga mag-update sa usa ka kapanguhaan gamit ang pag-apply, pag-edit, pag-patch, o pag-ilis. Pagkahuman, sa prinsipyo, ang matag pamaagi adunay kaugalingon nga lugar sa aplikasyon. Alang sa atomic nga mga pagbag-o, ang pag-ilis mas maayo; kung dili, kinahanglan nimo nga gamiton ang estratehikong paghiusa nga patch pinaagi sa pag-apply. Sa labing gamay, gilauman ko nga masabtan nimo nga dili ka makasalig sa Google o StackOerflow kung nangita alang sa "kubernetes apply vs replace". Labing menos hangtod kini nga artikulo mopuli sa karon nga tubag.

Husto nga Pagtandi sa Kubernetes I-apply, Ilisan ug Patch

Source: www.habr.com

Idugang sa usa ka comment