Kuyerekeza Koyenera kwa Kubernetes Ikani, Bwezerani ndi Patch

Kubernetes ili ndi njira zingapo zosinthira zothandizira: gwiritsani ntchito, sinthani, patch ndikusintha. Pali chisokonezo pa zomwe aliyense amachita komanso nthawi yoti azigwiritsa ntchito. Tiyeni tiganizire.

Kuyerekeza Koyenera kwa Kubernetes Ikani, Bwezerani ndi Patch

ngati fufuzani pa Google mawu oti "kubernetes apply vs replace" amapezeka Yankhani pa StackOverflow, zomwe sizolondola. Pofufuza "kubernetes apply vs patch" ulalo woyamba ndi zolemba za kubectl patch, zomwe siziphatikiza kufananiza apply ΠΈ patch. Nkhaniyi iwona zosankha zosiyanasiyana, komanso kugwiritsa ntchito moyenera chilichonse.

Panthawi ya moyo wa gwero la Kubernetes (ntchito, kutumiza, kulowetsa, ndi zina zotero), nthawi zina muyenera kusintha, kuwonjezera kapena kuchotsa zina mwazinthu izi. Mwachitsanzo, onjezani cholemba, onjezani kapena kuchepetsa kuchuluka kwa zofananira.

Kubernetes CLI

Ngati mukugwira ntchito kale ndi magulu a Kubernetes kudzera pa CLI, mumawadziwa kale apply ΠΈ edit. Gulu apply amawerenga zofunikira kuchokera pafayilo ndikupanga "upsert" ku gulu la Kubernetes, i.e. imapanga gwero ngati palibe ndikusintha ngati ilipo. Gulu edit amawerenga gwero kudzera pa API, kenako amalemba zofunikira ku fayilo yapafupi, yomwe imatsegulidwa mu mkonzi wa malemba. Mukamaliza kusintha ndikusunga fayilo, kubectl idzatumiza zosintha zomwe zasinthidwa kudzera mu API, zomwe zidzagwiritse ntchito bwino kusintha kumeneku kuzinthu.

Sikuti aliyense amadziwa malamulo patch ΠΈ replace. Gulu patch amakulolani kuti musinthe gawo lachidziwitso, ndikungopereka gawo losinthidwa pamzere wolamula. Gulu replace amagwira ntchito mofanana ndi edit, koma zonse ziyenera kuchitidwa pamanja: muyenera kutsitsa mtundu waposachedwa wamafotokozedwe azinthu, mwachitsanzo, kugwiritsa ntchito kubectl get -o yaml, sinthani, ndiye gwiritsani ntchito replace kukonzanso gwero molingana ndi zomwe zasinthidwa. Gulu replace sichingagwire ntchito ngati kusintha kulikonse kunachitika pakati pa kuwerenga ndikusintha gwero.

Kubernetes API

Mwinamwake mumadziwa njirazo CoreV1().Pods().Update(), replaceNamespacedService kapena patch_namespaced_deployment, ngati mumagwira ntchito ndi magulu kudzera library library ya Kubernetes API pogwiritsa ntchito chinenero china cha mapulogalamu. Laibulale imayendetsa njirazi kudzera pa zopempha za HTTP pogwiritsa ntchito njira PUT ΠΈ PATCH... Momwemo update ΠΈ replace gwiritsani PUTndi patch, ngakhale zitakhala zazing'ono bwanji, zimagwiritsa ntchito PATCH.

Ndikoyenera kuzindikira zimenezo kubectl imagwiranso ntchito ndi magulu kudzera pa API. Mwanjira ina, kubectlndi wrapper pamwamba pa laibulale kasitomala kwa Go chinenero, amene makamaka amapereka mphamvu kupereka subcommands mu mawonekedwe yaying'ono ndi owerengeka kuwonjezera mphamvu muyezo API. Mwachitsanzo, monga momwe mwaonera kale, njira apply sanatchulidwe pamwamba pa ndime yapitayi. Panopa (Meyi 2020, pafupifupi. womasulira) logic zonse kubectl apply,ndi. kupanga zinthu zomwe sizilipo ndikusintha zomwe zilipo, zimagwira ntchito kumbali ya code kubectl. Khama likuchitika pa logic transfer apply ku mbali ya API, koma ikadali mu beta. Ndilemba mwatsatanetsatane pansipa.

Chigamba mwachisawawa

Zogwiritsidwa ntchito bwino patch, ngati mukufuna kusintha gwero. Umu ndi momwe malaibulale onse a kasitomala amagwirira ntchito pamwamba pa Kubernetes API ndi kubectl (zosadabwitsa, chifukwa ndi chomangira laibulale ya kasitomala, pafupifupi. womasulira).

Gwirani ntchito mwanzeru

Magulu onse kubectl apply, edit ΠΈ patch gwiritsani ntchito njirayo PATCH mu HTTP zopempha kuti zisinthe zomwe zilipo kale. Ngati mupenda kukhazikitsidwa kwa malamulo mwatsatanetsatane, ndiye kuti onse amagwiritsa ntchito njirayo strategic-mirge patching kusintha zothandizira, ngakhale lamulo patch angagwiritse ntchito njira zina (zambiri pa izi pansipa). Strategic-merge patching njira imayesa "kukonza" pophatikiza zomwe zaperekedwa ndi zomwe zilipo kale. Mwachindunji, amayesa kuphatikiza zinthu zonse ndi magulu, zomwe zikutanthauza kuti kusintha kumakhala kowonjezera. Mwachitsanzo, kuthamanga lamulo patch ndi kusintha kwatsopano kwa chilengedwe mu ndondomeko ya chidebe cha pod, kumapangitsa kuti chilengedwe chiwonjezedwe kuzinthu zomwe zilipo kale kusiyana ndi kuzilemba. Kuti muchotse kugwiritsa ntchito njirayi, muyenera kukakamiza mtengo wa parameter kuti usiye zomwe zaperekedwa. Ndi ati mwa magulu kubectl Kodi ndibwino kuti mugwiritse ntchito pokonzanso?

Ngati mupanga ndikuwongolera zinthu zanu pogwiritsa ntchito kubectl apply, pokonzanso ndi bwino kugwiritsa ntchito nthawi zonse kubectl applykuti kubectl ikhoza kuyang'anira kasinthidwe ndikutsata bwino zosintha zomwe zapemphedwa kuchokera ku pulogalamu kupita ku pulogalamu. Ubwino ntchito nthawi zonse apply ndikuti imayang'anira zomwe zidagwiritsidwa ntchito m'mbuyomu, ndikupangitsa kuti idziwe nthawi yomwe mafotokozedwe ndi zinthu zingapo zimachotsedwa bwino. Izi zimakuthandizani kuti mugwiritse ntchito apply kuchotsa katundu ndi zinthu zingapo, pomwe kuphatikizika kwabwino sikungagwire ntchito. Magulu edit ΠΈ patch osasintha zolemba zimenezo kubectl apply amagwiritsa ntchito kutsata zosintha zake, kotero zosintha zilizonse zomwe zimatsatiridwa ndikupangidwa kudzera mu Kubernetes API, koma zopangidwa kudzera mwa malamulo. edit ΠΈ patch, zosaoneka ndi malamulo otsatira apply, ndiko apply sichizichotsa ngakhale sizikuwoneka muzolowera apply (Zolemba zimanena kuti edit ΠΈ patch sinthani zolemba zomwe zagwiritsidwa ntchito apply, koma muzochita - ayi).

Ngati simugwiritsa ntchito lamulo apply, angagwiritsidwe ntchito ngati edit, ndi patch, kusankha lamulo lomwe likugwirizana bwino ndi kusintha komwe kukuchitika. Powonjezera ndikusintha katundu wa BOM, njira zonsezi zimakhala zofanana. Mukachotsa mawonekedwe kapena zinthu zingapo edit imakhala ngati kuyambika kamodzi apply, kuphatikizirapo kuyang'anira momwe mafotokozedwewo analili asanasinthidwe, kotero mutha kuchotsa momveka bwino katundu ndi masanjidwe azinthu kuchokera kuzinthu. Muyenera kuyika mtengo wamtengowo kuti muchotse zomwe zafotokozedwazo patchkuzichotsa ku gwero. Kuchotsa zinthu zingapo pogwiritsa ntchito strategic-merge patching ndizovuta kwambiri chifukwa pamafunika kugwiritsa ntchito malangizo ophatikiza. Onani njira zina zokwezera pansipa kuti mupeze njira zina zowonjezera.

Kukhazikitsa njira zosinthira mu library yamakasitomala zomwe zimakhala zofanana ndi zomwe zili pamwambapa kubectl, ziyenera kukhazikitsidwa pazopempha content-type Π² application/strategic-merge-patch+json. Ngati mukufuna kuchotsa katundu mwachindunji, muyenera kuyika zikhalidwe zawo kuti zithenso chimodzimodzi. kubectl patch. Ngati mukufuna kuchotsa zinthu zingapo, muyenera kuphatikiza malangizo ophatikiza pazosintha kapena kugwiritsa ntchito njira ina yosinthira.

Njira zina zowonjezera zowonjezera

Kubernetes amathandizira njira zina ziwiri zosinthira: JSON kuphatikiza chigamba ΠΈ Chithunzi cha JSON. Njira yophatikizira ya JSON imatengera kutanthauzira pang'ono kwa Kubernetes monga cholowera ndikuthandizira kuphatikiza zinthu zofanana ndi njira yophatikizira yolumikizira. Kusiyanitsa pakati pa ziwirizi ndikuti zimangothandizira kusintha kwamitundu yambiri, kuphatikizapo chidebe chomwe chili mumtundu wa pod. Izi zikutanthauza kuti mukamagwiritsa ntchito chigamba cha JSON, muyenera kufotokozera zonse zomwe muli nazo ngati katundu wa chidebe chilichonse asintha. Chifukwa chake njirayi ndiyothandiza pochotsa zinthu kuchokera pamndandanda wa BOM. Pa mzere wolamula mutha kusankha JSON kuphatikiza chigamba pogwiritsa ntchito kubectl patch --type=merge. Mukamagwira ntchito ndi Kubernetes API, muyenera kugwiritsa ntchito njira yofunsira PATCH ndi kukhazikitsa content-type Π² application/merge-patch+json.

Njira ya JSON patch, m'malo mopereka chidziwitso chapadera cha gwero, imagwiritsa ntchito kupereka zosintha zomwe mukufuna kupanga ku gwero ngati gulu, momwe gawo lililonse la gululo limayimira kufotokozera kwakusintha komwe kukuchitika. Njirayi ndi njira yowonjezereka komanso yamphamvu yowonetsera kusintha komwe kukuchitika, koma pamtengo wolembera zosintha zomwe zikupangidwa mwanjira yosiyana, osati Kubernetes, m'malo motumiza tsatanetsatane wazinthu. MU kubectl mutha kusankha chigamba cha JSON pogwiritsa ntchito kubectl patch --type=json. Mukamagwiritsa ntchito Kubernetes API, njirayi imagwira ntchito pogwiritsa ntchito njira yopempha PATCH ndi kukhazikitsa content-type Π² application/json-patch+json.

Timafunikira chidaliro - gwiritsani ntchito m'malo

Nthawi zina, muyenera kutsimikiza kuti palibe kusintha komwe kumapangidwa kuzinthu pakati pa nthawi yomwe gwero likuwerengedwa komanso pamene likusinthidwa. M'mawu ena, muyenera kuonetsetsa kuti kusintha konse kudzakhala atomiki. Pankhaniyi, muyenera kugwiritsa ntchito zowonjezera zowonjezera replace. Mwachitsanzo, ngati muli ndi ConfigMap yokhala ndi kauntala yomwe imasinthidwa ndi magwero angapo, muyenera kutsimikiza kuti magwero awiri sasintha kauntala nthawi imodzi, zomwe zimapangitsa kuti zosinthazo ziwonongeke. Kuti muwonetse, gwiritsani ntchito njira yotsatizana patch:

  • A ndi B amapeza momwe zinthu ziliri pano kuchokera ku API
  • Iliyonse yakomweko imasinthiratu zomwe zafotokozedwazo powonjezera kauntala ndi imodzi ndikuwonjezera "A" kapena "B" motsatana ndi "zosinthidwa"
  • Ndipo imasintha gwero mwachangu
  • B amawonjezera gwero

Zotsatira zake, zosintha A zatayika. Opaleshoni yomaliza patch ikapambana, kauntala imakulitsidwa ndi imodzi m'malo mwa ziwiri, ndipo mtengo wa "zosinthidwa" umatha ndi "B" ndipo mulibe "A". Tiyeni tifanizire zomwe zili pamwambapa ndi zomwe zimachitika pomwe zosintha zachitika pogwiritsa ntchito njirayo replace:

  • A ndi B amapeza momwe zinthu ziliri pano kuchokera ku API
  • Iliyonse yakomweko imasinthiratu zomwe zafotokozedwazo powonjezera kauntala ndi imodzi ndikuwonjezera "A" kapena "B" motsatana ndi "zosinthidwa"
  • Ndipo imasintha gwero mwachangu
  • B amayesa kukonzanso gwero, koma zosinthazo zimakanidwa ndi API chifukwa mtundu wazinthu uli mwatsatanetsatane. replace sizikufanana ndi mtundu waposachedwa wa Kubernetes chifukwa mtundu wazinthuzo udawonjezedwa ndi ntchito ya A.

Pankhani yomwe ili pamwambapa, B iyenera kutenganso gwero, sinthani dziko latsopano ndikuyesanso replace. Izi zipangitsa kuti kauntala ionjezeke ndi ziwiri komanso cholemba "chosinthidwa ndi" kuphatikiza "AB" kumapeto.

Chitsanzo cha pamwambachi chikutanthauza kuti pamene akugwira replace gwero lonse kwathunthu m'malo. Specification ntchito replace, zisakhale tsankho, kapena m’mbali monga mwa apply, koma zonse, kuphatikizapo kuwonjezera resourceVersion mu metadata yeniyeni. Ngati simunatsegule resourceVersion kapena mtundu womwe mwaperekayo si waposachedwa, cholowacho chidzakanidwa. Choncho, njira yabwino yogwiritsira ntchito replace - werengani gwero, sinthani ndikusintha nthawi yomweyo. Kugwiritsa kubectl, zitha kuwoneka motere:

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

Ndizofunikira kudziwa kuti malamulo awiri otsatirawa, ochitidwa motsatizana, achita bwino, popeza deployment.yaml ilibe katundu .metadata.resourceVersion

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

Izi zingawoneke kuti zikutsutsana ndi zomwe zanenedwa pamwambapa, i.e. "kuwonjezera resourceVersion mu metadata yeniyeni." Kodi ndi kulakwa kunena zimenezo? Ayi, sichoncho, chifukwa ngati kubectl zidziwitso zomwe simunatchule resourceVersion, idzawerenga kuchokera pagwero ndikuwonjezera pazomwe mudatchula, kenako ndikuzipanga replace. Chifukwa izi ndizowopsa ngati mudalira atomiki, matsenga amagwira ntchito kumbali kubectl, simuyenera kudalira mukamagwiritsa ntchito malaibulale a kasitomala omwe amagwira ntchito ndi API. Pachifukwa ichi muyenera kuwerenga zomwe zilipo, sinthani ndikumaliza PUT pempho.

Simungathe kuchita chigamba - timasintha

Nthawi zina mumayenera kupanga zosintha zomwe sizingatheke ndi API. Zikatero, mukhoza kukakamiza m'malo mwa gwero pochotsa ndi kulenganso izo. Izi zimachitidwa pogwiritsa ntchito kubectl replace --force. Kuthamangitsa lamulo nthawi yomweyo kumachotsa zinthuzo ndikuzipanganso kuchokera pazomwe zaperekedwa. Palibe "m'malo mwa mphamvu" mu API, ndipo kuti muchite izi kudzera mu API, muyenera kuchita ntchito ziwiri. Choyamba muyenera kufufuta gwero mwa kukhazikitsa kwa izo gracePeriodSeconds mpaka zero (0) ndi propagationPolicy mu "Background" ndiyeno panganinso chida ichi ndi zomwe mukufuna.

Chenjezo: Njira iyi ndi yowopsa ndipo imatha kupangitsa kuti munthu asadziwike.

Ikani pambali ya seva

Monga tafotokozera pamwambapa, opanga Kubernetes akugwira ntchito yokwaniritsa malingaliro apply kuchokera kubectl mu Kubernetes API. Zomveka apply ikupezeka ku Kubernetes 1.18 kudzera kubectl apply --server-side kapena kudzera pa API pogwiritsa ntchito njira PATCH с content-type application/apply-patch+YAML.

Zindikirani: JSON ndi YAML yovomerezeka, kotero mutha kutumiza zomwe mukufuna monga JSON ngakhale content-type kudzakhala application/apply-patch+yaml.

Kupatula logic imeneyo kubectl amapezeka kwa aliyense kudzera pa API, apply kumbali ya seva, imayang'anira yemwe ali ndi udindo pazambiri zomwe zafotokozedwazo, motero zimalola mwayi wopezeka kangapo pakusintha kwake kopanda mikangano. M'mawu ena, ngati apply Pa mbali ya seva idzafalikira kwambiri, mawonekedwe otetezedwa a chitetezo cha chilengedwe chonse adzawonekera kwa makasitomala osiyanasiyana, mwachitsanzo, kubectl, Pulumi kapena Terraform, GitOps, komanso zolemba zodzilemba zokha pogwiritsa ntchito malaibulale a kasitomala.

Zotsatira

Ndikukhulupirira mwachidule ichi mwachidule cha njira zosiyanasiyana zosinthira zinthu m'magulu chinali chothandiza kwa inu. Ndikwabwino kudziwa kuti sikungogwiritsa ntchito kutsutsana ndi kusintha; ndizotheka kusinthira gwero pogwiritsa ntchito kugwiritsa ntchito, kusintha, chigamba, kapena kusintha. Kupatula apo, njira iliyonse ili ndi gawo lake la ntchito. Pakusintha kwa ma atomiki, m'malo ndibwino; apo ayi, muyenera kugwiritsa ntchito strategic-merge patch pogwiritsa ntchito application. Osachepera, ndikuyembekeza kuti mumvetsetse kuti simungakhulupirire Google kapena StackOerflow mukamasaka "kubernetes apply vs replace". Osachepera mpaka nkhaniyi ilowe m'malo mwa yankho lapano.

Kuyerekeza Koyenera kwa Kubernetes Ikani, Bwezerani ndi Patch

Source: www.habr.com

Kuwonjezera ndemanga