Муқоисаи дурусти Kubernetes Apply, Replace ва Patch

Kubernetes дорои якчанд имконоти навсозии захираҳо мебошад: татбиқ, таҳрир, часбондан ва иваз кардан. Дар бораи чӣ кор кардан ва кай истифода бурдани онҳо нофаҳмиҳо вуҷуд доранд. Биёед инро фаҳмем.

Муқоисаи дурусти Kubernetes Apply, Replace ва Patch

агар дар Google ҷустуҷӯ кунед ибораи "kubernetes app vs replace" ҷойгир аст ба StackOverflow ҷавоб диҳед, ки дуруст нест. Ҳангоми ҷустуҷӯ "kubernetes apply vs patch" истиноди аввал ҳуҷҷатгузорӣ барои kubectl patch, ки муқоисаро дар бар намегирад apply и patch. Дар ин мақола вариантҳои гуногун ва инчунин истифодаи дурусти ҳар яке аз онҳо дида мешавад.

Дар давоми давраи ҳаёти манбаи Kubernetes (хизматрасонӣ, ҷойгиркунӣ, воридшавӣ ва ғ.), баъзан шумо бояд баъзе хосиятҳои ин манбаъро тағир диҳед, илова кунед ё нест кунед. Масалан, ёддошт илова кунед, шумораи репликаҳоро зиёд ё кам кунед.

Kubernetes CLI

Агар шумо аллакай бо кластерҳои Kubernetes тавассути CLI кор карда бошед, шумо аллакай бо он шинос ҳастед apply и edit. Дастаи apply мушаххасоти захираҳоро аз файл мехонад ва ба кластери Kubernetes "боло" месозад, яъне. захираро дар сурати мавҷуд набудани он эҷод мекунад ва агар мавҷуд бошад, онро навсозӣ мекунад. Дастаи edit манбаро тавассути API мехонад, сипас тавсифи захираҳоро ба файли маҳаллӣ менависад, ки баъдан дар муҳаррири матн кушода мешавад. Пас аз таҳрир ва захира кардани файл, kubectl тағиротҳои тавассути API воридшударо бармегардонад, ки ин тағиротҳоро ба манбаъ бодиққат татбиқ мекунад.

На ҳама фармонҳоро медонанд patch и replace. Дастаи patch ба шумо имкон медиҳад, ки қисми мушаххасоти захираҳоро тағир диҳед, танҳо қисми тағирёфтаро дар сатри фармон таъмин мекунад. Дастаи replace ҳамон тавре кор мекунад edit, аммо ҳама чиз бояд дастӣ анҷом дода шавад: шумо бояд версияи ҷории мушаххасоти захираҳоро зеркашӣ кунед, масалан, бо истифода аз kubectl get -o yaml, таҳрир кунед ва баъд истифода баред replace барои нав кардани як манбаъ мувофиқи мушаххасоти тағирёфта. Дастаи replace кор намекунад, агар дар байни хондан ва иваз кардани манбаъ ягон тағйирот рух диҳад.

API Kubernetes

Шумо эҳтимол бо усулҳо шинос ҳастед CoreV1().Pods().Update(), replaceNamespacedService ё patch_namespaced_deployment, агар шумо бо кластерҳо тавассути китобхонаи муштарӣ барои API Kubernetes бо истифода аз баъзе забони барномасозӣ. Китобхона ин усулҳоро тавассути дархостҳои HTTP бо истифода аз усулҳо идора мекунад PUT и PATCH. Дар ин ҳолат, update и replace истифода баред PUTва patch, новобаста аз он ки чӣ қадар ночиз бошад, истифода мебарад PATCH.

Бояд қайд кард, ки kubectl инчунин бо кластерҳо тавассути API кор мекунад. Ба ибораи дигар, kubectlяк бастаи болои китобхонаи муштарӣ барои забони Go мебошад, ки ба таври васеъ қобилияти пешниҳоди зерфармонҳоро дар шакли паймонтар ва хонданшаванда дар баробари қобилиятҳои стандартии API таъмин мекунад. Масалан, чунон ки шумо аллакай пай бурдаед, усули apply дар банди пештара дар боло зикр нашудааст. Айни замон (майи 2020, тақрибан. тарчумон) тамоми мантиқ kubectl apply, яъне. эҷод кардани захираҳои мавҷуда ва навсозии захираҳои мавҷуда, комилан дар тарафи код кор мекунад kubectl. Саъю кушиш карда мешавад оид ба интиқоли мантиқӣ apply ба тарафи API, аммо он ҳанӯз дар бета аст. Дар зер муфассалтар менависам.

Патч бо нобаёнӣ

Беҳтарин истифодашуда patch, агар шумо хоҳед, ки захираро навсозӣ кунед. Ин аст, ки ҳарду китобхонаҳои муштарӣ дар болои API Kubernetes кор мекунанд ва kubectl (таҷҷубовар нест, зеро он як бастаи китобхонаи мизоҷ аст, тақрибан. тарчумон).

Ба таври стратегӣ кор кунед

Хамаи командахо kubectl apply, edit и patch усулро истифода баред PATCH дар дархостҳои HTTP барои навсозии манбаи мавҷуда. Агар шумо ба иҷрои фармонҳо муфассалтар омӯзед, пас ҳамаи онҳо равишро истифода мебаранд патчинги стратегӣ барои нав кардани захирахо, гарчанде фармон patch метавонад равишҳои дигарро истифода барад (бештар дар ин бора дар зер). Равиши патчинги стратегӣ бо роҳи муттаҳид кардани мушаххасоти додашуда бо мушаххасоти мавҷуда кӯшиш мекунад, ки онро дуруст ба даст орад. Аниқтараш, он мекӯшад, ки ҳам объектҳо ва ҳам массивҳоро муттаҳид созад, ки ин маънои онро дорад, ки тағиротҳо ба таври иловагӣ хосанд. Масалан, иҷро кардани фармон patch бо тағирёбандаи нави муҳити зист дар мушаххасоти контейнери pod, боиси он мегардад, ки тағирёбандаи муҳити атроф ба тағирёбандаҳои муҳити мавҷуда илова карда шавад, на аз болои онҳо. Барои аз байн бурдани ин равиш, шумо бояд арзиши параметрро дар мушаххасоти пешниҳодшуда маҷбур кунед, ки нул шавад. Кадом командахо kubectl Оё барои навсозӣ истифода бурдан беҳтар аст?

Агар шумо бо истифода аз захираҳои худ эҷод ва идора кунед kubectl apply, ҳангоми навсозӣ беҳтар аст, ки ҳамеша истифода баред kubectl applyба kubectl метавонад конфигуратсияро идора кунад ва тағироти дархостшударо аз барнома ба барнома дуруст пайгирӣ кунад. Афзалият ҳамеша истифода мешавад apply он аст, ки он мушаххасоти қаблан татбиқшударо пайгирӣ мекунад ва ба он имкон медиҳад бидонад, ки кай хосиятҳои мушаххасот ва унсурҳои массив ба таври возеҳ хориҷ карда мешаванд. Ин ба шумо имкон медиҳад, ки истифода баред apply барои нест кардани хосиятҳо ва унсурҳои массив, дар ҳоле ки якҷояшавии муқаррарии стратегӣ кор намекунад. Дастаҳо edit и patch ёддоштҳоро нав накунед, ки kubectl apply барои пайгирии тағиротҳои он истифода мебарад, бинобар ин ҳама тағиротҳое, ки тавассути API Kubernetes пайгирӣ ва анҷом дода мешаванд, аммо тавассути фармонҳо анҷом дода мешаванд edit и patch, ноаён ба фармонҳои минбаъда apply, ки ин аст apply онҳоро нест намекунад, ҳатто агар онҳо дар мушаххасоти вуруди барои пайдо нашаванд apply (Дар ҳуҷҷатҳо гуфта мешавад edit и patch ба қайдҳои истифодашуда навсозӣ кунед apply, вале дар амал — не).

Агар шумо фармонро истифода набаред apply, метавон ҳамчун истифода бурд edit, ва patch, интихоби фармоне, ки ба тағирот мувофиқат мекунад. Ҳангоми илова ва тағир додани хосиятҳои BOM, ҳарду равиш тақрибан якхелаанд. Ҳангоми нест кардани хосиятҳои мушаххасот ё элементҳои массив edit рафтори якдафъаинаро нишон медихад apply, аз ҷумла пайгирии он, ки мушаххасот пеш аз таҳрир ва баъд аз таҳрир чӣ гуна буд, то шумо метавонед хосиятҳо ва унсурҳои массивро аз манбаъ тоза кунед. Шумо бояд ба таври возеҳ арзиши амволро дар мушаххасоти барои null муқаррар кунед patchки онро аз ресурс дур кунанд. Хориҷ кардани як унсури массив бо истифода аз часпиши стратегӣ мураккабтар аст, зеро он истифодаи дастурҳои якҷояро талаб мекунад. Барои алтернативаҳои қобили эътимод ба дигар равишҳои навсозӣ нигаред.

Барои татбиқи усулҳои навсозӣ дар китобхонаи муштарӣ, ки ба фармонҳои дар боло овардашуда монанданд kubectl, бояд дар дархостҳо муқаррар карда шаванд content-type в application/strategic-merge-patch+json. Агар шумо хоҳед, ки хосиятҳоро дар мушаххасот нест кунед, шумо бояд ба таври возеҳ арзишҳои онҳоро ба таври шабеҳ ба нул муқаррар кунед kubectl patch. Агар ба шумо лозим аст, ки унсурҳои массивро нест кунед, шумо бояд дастурҳои якҷояро дар мушаххасоти навсозӣ дохил кунед ё муносибати дигарро барои навсозӣ истифода баред.

Дигар равишҳо ба навсозӣ

Kubernetes ду равиши дигари навсозиро дастгирӣ мекунад: Ямоқи якҷоякунии JSON и Ямоқи JSON. Равиши ямоқи JSON яклухткунии қисман мушаххасоти Kubernetes-ро ҳамчун ворид қабул мекунад ва муттаҳидсозии объектҳои шабеҳро ба равиши часбчаҳои стратегии якҷоякунӣ дастгирӣ мекунад. Фарқи байни ин ду дар он аст, ки он танҳо иваз кардани массивро дастгирӣ мекунад, аз ҷумла массиви контейнерӣ дар мушаххасоти под. Ин маънои онро дорад, ки ҳангоми истифодаи ямоқи якҷоякунии JSON, шумо бояд дар сурати тағир додани ягон моликияти ягон контейнер тавсифи пурраи ҳама контейнерҳоро пешниҳод кунед. Ҳамин тавр, ин равиш барои нест кардани элементҳо аз массив дар BOM муфид аст. Дар сатри фармон шумо метавонед бо истифода аз ямоқи JSON якҷояшударо интихоб кунед kubectl patch --type=merge. Ҳангоми кор бо API Kubernetes, шумо бояд усули дархостро истифода баред PATCH ва насб content-type в application/merge-patch+json.

Равиши навсозии JSON, ба ҷои пешниҳоди мушаххасоти қисман аз манбаъ, таъмини тағиротҳоеро, ки шумо мехоҳед ба манбаъ ворид кунед, ҳамчун массив истифода мебарад, ки дар он ҳар як унсури массив тавсифи тағиротро ба манбаъ ифода мекунад. Ин равиш як роҳи фасеҳтар ва тавонои баён кардани тағиротҳои воридшаванда аст, аммо ба ивази фиристодани мушаххасоти қисман захираҳо, аммо ба арзиши номбар кардани тағиротҳо дар формати алоҳидаи Кубернетес. ДАР kubectl шумо метавонед бо истифода аз ямоқи JSON-ро интихоб кунед kubectl patch --type=json. Ҳангоми истифодаи API Kubernetes, ин равиш бо истифода аз усули дархост кор мекунад PATCH ва насб content-type в application/json-patch+json.

Ба мо боварӣ лозим аст - ивазкуниро истифода баред

Дар баъзе мавридҳо, шумо бояд боварӣ дошта бошед, ки дар байни вақти хондани манбаъ ва вақте ки он навсозӣ мешавад, ҳеҷ гуна тағирот ба манбаъ ворид карда намешавад. Ба ибораи дигар, шумо бояд боварӣ ҳосил кунед, ки ҳама тағиротҳо хоҳанд буд атомй. Дар ин ҳолат, шумо бояд захираҳоро навсозӣ кунед replace. Масалан, агар шумо ConfigMap бо ҳисобкунак дошта бошед, ки аз ҷониби якчанд манбаъҳо нав карда мешавад, шумо бояд боварӣ дошта бошед, ки ду манбаъ ҳисобкунакро дар як вақт навсозӣ намекунанд, ки ин боиси гум шудани навсозӣ мегардад. Барои нишон додан, пайдарпайии рӯйдодҳоро бо истифода аз равиш тасаввур кунед patch:

  • A ва B ҳолати кунунии захираро аз API мегиранд
  • Ҳар яки онҳо мушаххасотро тавассути як маротиба зиёд кардани ҳисобкунак ва инчунин ба қайди "навсозӣ" мутаносибан "A" ё "B" илова мекунанд.
  • Ва он захираро каме зудтар навсозӣ мекунад
  • B манбаъро нав мекунад

Дар натиҷа, навсозии A гум мешавад. Амалиёти охирин patch бурд мекунад, ҳисобкунак ба ҷои ду як зиёд мешавад ва арзиши ёддошти "таҷдидшуда" бо "В" тамом мешавад ва "А" надорад. Биёед чизҳои дар боло зикршударо бо он чизе, ки ҳангоми навсозӣ бо истифода аз равиш анҷом дода мешавад, муқоиса кунем replace:

  • A ва B ҳолати кунунии захираро аз API мегиранд
  • Ҳар яки онҳо мушаххасотро тавассути як маротиба зиёд кардани ҳисобкунак ва инчунин ба қайди "навсозӣ" мутаносибан "A" ё "B" илова мекунанд.
  • Ва он захираро каме зудтар навсозӣ мекунад
  • B кӯшиш мекунад, ки манбаъро навсозӣ кунад, аммо навсозӣ аз ҷониби API рад карда мешавад, зеро версияи манбаъ дар мушаххасот аст replace ба версияи ҷории манбаъ дар Kubernetes мувофиқат намекунад, зеро версияи манбаъ тавассути амалиёти ивазкунии A зиёд шудааст.

Дар ҳолати дар боло зикршуда, B бояд захираро дубора дарёфт кунад, ба ҳолати нав тағирот ворид кунад ва бори дигар кӯшиш кунад replace. Ин боиси он мегардад, ки ҳисобкунак ду маротиба зиёд карда шавад ва қайди "аз ҷониби навсозӣ" дар охири "AB" дохил карда шавад.

Мисоли дар боло овардашуда маънои онро дорад, ки ҳангоми иҷроиш replace Тамоми захира пурра иваз карда мешавад. Мушаххасоти истифода бурда мешавад replace, набояд қисман, ё ба қисмҳо ҳамчун дар apply, вале пурра, аз чумла илова resourceVersion ба метамаълумоти мушаххасот. Агар шумо фаъол накарда бошед resourceVersion ё версияи пешниҳодкардаи шумо ҷорӣ нест, ивазкунӣ рад карда мешавад. Пас беҳтарин равиши истифода аст replace – манбаъро хонед, онро навсозӣ кунед ва фавран иваз кунед. Истифодаи kubectl, он метавонад чунин бошад:

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

Қобили зикр аст, ки ду фармони зерин, ки пайдарпай иҷро мешаванд, бомуваффақият иҷро мешаванд, зеро deployment.yaml моликият надорад .metadata.resourceVersion

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

Чунин ба назар мерасад, ки ба гуфтаҳои боло мухолифат мекунад, яъне. "илова кардан resourceVersion ба метамаълумоти мушаххасот." Оё гуфтан нодуруст аст? Не, ин тавр нест, зеро агар kubectl огоҳ мекунад, ки шумо муайян накардаед resourceVersion, онро аз манбаъ мехонад ва онро ба мушаххасоти муайянкардаи шумо илова мекунад ва танҳо баъд онро иҷро мекунад replace. Азбаски ин эҳтимолан хатарнок аст, агар шумо ба атомӣ такя кунед, ҷодугарӣ комилан дар паҳлӯ кор мекунад kubectl, шумо набояд ҳангоми истифодаи китобхонаҳои муштарӣ, ки бо API кор мекунанд, ба он такя кунед. Дар ин ҳолат шумо бояд тавсифи захираҳои ҷориро хонед, онро навсозӣ кунед ва сипас иҷро кунед PUT дархост.

Шумо ямоқи кор карда наметавонед - мо иваз мекунем

Баъзан ба шумо лозим меояд, ки баъзе тағиротҳоро ворид кунед, ки онҳоро API идора карда наметавонад. Дар ин ҳолатҳо, шумо метавонед бо роҳи нест кардан ва аз нав сохтани он захираро маҷбуран иваз кунед. Ин бо истифода аз он анҷом дода мешавад kubectl replace --force. Иҷрои фармон фавран захираҳоро нест мекунад ва сипас онҳоро аз мушаххасоти додашуда дубора эҷод мекунад. Дар API коркардкунандаи "маҷбурӣ иваз кардан" вуҷуд надорад ва барои ин тавассути API шумо бояд ду амалро иҷро кунед. Аввал шумо бояд захираро бо танзими он нест кунед gracePeriodSeconds ба сифр (0) ва propagationPolicy дар "Замина" ва сипас ин захираро бо мушаххасоти дилхоҳ дубора эҷод кунед.

Огоҳӣ: Ин равиш эҳтимолан хатарнок аст ва метавонад ба ҳолати номуайян оварда расонад.

Дар тарафи сервер муроҷиат кунед

Тавре ки дар боло зикр гардид, таҳиягарони Kubernetes барои татбиқи мантиқ кор мекунанд apply аз он kubectl дар API Kubernetes. Мантиқ apply дар Kubernetes 1.18 тавассути дастрас kubectl apply --server-side ё тавассути API бо истифода аз усул PATCH с content-type application/apply-patch+YAML.

Эзоҳ: JSON инчунин YAML дуруст аст, бинобар ин шумо метавонед мушаххасотро ҳамчун JSON фиристед, ҳатто агар content-type мешавад application/apply-patch+yaml.

Ба ҷуз ин мантиқ kubectl тавассути API ба ҳама дастрас мешавад, apply дар тарафи сервер пайгирӣ мекунад, ки кӣ барои майдонҳои мушаххасот масъул аст ва ҳамин тавр дастрасии чандкаратаро барои таҳрири бидуни низоъ имкон медиҳад. Ба ибораи дигар, агар apply дар тарафи сервер васеътар мешавад, интерфейси универсалии идоракунии захираҳо барои муштариёни гуногун пайдо мешавад, масалан, kubectl, Pulumi ё Terraform, GitOps, инчунин скриптҳои худнависӣ бо истифода аз китобхонаҳои муштарӣ.

Натиҷаҳо

Ман умедворам, ки ин шарҳи мухтасари роҳҳои гуногуни навсозии захираҳо дар кластерҳо барои шумо муфид буд. Донистани он хуб аст, ки он на танҳо татбиқ кардан ва иваз кардан аст; он имконпазир аст, ки манбаро бо истифода аз татбиқ, таҳрир, навсозӣ ё иваз навсозӣ кунед. Дар ниҳоят, дар асл, ҳар як равиш соҳаи татбиқи худро дорад. Барои тағироти атомӣ, иваз кардан беҳтар аст; дар акси ҳол, шумо бояд ямоқи стратегиро тавассути татбиқ истифода баред. Ҳадди ақал, ман интизорам, ки шумо фаҳмед, ки шумо ҳангоми ҷустуҷӯи "kubernetes app vs replace" ба Google ё StackOerflow бовар карда наметавонед. Ҳадди ақал то он даме, ки ин мақола ҷавоби ҷорӣро иваз кунад.

Муқоисаи дурусти Kubernetes Apply, Replace ва Patch

Манбаъ: will.com

Илова Эзоҳ