Fampitahana araka ny tokony ho izy ny Kubernetes Ampiharo, Soloy ary Patch

Kubernetes dia manana safidy maromaro amin'ny fanavaozana loharano: ampiharo, ovay, patch ary manolo. Misy fifanjevoana momba ny zavatra ataon'ny tsirairay sy ny fotoana hampiasana azy ireo. Andeha hojerentsika izany.

Fampitahana araka ny tokony ho izy ny Kubernetes Ampiharo, Soloy ary Patch

raha karohy amin'ny Google misy ilay andian-teny hoe "kubernetes mihatra vs manolo". valio ny StackOverflow, izay tsy mety. Rehefa mitady "kubernetes mihatra vs patch" ny rohy voalohany dia ny antontan-taratasy momba ny kubectl patch, izay tsy ahitana fampitahana apply и patch. Ity lahatsoratra ity dia hijery ireo safidy samihafa, ary koa ny fampiasana araka ny tokony ho izy ny tsirairay.

Mandritra ny androm-piainan'ny loharanon-karena Kubernetes (serivisy, fametrahana, fidirana, sns.), indraindray mila manova, manampy na manala ny toetra sasany amin'ity loharano ity ianao. Ohatra, ampio naoty, ampitomboy na ahena ny isan'ny kopia.

Kubernetes CLI

Raha efa miara-miasa amin'ny kluster Kubernetes amin'ny alalan'ny CLI ianao, dia efa mahazatra anao izany apply и edit. Ekipa apply mamaky ny famaritana loharano avy amin'ny rakitra ary manao "upsert" amin'ny cluster Kubernetes, i.e. mamorona ny loharano raha tsy misy ary manavao azy raha misy. Ekipa edit mamaky loharano amin'ny alàlan'ny API, avy eo manoratra ny fanondroana loharano amin'ny rakitra eo an-toerana, izay misokatra amin'ny tonian-dahatsoratra. Rehefa avy manitsy sy mitahiry ny rakitra ianao, kubectl dia handefa ny fanovana natao tamin'ny alàlan'ny API, izay hampihatra tsara ireo fanovana ireo amin'ny loharano.

Tsy ny rehetra no mahalala ny baiko patch и replace. Ekipa patch mamela anao hanova ny ampahany amin'ny fanondroana loharanon-karena, manome afa-tsy ny ampahany niova eo amin'ny baiko baiko. Ekipa replace miasa mitovy amin'ny edit, fa mila atao amin'ny tanana ny zava-drehetra: mila misintona ny dikan-teny ankehitriny momba ny fanondroana loharano ianao, ohatra, mampiasa kubectl get -o yaml, amboary izany, dia ampiasao replace mba hanavao ny loharanon-karena araka ny voafaritra voafaritra. Ekipa replace tsy mandeha raha misy fiovana nitranga teo anelanelan'ny famakiana sy fanoloana ny loharano.

Kubernetes API

Fantatrao angamba ny fomba CoreV1().Pods().Update(), replaceNamespacedService na patch_namespaced_deployment, raha miasa miaraka amin'ny clusters amin'ny tranomboky mpanjifa ho an'ny Kubernetes API mampiasa fiteny fandaharana sasany. Ny tranomboky dia mitantana ireo fomba ireo amin'ny alàlan'ny fangatahana HTTP amin'ny fampiasana ireo fomba PUT и PATCH... izay update и replace fampiasana PUTary patch, na dia tsy misy dikany aza izany, dia ampiasaina PATCH.

Tsara ny manamarika izany kubectl miasa miaraka amin'ny cluster amin'ny alàlan'ny API. Raha lazaina amin'ny fomba hafa, kubectldia fonosina eo an-tampon'ny tranombokin'ny mpanjifa ho an'ny fiteny Go, izay manome ny fahafahana manome subcommands amin'ny endrika mirindra kokoa sy mora vakina ankoatra ny fahaizan'ny API mahazatra. Ohatra, araka ny efa tsikaritrareo, ny fomba apply tsy voalaza etsy ambony ao amin'ny andalana teo aloha. Amin'izao fotoana izao (Mey 2020, eo ho eo MPANDIKA TENY) lojika rehetra kubectl apply, i.e. mamorona loharano tsy misy ary manavao ny efa misy, miasa tanteraka amin'ny lafiny code kubectl. Misy ny ezaka atao amin'ny famindrana lojika apply amin'ny lafiny API, fa mbola ao amin'ny beta. Hanoratra amin'ny antsipiriany bebe kokoa etsy ambany aho.

Patch amin'ny alàlan'ny default

Fampiasana tsara indrindra patch, raha te hanavao ny loharano ianao. Izany no fomba fiasan'ny tranomboky mpanjifa eo an-tampon'ny Kubernetes API sy kubectl (tsy mahagaga, satria fonosana ho an'ny tranomboky mpanjifa izy io, eo ho eo MPANDIKA TENY).

Miasa stratejika

Ny ekipa rehetra kubectl apply, edit и patch mampiasa ny fomba PATCH amin'ny fangatahana HTTP hanavao ny loharano efa misy. Raha mandinika ny fampiharana ny baiko amin'ny antsipiriany kokoa ianao, dia samy mampiasa ny fomba fiasa izy ireo stratejika-mitambatra patching hanavao ny loharanon-karena, na dia ny baiko patch dia afaka mampiasa fomba hafa (bebe kokoa momba izany eto ambany). Ny fomba fiasa patching stratejika dia manandrana "hahazo izany tsara" amin'ny alàlan'ny fampifangaroana ny fepetra omena amin'ny fepetra efa misy. Amin'ny ankapobeny, miezaka ny manambatra ny zavatra sy ny array, izay midika fa ny fanovana dia mirona ho additive. Ohatra, mihazakazaka ny baiko patch miaraka amin'ny fari-piainan'ny tontolo iainana vaovao ao amin'ny fanondroana fitoeran'entana pod, mahatonga an'io fari-piainan'ny tontolo iainana io ho ampidirina amin'ny fari-piainan'ny tontolo iainana efa misy fa tsy mandika azy ireo. Mba hanesorana amin'ny fampiasana an'io fomba io dia tsy maintsy manery ny sandan'ny paramètre ho null ianao amin'ny famaritana nomena. Iza amin'ireo ekipa kubectl Tsara kokoa ve ny mampiasa ny fanavaozana?

Raha mamorona sy mitantana ny loharanonao ianao amin'ny fampiasana kubectl apply, rehefa manavao dia aleo ampiasaina foana kubectl applyny kubectl afaka mitantana ny fandrindrana ary manara-maso tsara ny fanovana nangatahana avy amin'ny fampiharana mankany amin'ny fampiharana. Advantage ampiasaina foana apply dia ny fitazomana ny fepetra efa nampiharina teo aloha, ahafahany mahafantatra rehefa nesorina mazava tsara ny toetra manokana sy ny singa array. Izany dia ahafahanao mampiasa apply hanesorana ny fananana sy ny singa array, raha toa ka tsy mandeha ny fampivondronana stratejika mahazatra. Ekipa edit и patch aza manavao naoty izany kubectl apply dia ampiasaina hanaraha-maso ny fiovany, ka izay fiovana rehetra arahina sy atao amin'ny alàlan'ny Kubernetes API, fa atao amin'ny baiko edit и patch, tsy hita amin'ny baiko manaraka apply, izany dia apply tsy manala azy ireo na dia tsy hita ao amin'ny toromarika fampidirana ho apply (Ny antontan-taratasy dia milaza fa edit и patch manaova fanavaozana ny naoty ampiasaina apply, fa amin'ny fampiharana - tsia).

Raha tsy mampiasa ny baiko ianao apply, azo ampiasaina ho edit, ary patch, mifidy ny baiko mifanaraka indrindra amin'ny fanovana atao. Rehefa manampy sy manova ny toetran'ny BOM dia mitovy ny fomba roa. Rehefa mamafa ny toetra manokana na singa array edit mitondra tena toy ny fandefasana indray mandeha apply, ao anatin'izany ny fitazonana ny toetran'ny famaritana taloha sy taorian'ny fanitsiana azy, mba hahafahanao manaisotra mazava ny fananana sy singa maromaro amin'ny loharano iray. Mila mametraka mazava tsara ny sandan'ny fananana ho null ianao ao amin'ny famaritana ny patchhanesorana azy amin'ny loharano. Sarotra kokoa ny fanesorana singa iray amin'ny fampiasana patching stratejika satria mitaky ny fampiasana torolalana fampitambatra. Jereo ny fomba fanavaozana hafa eto ambany raha te hahita safidy azo atao kokoa.

Mampihatra fomba fanavaozana ao amin'ny tranomboky mpanjifa izay mitondra tena mitovy amin'ny baiko etsy ambony kubectl, dia tokony apetraka amin'ny fangatahana content-type в application/strategic-merge-patch+json. Raha te hanaisotra ny fananana amin'ny famaritana iray ianao dia mila mametraka mazava ny soatoaviny ho null amin'ny fomba mitovy kubectl patch. Raha mila manaisotra ireo singa manara-penitra ianao dia tokony hampidirinao ny toromarika mampiray ao amin'ny fanondroana fanavaozana na mampiasa fomba fiasa hafa amin'ny fanavaozana.

Fomba hafa amin'ny fanavaozana

Kubernetes dia manohana fomba fanavaozana roa hafa: JSON merge patch и JSON patch. Ny JSON merge patch dia maka ampahany amin'ny Kubernetes ho fampidiran-dresaka ary manohana ireo zavatra mitambatra mitovy amin'ny fomba stratejika-merge. Ny mahasamihafa azy roa ireo dia ny fanoloana array ihany no manohana azy, ao anatin'izany ny laharan'ny kaontenera ao amin'ny famaritana pod. Midika izany fa rehefa mampiasa patch merge JSON ianao dia mila manome fepetra feno ho an'ny kaontenera rehetra raha sendra misy fiovan'ny fananana misy container. Noho izany, ity fomba ity dia ilaina amin'ny fanesorana singa amin'ny array ao amin'ny BOM. Ao amin'ny tsipika baiko dia azonao atao ny misafidy JSON merge patch mampiasa kubectl patch --type=merge. Rehefa miasa miaraka amin'ny Kubernetes API dia tokony hampiasa ny fomba fangatahana ianao PATCH ary fametrahana content-type в application/merge-patch+json.

Ny fomba fiasa patch JSON, fa tsy manome famaritana ampahany amin'ny loharano iray, dia mampiasa ny fanomezana ny fanovana tianao hatao amin'ny loharano ho toy ny array, izay ny singa tsirairay amin'ny array dia maneho ny famaritana ny fanovana natao tamin'ny loharano. Ity fomba fiasa ity dia fomba mora kokoa sy mahery vaika hanehoana ireo fanovana natao, saingy amin'ny sandan'ny fitanisana ireo fanovana atao amin'ny endrika misaraka tsy Kubernetes, fa tsy mandefa famaritana ampahany amin'ny loharano. IN kubectl azonao atao ny misafidy patch JSON mampiasa kubectl patch --type=json. Rehefa mampiasa ny Kubernetes API, ity fomba fiasa ity dia miasa amin'ny alàlan'ny fomba fangatahana PATCH ary fametrahana content-type в application/json-patch+json.

Mila fahatokisan-tena isika - mampiasa soloina

Amin'ny toe-javatra sasany, mila mahazo antoka ianao fa tsy misy fiovana atao amin'ny loharano iray eo anelanelan'ny fotoana vakina ny loharano sy ny fanavaozana azy. Raha lazaina amin'ny teny hafa, tokony ho azonao antoka fa hisy ny fanovana rehetra atomika. Amin'ity tranga ity, mba hanavao ny loharano tokony hampiasainao replace. Ohatra, raha manana ConfigMap ianao miaraka amin'ny kaontera nohavaozina avy amin'ny loharanom-baovao maro, dia tokony ho azonao antoka fa loharano roa no tsy manavao ny kaontera amin'ny fotoana iray, ka mahatonga ny fanavaozana ho very. Mba hampisehoana, alaivo sary an-tsaina ny filaharan'ny fisehoan-javatra mampiasa ny fomba fiasa patch:

  • A sy B dia mahazo ny toetry ny loharano amin'izao fotoana izao avy amin'ny API
  • Ny tsirairay dia manavao ny fanondroana amin'ny alàlan'ny fampitomboana ny kaontera iray ary manampy ny "A" na "B" tsirairay avy amin'ny naoty "nohavaozina".
  • Ary havaozina haingana kokoa ny loharano
  • B dia manavao ny loharano

Vokatr'izany dia very ny fanavaozana A. Hetsika farany patch mandresy, ny kaontera dia mitombo iray fa tsy roa, ary ny sandan'ny naoty "havaozina" dia mifarana amin'ny "B" ary tsy misy "A". Andao ampitahaina amin'ny zavatra mitranga rehefa vita ny fanavaozana amin'ny fampiasana ny fomba fiasa replace:

  • A sy B dia mahazo ny toetry ny loharano amin'izao fotoana izao avy amin'ny API
  • Ny tsirairay dia manavao ny fanondroana amin'ny alàlan'ny fampitomboana ny kaontera iray ary manampy ny "A" na "B" tsirairay avy amin'ny naoty "nohavaozina".
  • Ary havaozina haingana kokoa ny loharano
  • B dia manandrana manavao ny loharano, saingy nolavin'ny API ny fanavaozana satria ao amin'ny famaritana ny dikan-teny. replace tsy mifanandrify amin'ny dikan-teny ankehitriny amin'ny loharano ao amin'ny Kubernetes satria ny dikan-ny loharanon-karena dia nampitomboina tamin'ny alalan'ny fandidiana fanoloana an'i A.

Amin'ity tranga etsy ambony ity dia tsy maintsy maka indray ny loharanon-karena i B, manao fanovana amin'ny fanjakana vaovao ary manandrana indray replace. Izany dia hahatonga ny kaontera hitombo roa ary ny naoty "havaozina" dia hampiditra "AB" any amin'ny farany.

Ny ohatra etsy ambony dia midika fa rehefa manatanteraka replace Nosoloina tanteraka ny loharanon-karena iray manontolo. Specification ampiasaina amin'ny replace, tsy tokony ho ampahany, na amin'ny ampahany toy ny ao apply, fa feno, anisan'izany ny fanampiny resourceVersion ao amin'ny metadata specification. Raha mbola tsy navelanao resourceVersion na ny dikan-teny omenao dia tsy amin'izao fotoana izao, ny fanoloana dia holavina. Noho izany, ny fomba tsara indrindra ampiasaina dia replace – vakio ny loharano, havaozy ary soloy avy hatrany. mampiasa kubectl, mety ho toy izao izany:

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

Tsara ny manamarika fa ireto baiko roa manaraka ireto, izay tanterahina misesy, dia hotanterahina amim-pahombiazana, satria deployment.yaml tsy ahitana fananana .metadata.resourceVersion

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

Toa mifanohitra amin'izay voalaza tetsy ambony io, i.e. " manampy resourceVersion ao amin'ny metadata manokana." Diso ve ny milaza an'izany? Tsia, tsy izany, satria raha kubectl fanamarihana izay tsy nofaritanao resourceVersion, dia hamaky azy io avy amin'ny loharanon-karena ary ampidiriny amin'ny famaritana nofaritanao, ary avy eo dia tanteraho izany replace. Satria mety hampidi-doza izany raha miantehitra amin'ny atomika ianao, dia miasa tanteraka ny majika kubectl, tsy tokony hiantehitra amin'izany ianao rehefa mampiasa tranomboky mpanjifa miasa miaraka amin'ny API. Amin'ity tranga ity dia tsy maintsy mamaky ny fanondroana loharano ankehitriny ianao, manavao azy ary manatanteraka PUT fangatahana.

Tsy afaka manao patch ianao - manao fanolo izahay

Indraindray ianao dia mila manao fanovana sasany izay tsy azon'ny API. Amin'ireo tranga ireo dia azonao atao ny manery ny fanoloana ny loharano amin'ny alàlan'ny famafana sy ny famoronana azy indray. Izany dia atao amin'ny fampiasana kubectl replace --force. Ny fampandehanana ny baiko dia manala avy hatrany ny loharanon-karena ary avy eo dia mamerina azy ireo avy amin'ny famaritana nomena. Tsy misy mpandrindra "hanoloana hery" ao amin'ny API, ary raha te hanao izany amin'ny alàlan'ny API dia mila manao asa roa ianao. Voalohany dia mila mamafa ny loharano ianao amin'ny fametrahana azy gracePeriodSeconds aotra (0) ary propagationPolicy ao amin'ny "Background" ary avereno amboary ity loharano ity miaraka amin'ny famaritana tiana.

Fampitandremana: Ity fomba fiasa ity dia mety hampidi-doza ary mety hitarika amin'ny toe-javatra tsy voafaritra.

Ampiharo amin'ny lafiny mpizara

Araka ny voalaza etsy ambony, miasa amin'ny fampiharana ny lojika ny mpamorona Kubernetes apply avy amin'ny kubectl ao amin'ny Kubernetes API. Lojika apply azo alaina ao amin'ny Kubernetes 1.18 amin'ny alàlan'ny kubectl apply --server-side na amin'ny alàlan'ny API mampiasa ny fomba PATCH с content-type application/apply-patch+YAML.

Fanamarihana: JSON dia YAML manan-kery ihany koa, ka azonao atao ny mandefa ny famaritana ho JSON na dia content-type dia ho application/apply-patch+yaml.

Ankoatra izay lojika kubectl azon'ny rehetra atao amin'ny alalan'ny API, apply eo amin'ny lafin'ny mpizara, dia manara-maso izay tompon'andraikitra amin'ireo saha ao amin'ny famaritana, ka mamela ny fidirana maro azo antoka ho an'ny fanovana tsy misy fifandirana. Amin'ny teny hafa, raha apply eo amin'ny lafiny mpizara dia hiparitaka bebe kokoa, hisy interface tsara fitantanana loharanon-karena azo antoka ho an'ny mpanjifa samihafa, ohatra, kubectl, Pulumi na Terraform, GitOps, ary koa ny sora-tanana nosoratan'ny tena mampiasa tranomboky mpanjifa.

vokatra

Manantena aho fa nanampy anao ity topimaso fohy momba ny fomba isan-karazany hanavaozana ireo loharano ao anaty cluster. Tsara ny mahafantatra fa tsy mihatra amin'ny fanoloana fotsiny no azo atao ny manavao loharano iray amin'ny fampiasana app, manitsy, mametaka, na manolo. Raha ny marina, amin'ny ankapobeny, ny fomba fiasa tsirairay dia manana ny faritra fampiharana azy. Ho an'ny fiovan'ny atomika, dia tsara kokoa ny manolo raha tsy izany dia tokony hampiasa patch stratejika ianao amin'ny alàlan'ny fampiharana. Farafaharatsiny, manantena aho fa takatrao fa tsy afaka matoky an'i Google na StackOerflow ianao rehefa mikaroka ny "kubernetes mihatra vs manolo". Farafaharatsiny mandra-panoloan'ity lahatsoratra ity ny valiny ankehitriny.

Fampitahana araka ny tokony ho izy ny Kubernetes Ampiharo, Soloy ary Patch

Source: www.habr.com

Add a comment