Konparezon apwopriye nan Kubernetes Aplike, Ranplase ak Patch

Kubernetes gen plizyè opsyon pou mete ajou resous yo: aplike, modifye, patch ak ranplase. Gen konfizyon sou sa chak moun fè ak lè yo sèvi ak yo. Ann kalkile li.

Konparezon apwopriye nan Kubernetes Aplike, Ranplase ak Patch

Si rechèch sou Google fraz "kubernetes aplike vs ranplase" sitiye reponn StackOverflow, ki pa kòrèk. Lè wap chèche "kubernetes aplike vs patch" lyen an premye se dokiman an pou kubectl patch, ki pa gen ladann konparezon apply и patch. Atik sa a pral gade nan opsyon yo diferan, osi byen ke itilizasyon apwopriye nan chak youn.

Pandan sik lavi yon resous Kubernetes (sèvis, deplwaman, antre, elatriye), pafwa ou bezwen chanje, ajoute oswa retire kèk pwopriyete resous sa a. Pa egzanp, ajoute yon nòt, ogmante oswa diminye kantite kopi.

Kubernetes CLI

Si w ap deja travay ak gwoup Kubernetes atravè CLI a, w ap deja abitye ak apply и edit. Ekip apply li spesifikasyon resous ki soti nan fichye a epi li fè yon "anlèvman" nan gwoup Kubernetes la, i.e. kreye resous la si li pa egziste epi mete ajou li si li egziste. Ekip edit li yon resous atravè API a, Lè sa a, ekri spesifikasyon nan resous nan yon dosye lokal, ki se Lè sa a, louvri nan yon editè tèks. Apre ou fin modifye epi sove fichye a, kubectl pral voye chanjman ki fèt yo tounen atravè API a, ki pral ak anpil atansyon aplike chanjman sa yo nan resous la.

Se pa tout moun ki konnen kòmandman yo patch и replace. Ekip patch pèmèt ou chanje yon pati nan yon spesifikasyon resous, bay sèlman pati ki chanje sou liy lan lòd. Ekip replace travay menm jan ak edit, men tout bagay dwe fè manyèlman: ou bezwen telechaje vèsyon aktyèl la nan spesifikasyon resous la, pou egzanp, lè l sèvi avèk kubectl get -o yaml, modifye li, epi sèvi ak replace mete ajou yon resous selon yon spesifikasyon chanje. Ekip replace p ap travay si nenpòt chanjman ki fèt ant lekti ak ranplase resous la.

Kubernetes API

Ou se pwobableman abitye ak metòd yo CoreV1().Pods().Update(), replaceNamespacedService oswa patch_namespaced_deployment, si ou travay ak grap via bibliyotèk kliyan pou Kubernetes API lè l sèvi avèk kèk langaj pwogramasyon. Bibliyotèk la okipe metòd sa yo atravè demann HTTP lè l sèvi avèk metòd yo PUT и PATCH... Ki kote update и replace itilize PUTAk patch, pa gen pwoblèm ki jan trivial li ka, itilize PATCH.

Li se vo anyen sa kubectl travay tou ak grap atravè API. Nan yon lòt sans, kubectlse yon anvlòp sou tèt bibliyotèk kliyan an pou lang Go, ki lajman bay kapasite pou bay soukòmand nan yon fòm ki pi kontra ak lizib anplis kapasite estanda API yo. Pou egzanp, jan ou ka deja remake, metòd la apply pa te mansyone pi wo a nan paragraf anvan an. Kounye a (Me 2020, approx. tradiktè) tout lojik kubectl apply, i.e. kreye resous ki pa egziste ak mete ajou sa ki deja egziste, travay antyèman sou bò kòd la kubectl. Efò yo ap fèt sou transfè lojik apply sou bò API, men li toujou nan beta. Mwen pral ekri an plis detay anba a.

Patch pa default

Pi bon itilize patch, si ou vle mete ajou resous la. Men ki jan tou de bibliyotèk kliyan yo travay sou tèt Kubernetes API ak kubectl (pa etone, paske li se yon anbalaj pou bibliyotèk kliyan an, approx. tradiktè).

Travay èstratejikman

Tout ekip yo kubectl apply, edit и patch sèvi ak metòd la PATCH nan demann HTTP pou mete ajou yon resous ki egziste deja. Si ou fouye nan aplikasyon an nan kòmandman an plis detay, Lè sa a, tout nan yo sèvi ak apwòch la patch estratejik-fusion mete ajou resous yo, byenke kòmandman an patch ka itilize lòt apwòch (plis sou sa anba a). Apwòch stratejik-fusion patch eseye "jwenn li dwat" pa fusion spesifikasyon apwovizyone ak spesifikasyon ki deja egziste a. Plis espesyalman, li eseye konbine tou de objè ak etalaj, ki vle di chanjman yo gen tandans yo dwe aditif. Pou egzanp, kouri lòd la patch ak yon nouvo varyab anviwònman nan spesifikasyon veso gous la, lakòz varyab anviwònman sa a yo dwe ajoute nan varyab anviwònman ki egziste deja olye ke yo ranplase yo. Pou retire lè l sèvi avèk apwòch sa a, ou dwe fòse valè paramèt la nil nan spesifikasyon yo bay la. Kiyès nan ekip yo kubectl Èske li pi bon pou itilize pou mete ajou?

Si ou kreye ak jere resous ou lè l sèvi avèk kubectl apply, lè mete ajou li se pi bon toujou sèvi ak kubectl applykonsa kubectl te kapab jere konfigirasyon ak kòrèkteman swiv chanjman yo mande soti nan aplikasyon an aplikasyon. Avantaj toujou sèvi ak apply se ke li kenbe tras nan yon spesifikasyon deja aplike, ki pèmèt li konnen ki lè pwopriyete spesifikasyon ak eleman etalaj yo klèman retire. Sa pèmèt ou sèvi ak apply yo retire pwopriyete ak eleman etalaj, pandan y ap yon fizyon nòmal estratejik pa pral travay. Ekip yo edit и patch pa mete ajou nòt sa kubectl apply itilize pou swiv chanjman li yo, kidonk nenpòt chanjman ki swiv epi ki fèt atravè API Kubernetes, men ki fèt atravè kòmandman. edit и patch, envizib nan kòmandman ki vin apre yo applySa se, apply pa retire yo menm si yo pa parèt nan spécification D' a pou apply (Dokimantasyon an di sa edit и patch fè mizajou nan nòt yo itilize yo apply, men nan pratik - non).

Si ou pa sèvi ak kòmandman an apply, ka itilize kòm editAk patch, w ap chwazi kòmandman ki pi byen adapte ak chanjman ki fèt la. Lè w ajoute ak chanje pwopriyete BOM, tou de apwòch yo apeprè menm. Lè w ap efase pwopriyete spesifikasyon oswa eleman etalaj edit konpòte li tankou yon lansman yon sèl fwa apply, ki gen ladan kenbe tras de sa spesifikasyon la te tankou anvan ak apre li te modifye, konsa ou ka klèman retire pwopriyete ak eleman etalaj nan yon resous. Ou bezwen klèman mete valè pwopriyete a nil nan spesifikasyon la pou patchretire li nan resous la. Retire yon eleman etalaj lè l sèvi avèk patching estratejik-fusion se pi konplèks paske li mande pou yo sèvi ak direktiv fizyone. Gade lòt apwòch ajou pi ba a pou plis altènativ solid.

Pou aplike metòd aktyalizasyon nan bibliyotèk kliyan an ki konpòte menm jan ak kòmandman ki anwo yo kubectl, yo ta dwe mete nan demann content-type в application/strategic-merge-patch+json. Si ou vle retire pwopriyete nan yon spesifikasyon, ou bezwen klèman mete valè yo nan nil nan yon fason ki sanble. kubectl patch. Si ou bezwen retire eleman etalaj, ou ta dwe mete direktiv fizyone nan spesifikasyon aktyalizasyon a oswa itilize yon apwòch diferan pou mizajou.

Lòt apwòch nan mizajou

Kubernetes sipòte de lòt apwòch aktyalizasyon: JSON rantre patch и JSON patch. Apwòch patch JSON fizyon an pran yon spesifikasyon pasyèl Kubernetes kòm opinyon ak sipòte fizyon objè ki sanble ak apwòch la patch èstratejik-fusion. Diferans ki genyen ant de la se ke li sèlman sipòte ranplasman etalaj, ki gen ladan etalaj la veso nan spesifikasyon gous la. Sa vle di lè w ap itilize yon patch fizyon JSON, ou bezwen bay espesifikasyon konplè pou tout resipyan nan ka nenpòt ki pwopriyete veso a chanje. Se konsa, apwòch sa a itil pou retire eleman nan yon etalaj nan yon BOM. Sou liy lòd la ou ka chwazi JSON fizyon patch lè l sèvi avèk kubectl patch --type=merge. Lè w ap travay ak API Kubernetes, ou ta dwe itilize metòd demann lan PATCH ak enstalasyon content-type в application/merge-patch+json.

Apwòch patch JSON la, olye ke bay yon espesifikasyon pasyèl nan yon resous, itilize bay chanjman yo ou vle fè nan resous la kòm yon etalaj, nan ki chak eleman nan etalaj la reprezante yon deskripsyon nan chanjman an ke yo te fè nan resous la. Apwòch sa a se yon fason ki pi fleksib ak pi pwisan pou eksprime chanjman yo te fè yo, men nan pri a nan lis chanjman yo te fè nan yon fòma separe, ki pa Kubernetes, olye ke voye yon spesifikasyon resous pasyèl. NAN kubectl ou ka chwazi patch JSON lè l sèvi avèk kubectl patch --type=json. Lè w ap itilize API Kubernetes, apwòch sa a ap travay lè l sèvi avèk metòd demann lan PATCH ak enstalasyon content-type в application/json-patch+json.

Nou bezwen konfyans - sèvi ak ranplase

Nan kèk ka, ou bezwen asire w ke pa gen okenn chanjman ki fèt nan yon resous ant lè yo li resous la ak lè li mete ajou. Nan lòt mo, ou ta dwe asire w ke tout chanjman yo pral atomik. Nan ka sa a, pou mete ajou resous ou ta dwe itilize replace. Pou egzanp, si ou gen yon ConfigMap ak yon kontwa ki mete ajou pa plizyè sous, ou ta dwe asire w ke de sous pa mete ajou kontwa a an menm tan, sa ki lakòz aktyalizasyon a ap pèdi. Pou demontre, imajine yon sekans evènman lè l sèvi avèk apwòch la patch:

  • A ak B jwenn eta aktyèl resous la nan API a
  • Chak lokalman mete ajou spesifikasyon la lè yo ogmante kontwa a pa youn epi tou ajoute "A" oswa "B" respektivman nan nòt "mizajou-pa" la.
  • Epi li mete ajou resous la yon ti kras pi vit
  • B mete ajou resous la

Kòm yon rezilta, aktyalizasyon A pèdi. Dènye operasyon patch wins, kontwa a ogmante pa youn olye de de, ak valè "mizajou-pa" nòt la fini ak "B" epi li pa genyen "A". Ann konpare sa ki anwo a ak sa k ap pase lè mizajou yo fè lè l sèvi avèk apwòch la replace:

  • A ak B jwenn eta aktyèl resous la nan API a
  • Chak lokalman mete ajou spesifikasyon la lè yo ogmante kontwa a pa youn epi tou ajoute "A" oswa "B" respektivman nan nòt "mizajou-pa" la.
  • Epi li mete ajou resous la yon ti kras pi vit
  • B eseye mete ajou resous la, men API a rejte aktyalizasyon a paske vèsyon resous la nan spesifikasyon la. replace pa matche ak vèsyon aktyèl la nan resous la nan Kubernetes paske vèsyon an nan resous la te ogmante pa operasyon ranplase A a.

Nan ka ki anwo a, B ap oblije re-chache resous la, fè chanjman nan nouvo eta a epi eseye ankò. replace. Sa a pral lakòz kontwa a ap ogmante pa de ak nòt "mizajou-pa" a gen ladan "AB" nan fen an.

Egzanp ki pi wo a implique ke lè egzekite replace Se tout resous la konplètman ranplase. Spesifikasyon itilize pou replace, pa dwe pasyèl, oswa an pati tankou nan apply, men konplè, ki gen ladan adisyon a resourceVersion nan metadata spesifikasyon yo. Si ou pa aktive resourceVersion oswa vèsyon ou bay la pa aktyèl, yo pral rejte ranplasman an. Se konsa, apwòch ki pi bon yo sèvi ak se replace – li resous la, mete ajou li epi ranplase li imedyatman. Sèvi ak kubectl, li ta ka sanble tankou sa a:

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

Li se vo anyen ke de kòmandman sa yo, egzekite sekans, pral egzekite avèk siksè, depi deployment.yaml pa gen pwopriyete .metadata.resourceVersion

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

Sa a ta sanble kontredi sa ki te di pi wo a, i.e. "ajoute resourceVersion nan metadata spesifikasyon yo." Èske li mal di sa? Non, li pa, paske si kubectl remake ke ou pa t presize resourceVersion, li pral li li nan resous la epi ajoute li nan spesifikasyon ou espesifye a, epi sèlman Lè sa a, egzekite li replace. Paske sa a se potansyèlman danjere si ou konte sou atomite, majik la travay antyèman sou bò la kubectl, ou pa ta dwe konte sou li lè w ap itilize bibliyotèk kliyan ki travay ak API a. Nan ka sa a ou pral oblije li spesifikasyon resous aktyèl la, mete ajou li epi egzekite PUT demann.

Ou pa ka fè yon patch - nou fè yon ranplase

Pafwa ou bezwen fè kèk chanjman ki pa ka okipe pa API a. Nan ka sa yo, ou ka fòse ranplasman resous la pa efase ak re-kreye li. Sa a se fè lè l sèvi avèk kubectl replace --force. Kouri kòmandman an imedyatman retire resous yo ak Lè sa a, rkree yo nan spesifikasyon apwovizyone yo. Pa gen okenn "fòs ranplase" okipe nan API a, epi yo nan lòd yo fè sa atravè API a, ou bezwen fè de operasyon. Premye ou bezwen efase resous la pa mete pou li gracePeriodSeconds a zewo (0) epi propagationPolicy nan "Background" ak Lè sa a, re-kreye resous sa a ak spesifikasyon an vle.

Avètisman: Apwòch sa a potansyèlman danjere epi li ka mennen nan yon eta ki pa defini.

Aplike sou bò sèvè a

Kòm mansyone pi wo a, devlopè Kubernetes yo ap travay sou aplikasyon lojik la apply nan kubectl nan API Kubernetes. Lojik apply disponib nan Kubernetes 1.18 via kubectl apply --server-side oswa atravè API lè l sèvi avèk metòd la PATCH с content-type application/apply-patch+YAML.

Remak: JSON valab tou YAML, kidonk ou ka voye spesifikasyon an kòm JSON menm si content-type pral application/apply-patch+yaml.

Anplis lojik sa kubectl vin disponib pou tout moun atravè API, apply sou bò sèvè a, kenbe tras nan ki moun ki responsab pou jaden yo nan spesifikasyon la, konsa pèmèt an sekirite aksè miltip pou koreksyon san konfli li yo. Nan lòt mo, si apply sou bò sèvè a ap vin pi gaye, yon koòdone inivèsèl jesyon resous an sekirite ap parèt pou diferan kliyan, pou egzanp, kubectl, Pulumi oswa Terraform, GitOps, osi byen ke scripts pwòp tèt ou-ekri lè l sèvi avèk bibliyotèk kliyan.

Rezilta

Mwen espere ti apèsi sa a sou diferan fason yo mete ajou resous nan grap te itil ou. Li bon pou konnen ke li pa jis aplike kont ranplase li posib pou mete ajou yon resous lè l sèvi avèk aplike, modifye, patch, oswa ranplase. Apre yo tout, nan prensip, chak apwòch gen pwòp zòn aplikasyon li yo. Pou chanjman atomik, ranplase se pi preferab otreman, ou ta dwe itilize patch estratejik-fusion atravè aplike; Omwen a, mwen espere ou konprann ke ou pa ka fè konfyans Google oswa StackOerflow lè w ap chèche "kubernetes aplike vs ranplase". Omwen jiskaske atik sa a ranplase repons aktyèl la.

Konparezon apwopriye nan Kubernetes Aplike, Ranplase ak Patch

Sous: www.habr.com

Add nouvo kòmantè