Tqabbil xieraq ta 'Kubernetes Applika, Ibdel u Garża

Kubernetes għandu diversi għażliet għall-aġġornament tar-riżorsi: applika, editja, garża u ibdel. Hemm konfużjoni dwar dak li jagħmel kull wieħed u meta jużahom. Ejja insemmu.

Tqabbil xieraq ta 'Kubernetes Applika, Ibdel u Garża

Jekk tfittxija fuq Google tinsab il-frażi "kubernetes apply vs replace". tweġiba fuq StackOverflow, li mhix korretta. Meta tfittex "kubernetes japplikaw vs garża" l-ewwel link hija d-dokumentazzjoni għaliha kubectl patch, li ma jinkludix paragun apply и patch. Dan l-artikolu se jħares lejn l-għażliet differenti, kif ukoll l-użu xieraq ta 'kull wieħed.

Matul iċ-ċiklu tal-ħajja ta’ riżorsa Kubernetes (servizz, skjerament, dħul, eċċ.), kultant ikollok bżonn tibdel, iżżid jew tneħħi xi proprjetajiet ta’ din ir-riżorsa. Per eżempju, żid nota, żid jew tnaqqas in-numru ta 'repliki.

Kubernetes CLI

Jekk diġà qed taħdem ma 'clusters ta' Kubernetes permezz tas-CLI, int diġà familjari magħhom apply и edit. Tim apply jaqra l-ispeċifikazzjoni tar-riżorsi mill-fajl u jagħmel "upsert" lill-cluster Kubernetes, i.e. joħloq ir-riżorsa jekk ma teżistix u jaġġornaha jekk teżisti. Tim edit jaqra riżors permezz tal-API, imbagħad jikteb l-ispeċifikazzjoni tar-riżorsi f'fajl lokali, li mbagħad jinfetaħ f'editur tat-test. Wara li teditja u ssalva l-fajl, kubectl se tibgħat il-bidliet magħmula lura permezz tal-API, li se tapplika bir-reqqa dawn il-bidliet għar-riżorsa.

Mhux kulħadd jaf il-kmandi patch и replace. Tim patch jippermettilek tibdel parti minn speċifikazzjoni tar-riżorsi, billi tipprovdi biss il-parti mibdula fuq il-linja tal-kmand. Tim replace jaħdem l-istess bħal edit, iżda kollox jeħtieġ li jsir manwalment: trid tniżżel il-verżjoni attwali tal-ispeċifikazzjoni tar-riżorsi, pereżempju, billi tuża kubectl get -o yaml, editjaha, imbagħad uża replace biex taġġorna riżorsa skont speċifikazzjoni mibdula. Tim replace mhux se jaħdem jekk ikun hemm xi tibdil bejn il-qari u s-sostituzzjoni tar-riżorsa.

Kubernetes API

Inti probabilment familjari mal-metodi CoreV1().Pods().Update(), replaceNamespacedService jew patch_namespaced_deployment, jekk taħdem ma 'clusters permezz librerija tal-klijenti għall-API Kubernetes bl-użu ta' xi lingwa ta' programmar. Il-librerija timmaniġġja dawn il-metodi permezz ta 'talbiet HTTP bl-użu tal-metodi PUT и PATCH... Fejn update и replace użu PUTU patch, ma jimpurtax kemm jista 'jkun trivjali, juża PATCH.

Għandu jiġi nnutat li l- kubectl jaħdem ukoll ma 'clusters permezz ta' API. Fi kliem ieħor, kubectlhuwa tgeżwir fuq il-librerija tal-klijent għal-lingwa Go, li fil-biċċa l-kbira jipprovdi l-abbiltà li jipprovdi subkmandi f'forma aktar kompatta u li tinqara flimkien mal-kapaċitajiet standard tal-API. Pereżempju, kif forsi diġà innutajt, il-metodu apply ma kienx imsemmi hawn fuq fil-paragrafu preċedenti. Bħalissa (Mejju 2020, madwar. traduttur) il-loġika kollha kubectl apply, i.e. il-ħolqien ta 'riżorsi ineżistenti u l-aġġornament ta' dawk eżistenti, jaħdem kompletament fuq in-naħa tal-kodiċi kubectl. Qed isiru sforzi dwar it-trasferiment tal-loġika apply għan-naħa tal-API, iżda għadu fil-beta. Se nikteb f'aktar dettall hawn taħt.

Garża awtomatikament

L-aħjar użat patch, jekk trid taġġorna r-riżors. Dan huwa kif iż-żewġ libreriji tal-klijenti jaħdmu fuq l-API Kubernetes u kubectl (mhux sorprendenti, peress li huwa tgeżwir għal-librerija tal-klijenti, madwar. traduttur).

Aħdem strateġikament

It-timijiet kollha kubectl apply, edit и patch uża l-metodu PATCH f'talbiet HTTP biex taġġorna riżors eżistenti. Jekk tidħol fl-implimentazzjoni tal-kmandi f'aktar dettall, allura kollha kemm huma jużaw l-approċċ patching strateġiku-merge biex taġġorna r-riżorsi, għalkemm il-kmand patch jistgħu jużaw approċċi oħra (aktar dwar dan hawn taħt). L-approċċ ta 'patching ta' amalgamazzjoni strateġika jipprova "jagħmel tajjeb" billi jgħaqqad l-ispeċifikazzjoni fornuta mal-ispeċifikazzjoni eżistenti. B'mod aktar speċifiku, jipprova jgħaqqad kemm oġġetti kif ukoll arrays, li jfisser li l-bidliet għandhom tendenza li jkunu addittivi. Per eżempju, tmexxija tal-kmand patch b'varjabbli ambjentali ġdid fl-ispeċifikazzjoni tal-kontenitur tal-pod, tikkawża li dik il-varjabbli ambjentali tiżdied mal-varjabbli ambjentali eżistenti aktar milli tiktebhom fuqhom. Biex tneħħi l-użu ta 'dan l-approċċ, trid iġiegħel il-valur tal-parametru null fl-ispeċifikazzjoni pprovduta. Liema mit-timijiet kubectl Huwa aħjar li tuża għall-aġġornament?

Jekk inti toħloq u timmaniġġja r-riżorsi tiegħek bl-użu kubectl apply, meta taġġorna huwa aħjar li dejjem tuża kubectl applyBiex kubectl jista' jimmaniġġja l-konfigurazzjoni u jsegwi b'mod xieraq il-bidliet mitluba minn applikazzjoni għal applikazzjoni. Vantaġġ uża dejjem apply hija li żżomm kont ta 'speċifikazzjoni applikata qabel, li tippermettilha tkun taf meta l-proprjetajiet tal-ispeċifikazzjoni u l-elementi tal-firxa jitneħħew b'mod espliċitu. Dan jippermettilek tuża apply biex tneħħi l-proprjetajiet u l-elementi tal-firxa, filwaqt li amalgamazzjoni strateġika normali mhux se taħdem. Timijiet edit и patch taġġornax in-noti li kubectl apply juża biex isegwi l-bidliet tiegħu, għalhekk kwalunkwe tibdil li jiġi ssorveljat u magħmul permezz tal-API Kubernetes, iżda magħmul permezz ta’ kmandi edit и patch, inviżibbli għall-kmandi sussegwenti applyDan huwa, apply ma tneħħihomx anke jekk ma jidhrux fl-ispeċifikazzjoni tal-input għal apply (Id-dokumentazzjoni tgħid li edit и patch tagħmel aġġornamenti għan-noti użati apply, iżda fil-prattika - le).

Jekk ma tużax il-kmand apply, jistgħu jintużaw bħala editU patch, tagħżel il-kmand li jaqbel l-aħjar għall-bidla li qed issir. Meta żżid u tbiddel il-proprjetajiet tal-BOM, iż-żewġ approċċi huma bejn wieħed u ieħor l-istess. Meta tħassar proprjetajiet ta 'speċifikazzjoni jew elementi ta' firxa edit jaġixxi bħal tnedija ta' darba apply, inkluż iż-żamma ta' rekord ta' kif kienet l-ispeċifikazzjoni qabel u wara li ġiet editjata, sabiex tkun tista' tneħħi b'mod espliċitu proprjetajiet u elementi ta' firxa minn riżors. Għandek bżonn issettja espliċitament il-valur tal-proprjetà għal null fl-ispeċifikazzjoni għal patchbiex tneħħiha mir-riżorsa. It-tneħħija ta' element ta' firxa bl-użu ta' patching strateġiku-merge hija aktar kumplessa minħabba li teħtieġ l-użu ta' direttivi ta' amalgamazzjoni. Ara approċċi oħra ta' titjib hawn taħt għal alternattivi aktar vijabbli.

Biex timplimenta metodi ta 'aġġornament fil-librerija tal-klijenti li jġibu ruħhom b'mod simili għall-kmandi ta' hawn fuq kubectl, għandhom jiġu stabbiliti fit-talbiet content-type в application/strategic-merge-patch+json. Jekk trid tneħħi proprjetajiet fi speċifikazzjoni, trid issettja espliċitament il-valuri tagħhom għal null b'mod simili kubectl patch. Jekk għandek bżonn tneħħi l-elementi tal-firxa, għandek tinkludi direttivi tal-għaqda fl-ispeċifikazzjoni tal-aġġornament jew tuża approċċ differenti għall-aġġornamenti.

Approċċi oħra għall-aġġornamenti

Kubernetes jappoġġja żewġ approċċi oħra ta’ aġġornament: Garża jingħaqad JSON и Garża JSON. L-approċċ ta' garża ta' amalgamazzjoni JSON jieħu speċifikazzjoni parzjali ta' Kubernetes bħala input u jappoġġja oġġetti li jingħaqdu simili għall-approċċ ta' patching ta' amalgamazzjoni strateġika. Id-differenza bejn it-tnejn hija li tappoġġja biss is-sostituzzjoni tal-firxa, inkluża l-firxa tal-kontenituri fl-ispeċifikazzjoni tal-pod. Dan ifisser li meta tuża garża ta 'għaqda JSON, għandek bżonn tipprovdi speċifikazzjonijiet kompluti għall-kontenituri kollha f'każ li tinbidel xi proprjetà ta' kwalunkwe kontenitur. Allura dan l-approċċ huwa utli biex jitneħħew elementi minn firxa f'BOM. Fuq il-linja tal-kmand tista 'tagħżel JSON merge garża bl-użu kubectl patch --type=merge. Meta taħdem mal-API Kubernetes, għandek tuża l-metodu tat-talba PATCH u l-installazzjoni content-type в application/merge-patch+json.

L-approċċ tal-garża JSON, aktar milli jipprovdi speċifikazzjoni parzjali ta 'riżorsa, juża li jipprovdi l-bidliet li trid tagħmel lir-riżors bħala firxa, li fiha kull element tal-firxa jirrappreżenta deskrizzjoni tal-bidla li qed issir fir-riżorsa. Dan l-approċċ huwa mod aktar flessibbli u b'saħħtu biex jesprimu l-bidliet li qed isiru, iżda bl-ispiża tal-elenkar tal-bidliet li qed isiru f'format separat, mhux Kubernetes, aktar milli tintbagħat speċifikazzjoni parzjali tar-riżorsi. IN kubectl tista 'tagħżel garża JSON bl-użu kubectl patch --type=json. Meta tuża l-API Kubernetes, dan l-approċċ jaħdem bl-użu tal-metodu tat-talba PATCH u l-installazzjoni content-type в application/json-patch+json.

Għandna bżonn kunfidenza - uża tissostitwixxi

F'xi każijiet, trid tkun ċert li ma ssir l-ebda bidla f'riżorsa bejn iż-żmien li r-riżorsa tinqara u meta tiġi aġġornata. Fi kliem ieħor, għandek tiżgura li l-bidliet kollha se jkunu atomiku. F'dan il-każ, biex taġġorna r-riżorsi għandek tuża replace. Pereżempju, jekk għandek ConfigMap b'counter li huwa aġġornat minn sorsi multipli, għandek tkun ċert li żewġ sorsi ma jaġġornawx il-counter fl-istess ħin, u b'hekk l-aġġornament jintilef. Biex turi, immaġina sekwenza ta 'avvenimenti billi tuża l-approċċ patch:

  • A u B jiksbu l-istat attwali tar-riżorsa mill-API
  • Kull wieħed jaġġorna l-ispeċifikazzjoni lokalment billi jżid il-counter b'wieħed u jżid ukoll "A" jew "B" rispettivament man-nota "aġġornat minn"
  • U jaġġorna r-riżors ftit aktar malajr
  • B jaġġorna r-riżorsa

Bħala riżultat, l-aġġornament A jintilef. L-aħħar operazzjoni patch jirbaħ, il-counter huwa inkrementat b'wieħed minflok tnejn, u l-valur tan-nota "aġġornata minn" jispiċċa b'"B" u ma fihx "A". Ejja nqabblu dak ta 'hawn fuq ma' dak li jiġri meta jsiru l-aġġornamenti bl-użu tal-approċċ replace:

  • A u B jiksbu l-istat attwali tar-riżorsa mill-API
  • Kull wieħed jaġġorna l-ispeċifikazzjoni lokalment billi jżid il-counter b'wieħed u jżid ukoll "A" jew "B" rispettivament man-nota "aġġornat minn"
  • U jaġġorna r-riżors ftit aktar malajr
  • B jipprova jaġġorna r-riżorsa, iżda l-aġġornament huwa miċħud mill-API minħabba li l-verżjoni tar-riżorsi tinsab fl-ispeċifikazzjoni replace ma taqbilx mal-verżjoni attwali tar-riżors f'Kubernetes minħabba li l-verżjoni tar-riżors żdiedet bl-operazzjoni ta' sostituzzjoni ta' A.

Fil-każ ta’ hawn fuq, B ikollu jerġa’ jġib ir-riżorsa, jagħmel bidliet fl-istat il-ġdid u jerġa’ jipprova replace. Dan jikkawża li l-counter jiżdied bi tnejn u n-nota "aġġornata minn" tinkludi "AB" fl-aħħar.

L-eżempju ta 'hawn fuq jimplika li meta tesegwixxi replace Ir-riżors kollu huwa sostitwit kompletament. Speċifikazzjoni użata għal replace, m'għandux ikun parzjali, jew f'partijiet bħal fi apply, iżda kompluta, inkluża ż-żieda resourceVersion fil-metadejta tal-ispeċifikazzjoni. Jekk ma ppermettiex resourceVersion jew il-verżjoni li tipprovdi mhix kurrenti, is-sostituzzjoni tiġi miċħuda. Allura l-aħjar approċċ għall-użu huwa replace – aqra r-riżorsa, aġġornaha u tibdilha immedjatament. Bl-użu kubectl, jista' jidher bħal dan:

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

Ta 'min jinnota li ż-żewġ kmandi li ġejjin, esegwiti b'mod sekwenzjali, se jesegwixxu b'suċċess, peress li deployment.yaml ma fihx proprjetà .metadata.resourceVersion

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

Dan jidher li jikkontradixxi dak li ntqal hawn fuq, i.e. "żieda resourceVersion fil-metadata tal-ispeċifikazzjoni." Huwa żbaljat li tgħid dan? Le, mhuwiex, għaliex jekk kubectl jinnota li ma speċifikajtx resourceVersion, se taqrah mir-riżors u żżidha mal-ispeċifikazzjoni li speċifikajt, u mbagħad tesegwixxiha biss replace. Minħabba li dan huwa potenzjalment perikoluż jekk tiddependi fuq l-atomiċità, il-maġija taħdem kompletament fuq il-ġenb kubectl, m'għandekx tistrieħ fuqha meta tuża libreriji tal-klijenti li jaħdmu mal-API. F'dan il-każ ikollok taqra l-ispeċifikazzjoni tar-riżorsi attwali, taġġornaha u mbagħad tesegwixxi PUT talba.

Ma tistax tagħmel garża - nagħmlu sostituzzjoni

Kultant ikollok bżonn tagħmel xi bidliet li ma jistgħux jiġu ttrattati mill-API. F'dawn il-każijiet, tista 'sforza sostituzzjoni tar-riżorsa billi tħassarha u terġa' toħloqha. Dan isir bl-użu kubectl replace --force. It-tmexxija tal-kmand tneħħi immedjatament ir-riżorsi u mbagħad tirrekrejahom mill-ispeċifikazzjoni fornuta. M'hemm l-ebda handler ta '"force replace" fl-API, u sabiex tagħmel dan permezz tal-API, għandek bżonn twettaq żewġ operazzjonijiet. L-ewwel trid tħassar ir-riżors billi tissettja għaliha gracePeriodSeconds sa żero (0) u propagationPolicy fi "Sfond" u mbagħad terġa 'toħloq din ir-riżorsa bl-ispeċifikazzjoni mixtieqa.

Twissija: Dan l-approċċ huwa potenzjalment perikoluż u jista' jwassal għal stat mhux definit.

Applika fuq in-naħa tas-server

Kif imsemmi hawn fuq, l-iżviluppaturi Kubernetes qed jaħdmu fuq l-implimentazzjoni tal-loġika apply ta ' kubectl fl-API Kubernetes. Loġiċi apply disponibbli f'Kubernetes 1.18 via kubectl apply --server-side jew permezz tal-API bl-użu tal-metodu PATCH с content-type application/apply-patch+YAML.

Nota: JSON huwa YAML validu wkoll, sabiex inti tista 'tibgħat l-ispeċifikazzjoni bħala JSON anki jekk content-type se application/apply-patch+yaml.

Minbarra dik il-loġika kubectl isir disponibbli għal kulħadd permezz tal-API, apply min-naħa tas-server, iżomm kont ta 'min huwa responsabbli għall-oqsma fl-ispeċifikazzjoni, u b'hekk jippermetti aċċess multiplu sigur għall-editjar mingħajr kunflitt tiegħu. Fi kliem ieħor, jekk apply fuq in-naħa tas-server se jsir aktar mifrux, se jidher interface ta 'ġestjoni tar-riżorsi sikur universali għal klijenti differenti, pereżempju, kubectl, Pulumi jew Terraform, GitOps, kif ukoll skripts miktuba minnha stess li jużaw libreriji tal-klijenti.

Riżultati ta '

Nittama li din il-ħarsa ġenerali qasira ta 'modi differenti biex taġġorna r-riżorsi fi gruppi kienet ta' għajnuna għalik. Tajjeb li tkun taf li mhux biss tapplika versus tissostitwixxi, huwa possibbli li taġġorna riżors bl-użu ta' applika, editja, garża jew tissostitwixxi; Wara kollox, fil-prinċipju, kull approċċ għandu l-qasam ta 'applikazzjoni tiegħu stess. Għal bidliet atomiċi, issostitwixxi huwa preferibbli inkella, għandek tuża garża ta 'għaqda strateġika permezz ta' applika; Mill-inqas, nistenna li tifhem li ma tistax tafda lil Google jew StackOerflow meta tfittex "kubernetes apply vs replace". Mill-inqas sakemm dan l-artikolu jissostitwixxi t-tweġiba attwali.

Tqabbil xieraq ta 'Kubernetes Applika, Ibdel u Garża

Sors: www.habr.com

Żid kumment