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.

wann den Ausdrock "kubernetes gëllen vs ersetzen" ass lokaliséiert , wat net richteg ass. "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 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 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 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: Đž . 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
replaceentspré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.yamlDĂ«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-typewÀertapplication/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.

Source: will.com
