Richteg Verglach vu Kubernetes Uwendung, Ersatz a Patch

Kubernetes huet verschidde Méiglechkeeten fir Ressourcen ze aktualiséieren: uwenden, Ànneren, patchen an ersetzen. Et gëtt Duercherneen iwwer wat jidderee mécht a wéini se ze benotzen. Loosst eis et erausfannen.

Richteg Verglach vu Kubernetes Uwendung, Ersatz a Patch

wann Sich op Google den Ausdrock "kubernetes gĂ«llen vs ersetzen" ass lokalisĂ©iert Äntwert op StackOverflow, wat net richteg ass. Wann Dir sicht "kubernetes applizĂ©iert vs Patch" den Ă©ischte Link ass d'Dokumentatioun fir kubectl patch, dĂ©i net de Verglach enthĂ€lt apply Đž patch. DĂ«sen Artikel wĂ€ert dĂ©i verschidden Optiounen kucken, wĂ©i och dĂ©i richteg Notzung vun all eenzel.

WÀrend dem Liewenszyklus vun enger Kubernetes Ressource (Service, Deployment, Ingress, etc.), heiansdo musst Dir e puer Eegeschafte vun dëser Ressource Ànneren, derbÀisetzen oder ewechhuelen. Zum Beispill eng Notiz derbÀi, d'Zuel vun de Repliken erhéijen oder erofsetzen.

Kubernetes CLI

Wann Dir scho mat Kubernetes Cluster iwwer de CLI schafft, sidd Dir scho vertraut mat apply Đž edit. Equipe apply liest d'Ressource SpezifizĂ©ierung aus der Datei a mĂ©cht en "upsert" op de Kubernetes Cluster, d.h. erstellt d'Ressource wann et net existĂ©iert an aktualisĂ©iert se wann et existĂ©iert. Equipe edit liest eng Ressource iwwer d'API, schreift dann d'Ressource SpezifizĂ©ierung op eng lokal Datei, dĂ©i dann an engem Texteditor opgemaach gĂ«tt. Nodeems Dir d'Datei geĂ€nnert an gespĂ€ichert hutt, kubectl schĂ©ckt d'Ännerungen zrĂ©ck duerch d'API, dĂ©i dĂ«s Ännerungen virsiichteg op d'Ressource gĂ«llen.

Net jiddereen weess d'Befehle patch Đž replace. Equipe patch erlaabt Iech en Deel vun enger Ressource SpezifizĂ©ierung z'Ă€nneren, dĂ©i nĂ«mmen de geĂ€nnerten Deel op der Kommandozeil ubitt. Equipe replace Wierker dĂ©i selwecht wĂ©i edit, awer alles muss manuell gemaach ginn: Dir musst dĂ©i aktuell Versioun vun der Ressource SpezifizĂ©ierung eroflueden, zum Beispill mat kubectl get -o yaml, editĂ©iert et, benotzt dann replace fir eng Ressource ze aktualisĂ©ieren no enger geĂ€nnerter SpezifizĂ©ierung. Equipe replace wĂ€ert net funktionnĂ©ieren wann Ännerungen tĂ«scht dem Liesen an dem Ersatz vun der Ressource geschitt sinn.

Kubernetes API

Dir sidd wahrscheinlech kennt mat de Methoden CoreV1().Pods().Update(), replaceNamespacedService oder patch_namespaced_deployment, Wann Dir schafft mat StÀrekéip via Client Bibliothéik fir Kubernetes API eng programméiere Sprooch benotzt. D'Bibliothéik handhabt dës Methoden iwwer HTTP-Ufroe mat de Methoden PUT О PATCH... WoubÀi update О replace benotzen PUTan patch, Egal wéi trivial et ass, benotzt PATCH.

Et ass derwĂ€ert ze wĂ«ssen datt kubectl Wierker och mat StĂ€rekĂ©ip via API. An anere Wierder, kubectlass e Wrapper uewen op der ClientbibliothĂ©ik fir d'Go Sprooch, dĂ©i grĂ©isstendeels d'FĂ€egkeet bitt Ënnerbefehle an enger mĂ©i kompakter a liesbarer Form zousĂ€tzlech zu de Standard API FĂ€egkeeten ze bidden. Zum Beispill, wĂ©i Dir scho gemierkt hutt, d'Method apply war net uewen am virege Paragraph ernimmt. Aktuell (Mee 2020, ca. Iwwersetzer) all Logik kubectl apply, d.h. net existĂ©ierend Ressourcen erstellen an existĂ©ierend aktualisĂ©ieren, funktionnĂ©iert ganz op der Code SĂ€it kubectl. Efforte ginn gemaach op Logik Transfert apply op der API SĂ€it, awer et ass nach Ă«mmer an der Beta. Ech wĂ€ert mĂ©i am Detail Ă«nnert schreiwen.

Par défaut Patch

Am beschten benotzt patch, wann Dir d'Ressource update wëllt. Dëst ass wéi béid Clientbibliothéike schaffen uewen op der Kubernetes API an kubectl (net iwwerraschend, well et ass e Wrapper fir d'Clientbibliothéik, ca. Iwwersetzer).

Aarbecht strategesch

All ÉquipĂ« kubectl apply, edit Đž patch benotzen d'Method PATCH an HTTP-Ufroe fir eng existent Ressource ze aktualisĂ©ieren. Wann Dir mĂ©i detaillĂ©iert an d'Ëmsetzung vun Kommandoen verdĂ©iwen, da benotze se all d'Approche strategesch-fusionĂ©ieren Patching Ressourcen ze aktualisĂ©ieren, obwuel de Kommando patch kann aner Approche benotzen (mĂ©i iwwer dĂ«st hei Ă«nnen). D'strategesch-fusionĂ©ieren Patching Approche probĂ©iert et "richteg ze krĂ©ien" andeems dĂ©i geliwwert SpezifizĂ©ierung mat der existĂ©ierender SpezifizĂ©ierung fusionĂ©iert. MĂ©i spezifesch probĂ©iert et souwuel Objeten wĂ©i Arrays ze kombinĂ©ieren, wat heescht datt d'Ännerunge tendĂ©ieren additiv ze sinn. Zum Beispill, de Kommando lafen patch mat enger neier Ëmfeldvariabel an der Pod Container SpezifizĂ©ierung, verursaacht datt dĂ«s Ëmfeldvariabel un dĂ©i existent Ëmfeldvariablen bĂ€igefĂŒĂŒgt gĂ«tt anstatt se ze iwwerschreiwe. Fir dĂ«s Approche ze lĂ€schen, musst Dir de ParameterwĂ€ert op null an der spezifizĂ©ierter SpezifizĂ©ierung forcĂ©ieren. WĂ©i eng vun den Équipen kubectl Ass et am beschten fir d'AktualisĂ©ierung ze benotzen?

Wann Dir Är Ressourcen erstellt a verwalten benotzt kubectl apply, beim Update ass et besser Ă«mmer ze benotzen kubectl applyze kubectl konnt d'Konfiguratioun verwalten a richteg ugefrote Ännerunge vun der Applikatioun op d'Applikatioun verfollegen. Virdeel Ă«mmer benotzen apply ass datt et eng virdru applizĂ©iert SpezifizĂ©ierung hĂ€lt, wat et erlaabt ze wĂ«ssen wĂ©ini SpezifizĂ©ierungseigenschaften an Arrayelementer explizit gelĂ€scht ginn. DĂ«st erlaabt Iech ze benotzen apply Eegeschaften an Arrayelementer ze lĂ€schen, wĂ€hrend eng normal strategesch Fusioun net funktionnĂ©iert. ÉquipĂ« edit Đž patch net Update Noten datt kubectl apply benotzt fir seng Ännerungen ze verfolgen, sou datt all Ännerungen dĂ©i duerch d'Kubernetes API verfollegt a gemaach ginn, awer duerch Kommandoen gemaach ginn edit Đž patch, onsichtbar fir spĂ©ider Kommandoen apply, dat ass apply net ewechzehuelen hinnen och wann se net am Input SpezifizĂ©ierung schĂ©ngen fir apply (D'Dokumentatioun seet dat edit Đž patch maachen AktualisĂ©ierungen op d'Noten benotzt apply, awer an der Praxis - nee).

Wann Dir de Kommando net benotzt apply, kann als benotzt ginn editan patch, wielt de Kommando deen am Beschten entsprĂ©cht der Ännerung dĂ©i gemaach gĂ«tt. Wann Dir BOM Eegeschaften addĂ©iert an Ă€nnert, sinn bĂ©id Approche ongefĂ©ier d'selwecht. Wann Dir SpezifizĂ©ierungseigenschaften oder Arrayelementer lĂ€schen edit behĂ€lt sech wĂ©i eng eemoleg Start apply, inklusiv verfollegen wat d'Spezifikatioun war wĂ©i virun an no se geĂ€nnert gouf, sou kĂ«nnt Dir explizit Eegeschaften an Array Elementer vun enger Ressource ewechhuelen. Dir musst explizit den Eegeschafte WĂ€ert op null an der SpezifizĂ©ierung fir patchfir et aus der Ressource ze lĂ€schen. En Array-Element ewechzehuelen mat strategesche Merge Patching ass mĂ©i komplex well et d'Benotzung vu Fusiounsdirektive erfuerdert. Kuckt aner Upgrade Approche hei Ă«nnen fir mĂ©i liewensfĂ€eg Alternativen.

Fir Update Methoden an der ClientbibliothĂ©ik Ă«mzesetzen, dĂ©i sech Ă€hnlech wĂ©i d'Befehle hei uewen behuelen kubectl, soll an Ufroe gesat ginn content-type ĐČ application/strategic-merge-patch+json. Wann Dir Properties an enger SpezifizĂ©ierung wĂ«llt lĂ€schen, musst Dir hir WĂ€erter explizit op null op eng Ă€hnlech ManĂ©ier setzen kubectl patch. Wann Dir Array-Elementer ewechhuele musst, sollt Dir Fusiounsdirektiven an der Update-Spezifikatioun enthalen oder eng aner Approche fir Updates benotzen.

Aner Approche fir Updates

Kubernetes Ă«nnerstĂ«tzt zwee aner Update Approche: JSON Merge Patch Đž JSON Patch. D'JSON Merge Patch Approche hĂ«lt eng partiell Kubernetes SpezifizĂ©ierung als Input an Ă«nnerstĂ«tzt Fusiounsobjekter Ă€hnlech wĂ©i dĂ©i strategesch Fusioun Patching Approche. Den Ënnerscheed tĂ«scht deenen zwee ass datt et nĂ«mmen Array Ersatz Ă«nnerstĂ«tzt, dorĂ«nner de Container Array an der Pod SpezifizĂ©ierung. DĂ«st bedeit datt wann Dir e JSON Merge Patch benotzt, musst Dir komplett Spezifikatioune fir all Container ubidden am Fall wou all Eegeschafte vun engem Container Ă€nnert. Also ass dĂ«s Approche nĂ«tzlech fir Elementer aus enger Array an enger BOM ze lĂ€schen. Op der Kommandozeil kĂ«nnt Dir JSON Merge Patch benotzen kubectl patch --type=merge. Wann Dir mat der Kubernetes API schafft, sollt Dir d'Ufromethod benotzen PATCH an Installatioun content-type ĐČ application/merge-patch+json.

D'JSON Patch Approche, anstatt eng partiell SpezifizĂ©ierung vun enger Ressource ze liwweren, benotzt d'Ännerungen, dĂ©i Dir un d'Ressource maache wĂ«llt als Array, an deem all Element vun der Array eng Beschreiwung vun der Ännerung duerstellt, dĂ©i op d'Ressource gemaach gĂ«tt. DĂ«s Approche ass e mĂ©i flexibelen a mĂ€chtege Wee fir d'Ännerungen auszedrĂ©cken, dĂ©i gemaach ginn, awer op d'KĂ€schte fir d'Ännerungen opzemaachen, dĂ©i an engem separaten, net-Kubernetes-Format gemaach ginn, anstatt eng partiell RessourcespezifizĂ©ierung ze schĂ©cken. IN kubectl Dir kĂ«nnt JSON Patch wielen benotzen kubectl patch --type=json. Wann Dir de Kubernetes API benotzt, funktionnĂ©iert dĂ«s Approche mat der Ufromethod PATCH an Installatioun content-type ĐČ application/json-patch+json.

Mir brauchen Vertrauen - benotzen ersetzen

An e puer FĂ€ll musst Dir sĂ©cher sinn datt keng Ännerunge fir eng Ressource gemaach ginn tĂ«scht der ZĂ€it wou d'Ressource gelies gĂ«tt a wann se aktualisĂ©iert gĂ«tt. An anere Wierder, Dir sollt sĂ©cher sinn datt all Ännerungen sinn atomarer. An dĂ«sem Fall, fir Ressourcen ze aktualisĂ©ieren, sollt Dir benotzen replace. Zum Beispill, wann Dir e ConfigMap mat engem Comptoir hutt, dee vu multiple Quellen aktualisĂ©iert gĂ«tt, sollt Dir sĂ©cher sinn datt zwou Quellen de Konter net zur selwechter ZĂ€it aktualisĂ©ieren, sou datt den Update verluer geet. Fir ze demonstrĂ©ieren, stellt Iech eng Sequenz vun Eventer mat der Approche vir patch:

  • A a B krĂ©ien den aktuellen Zoustand vun der Ressource vun der API
  • Jiddereen aktualisĂ©iert lokal d'Spezifikatioun andeems de Konter Ă«m een ​​eropgeet an och "A" respektiv "B" op d'"aktualisĂ©iert-vun" Notiz bĂ€igefĂŒĂŒgt
  • An et aktualisĂ©iert d'Ressource e bĂ«sse mĂ©i sĂ©ier
  • B aktualisĂ©iert d'Ressource

Als Resultat ass den Update A verluer. Déi lescht Operatioun patch gewënnt, de Konter gëtt vun eent amplaz vun zwee erhéicht, an de WÀert vun der "aktualiséiert-vun" Notiz endet mat "B" an enthÀlt net "A". Loosst eis dat hei uewe verglÀichen mat deem wat geschitt wann Updates mat der Approche gemaach ginn replace:

  • A a B krĂ©ien den aktuellen Zoustand vun der Ressource vun der API
  • Jiddereen aktualisĂ©iert lokal d'Spezifikatioun andeems de Konter Ă«m een ​​eropgeet an och "A" respektiv "B" op d'"aktualisĂ©iert-vun" Notiz bĂ€igefĂŒĂŒgt
  • An et aktualisĂ©iert d'Ressource e bĂ«sse mĂ©i sĂ©ier
  • B probĂ©iert d'Ressource ze aktualisĂ©ieren, awer den Update gĂ«tt vun der API verworf well d'Ressource Versioun an der SpezifizĂ©ierung ass replace entsprĂ©cht net dĂ©i aktuell Versioun vun der Ressource zu Kubernetes, well d'Versioun vun der Ressource duerch d'Ersatzoperatioun vun A erhĂ©icht gouf.

Am uewe genannte Fall muss B d'Ressource erĂ«mfannen, Ännerunge fir den neie Staat maachen an nach eng KĂ©ier probĂ©ieren replace. DĂ«st wĂ€ert dozou fĂ©ieren datt de Konter Ă«m zwee eropgeet an d'Notiz "AktualisĂ©iert duerch" fir "AB" um Enn.

Dat uewe genannte Beispill implizéiert datt beim Ausféierung replace Déi ganz Ressource gëtt komplett ersat. Spezifizéierung benotzt fir replace, dÀerf net deelweis sinn, oder an Deeler wéi an apply, awer komplett, och d'ZousÀtzlech resourceVersion an d'Spezifikatioun Metadaten. Wann Dir net aktivéiert hutt resourceVersion oder d'Versioun déi Dir ugitt ass net aktuell, den Ersatz gëtt refuséiert. Also déi bescht Approche fir ze benotzen ass replace - liest d'Ressource, update se an ersetzt se direkt. Benotzt kubectl, et kéint esou ausgesinn:

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

Et ass derwÀert ze notéieren datt déi folgend zwee Kommandoen, sequentiell ausgefouert, erfollegrÀich ausféieren, well deployment.yaml enthÀlt keng Propriétéit .metadata.resourceVersion

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

DĂ«st gĂ©if schĂ©ngen widdersprĂ©chlech wat uewen gesot gouf, d.h. " dobĂ€izemaachen resourceVersion an d'Spezifikatioun Metadaten." Ass et falsch dat ze soen? Nee, et ass net, well wann kubectl Notifikatiounen dĂ©i Dir net uginn hutt resourceVersion, liest et aus der Ressource an fĂŒĂŒgt se un d'Spezifikatioun un dĂ©i Dir uginn hutt, an nĂ«mmen dann auszefĂ©ieren replace. Well dĂ«st potenziell gefĂ©ierlech ass wann Dir op AtomitĂ©it vertrauen, funktionnĂ©iert d'Magie ganz op der SĂ€it kubectl, Dir sollt net drop vertrauen wann Dir ClientbibliothĂ©iken benotzt dĂ©i mat der API funktionnĂ©ieren. An dĂ«sem Fall musst Dir dĂ©i aktuell Ressource SpezifizĂ©ierung liesen, aktualisĂ©ieren an dann ausfĂ©ieren PUT viraus.

Dir kënnt net e Patch maachen - mir maachen en Ersatz

Heiansdo musst Dir e puer Ännerungen maachen, dĂ©i net vun der API gehandhabt kĂ«nne ginn. An dĂ«se FĂ€ll kĂ«nnt Dir d'Ersatz vun der Ressource forcĂ©ieren andeems Dir se lĂ€schen an nei erstellt. DĂ«st gĂ«tt gemaach mat kubectl replace --force. De Kommando auszefĂ©ieren lĂ€scht direkt d'Ressourcen an erstallt se dann aus der geliwwerter SpezifizĂ©ierung. Et gĂ«tt keen "force replace" Handler an der API, a fir dat duerch d'API ze maachen, musst Dir zwou Operatiounen ausfĂ©ieren. Als Ă©ischt musst Dir d'Ressource lĂ€schen andeems Dir et setzt gracePeriodSeconds op null (0) an propagationPolicy am "Background" an dann nees dĂ«s Ressource mat der gewĂ«nschter SpezifizĂ©ierung.

Opgepasst: Dës Approche ass potenziell geféierlech a kann zu engem ondefinéierte Staat féieren.

Gëlle op der Server SÀit

WĂ©i uewen ernimmt, schaffen Kubernetes EntwĂ©ckler un der Ëmsetzung vun der Logik apply aus kubectl an der Kubernetes API. Logik apply verfĂŒgbar an Kubernetes 1.18 via kubectl apply --server-side oder iwwer d'API mat der Method PATCH с content-type application/apply-patch+YAML.

Notiz: JSON ass och valabel YAML, also kënnt Dir d'Spezifikatioun als JSON schécken och wann content-type wÀert application/apply-patch+yaml.

Nieft dĂ€r Logik kubectl gĂ«tt fir jiddereen iwwer API verfĂŒgbar, apply op der Server SĂ€it, hĂ€lt Streck vun wien fir d'Felder an der SpezifizĂ©ierung verantwortlech ass, sou datt sĂ©cher Multiple Zougang fir seng Konflikt-gratis Redaktioun erlaabt. An anere Wierder, wann apply op der Server SĂ€it wĂ€ert mĂ©i verbreet ginn, wĂ€ert eng universell sĂ©cher Ressource Gestioun Interface fir verschidde Clienten schĂ©ngen, zum Beispill, kubectl, Pulumi oder Terraform, GitOps, souwĂ©i Self-schrĂ«ftlech Scripten Client BibliothĂ©iken benotzt.

Resultater

Ech hoffen dĂ«se kuerzen IwwerblĂ©ck iwwer verschidde WeeĂ«r fir Ressourcen a Cluster ze aktualisĂ©ieren war Iech hĂ«llefrĂ€ich. Et ass gutt ze wĂ«ssen datt et net nĂ«mmen applizĂ©iert versus ersat ass et mĂ©iglech eng Ressource ze aktualisĂ©ieren andeems se applizĂ©ieren, Ă€nneren, patchen oder ersetzen. No allem, am Prinzip, huet all Approche sĂ€in eegent ApplikatiounsberĂ€ich. Fir atomarer Ännerungen, ersetzen ass lĂ©iwer soss, Dir sollt strategesch-fusionĂ©ieren Patch benotzen. Op d'mannst erwaarden ech datt Dir verstitt datt Dir Google oder StackOerflow net vertraue kĂ«nnt wann Dir no "kubernetes applizĂ©iert vs ersetzen" sicht. Op d'mannst bis dĂ«sen Artikel dĂ©i aktuell Äntwert ersetzt.

Richteg Verglach vu Kubernetes Uwendung, Ersatz a Patch

Source: will.com

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster