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.
Si 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 PUT
и PATCH
... Ki kote update
и replace
itilize PUT
Ak 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, kubectl
se 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 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
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 apply
konsa 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 apply
Sa 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 edit
Ak 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 patch
retire 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: 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
pralapplication/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.
Sous: www.habr.com