Papiso e Nepahetseng ea Kubernetes Etsa kopo, Fetola le Patch

Kubernetes e na le likhetho tse 'maloa tsa ho ntlafatsa lisebelisoa: kenya kopo, hlophisa, patch le ho khutlisa. Ho na le pherekano mabapi le hore na e mong le e mong o etsa eng le hore na o lokela ho li sebelisa neng. Ha re e utloisise.

Papiso e Nepahetseng ea Kubernetes Etsa kopo, Fetola le Patch

haeba batla ho Google poleloana "kubernetes apply vs replace" e fumaneha araba ka StackOverflow, e seng e nepahetseng. Ha ho batloa "kubernetes apply vs patch" sehokelo sa pele ke litokomane tsa kubectl patch, e sa akarelletseng papiso apply и patch. Sehlooho sena se tla sheba likhetho tse fapaneng, hammoho le tšebeliso e nepahetseng ea e 'ngoe le e' ngoe.

Nakong ea bophelo ba sesebelisoa sa Kubernetes (tšebeletso, phepelo, ho kenella, joalo-joalo), ka linako tse ling u hloka ho fetola, ho eketsa kapa ho tlosa thepa e itseng ea sesebelisoa sena. Ka mohlala, eketsa molaetsa, eketsa kapa fokotsa palo ea likopi.

Kubernetes CLI

Haeba u se u ntse u sebetsa le lihlopha tsa Kubernetes ka CLI, u se u ntse u tloaelane le tsona apply и edit. Sehlopha apply e bala lintlha tsa lisebelisoa ho tsoa faeleng mme e etsa "upsert" ho sehlopha sa Kubernetes, i.e. e theha mohloli haeba o le sieo, ebe oa e nchafatsa haeba o le teng. Sehlopha edit o bala sesebelisoa ka API, ebe o ngola lintlha tsa mohlodi faeleng ea lehae, ebe e buloa ho mohlophisi oa mongolo. Ka mor'a ho hlophisa le ho boloka faele, kubectl e tla romela liphetoho tse entsoeng morao ka API, e tla sebelisa liphetoho tsena ka hloko mohloling.

Ha se bohle ba tsebang litaelo patch и replace. Sehlopha patch e u lumella ho fetola karolo ea tlhaloso ea lisebelisoa, ho fana feela ka karolo e fetotsoeng molaong oa taelo. Sehlopha replace e sebetsa joalo ka edit, empa ntho e 'ngoe le e' ngoe e lokela ho etsoa ka letsoho: o hloka ho khoasolla phetolelo ea morao-rao ea boitsebiso ba lisebelisoa, mohlala, ho sebelisa kubectl get -o yaml, e hlophise, ebe u sebelisa replace ho nchafatsa mohlodi ho ya ka tlhaloso e fetotsweng. Sehlopha replace e ke ke ea sebetsa haeba liphetoho leha e le life li etsahetse pakeng tsa ho bala le ho fetola mohloli.

Kubernetes API

Mohlomong u tloaelane le mekhoa CoreV1().Pods().Update(), replaceNamespacedService kapa patch_namespaced_deployment, haeba u sebetsa le lihlopha ka laeborari ea bareki bakeng sa Kubernetes API ho sebedisa puo e itseng ya lenaneo. Laebrari e sebetsana le mekhoa ena ka likopo tsa HTTP e sebelisa mekhoa PUT и PATCH... Hokae update и replace sebedisa PUTle patch, ho sa tsotellehe hore na ke ntho e nyenyane hakae, e sebelisa PATCH.

Ke habohlokoa ho hlokomela seo kubectl e boetse e sebetsa le lihlopha ka API. Ka mantsoe a mang, kubectlke sekoahelo ka holim'a laebrari ea bareki bakeng sa puo ea Go, eo haholo e fanang ka bokhoni ba ho fana ka litaelo tse nyenyane ka mokhoa o hlakileng haholoanyane le o balehang ho phaella ho bokhoni bo tloaelehileng ba API. Ka mohlala, joalokaha u se u hlokometse, mokhoa apply ha ea boleloa ka holimo serapeng se fetileng. Hajoale (May 2020, hoo e ka bang. mofetoleli) tsohle tse utloahalang kubectl apply, ke. ho theha lisebelisoa tse seng teng le ho ntlafatsa tse seng li ntse li le teng, li sebetsa ka ho feletseng ka lehlakoreng la khoutu kubectl. Ho ntse ho etsoa boiteko ka phetiso ya logic apply ka lehlakoreng la API, empa e ntse e le ho beta. Ke tla ngola ka ho qaqileng haholoanyane ka tlase.

Patch ka ho sa feleng

Molemo ka ho fetisisa sebelisoa patch, haeba u batla ho nchafatsa mohlodi. Ke kamoo lilaebrari tsa bareki ka bobeli li sebetsang ka holim'a Kubernetes API le kubectl (ha ho makatse, kaha ke sekoahelo sa laeborari ea bareki, hoo e ka bang. mofetoleli).

Sebetsa ka leano

Lihlopha tsohle kubectl apply, edit и patch sebelisa mokhoa PATCH ho likopo tsa HTTP tsa ho nchafatsa mohlodi o teng. Haeba u kenella ts'ebetsong ea litaelo ka botlalo, joale kaofela ha tsona li sebelisa mokhoa ona strategic-marge patching ho ntlafatsa lisebelisoa, le hoja taelo e patch e ka sebelisa mekhoa e meng (ho feta mona ka tlase). Mokhoa oa ho kopanya oa leano o leka ho "lokisa" ka ho kopanya lintlha tse fanoeng le litlhaloso tse teng. Haholo-holo, e leka ho kopanya lintho ka bobeli le lihlopha, ho bolelang hore liphetoho li atisa ho ba tlatsetso. Ka mohlala, ho tsamaisa taelo patch ka ho feto-fetoha ha tikoloho e ncha ho tlhaloso ea sets'oants'o sa pod, e etsa hore phetoho eo ea tikoloho e eketsoe ho mefuta e teng ea tikoloho ho e-na le ho e ngola holimo. Ho tlosa ho sebelisa mokhoa ona, o tlameha ho qobella boleng ba parameter ho hlakola litlhaloso tse fanoeng. Ke efe ea lihlopha kubectl Na ho molemo ho e sebelisa ho ntlafatsa?

Haeba u theha le ho laola lisebelisoa tsa hau u sebelisa kubectl apply, ha u ntlafatsa ho molemo ho sebelisa kamehla kubectl applye le hore kubectl e khona ho laola tlhophiso le ho latela ka nepo liphetoho tse batloang ho tloha ho sesebelisoa ho ea ho sesebelisoa. Molemo kamehla sebelisa apply ke hore e boloka tlaleho ea litlhaloso tse sebelisitsoeng pele, e lumella hore e tsebe ha thepa ea litlhaloso le likarolo tsa lihlopha li tlosoa ka ho hlaka. Sena se o lumella ho sebelisa apply ho tlosa thepa le likarolo tse ngata, ha mokhoa o tloaelehileng oa ho kopanya o ke ke oa sebetsa. Lihlopha edit и patch u se ke ua ntlafatsa lintlha tseo kubectl apply e sebelisa ho latela liphetoho tsa eona, kahoo liphetoho life kapa life tse lateloang le ho etsoa ka Kubernetes API, empa li entsoe ka litaelo. edit и patch, e sa bonahaleng ho litaelo tse latelang apply, ke hore apply ha e li tlose le haeba li sa hlahelle ka har'a litlhaloso tsa ho kenya apply (Litokomane li bolela joalo edit и patch etsa lintlafatso ho lintlha tse sebelisitsoeng apply, empa ka ts'ebetso - che).

Haeba u sa sebelise taelo apply, e ka sebelisoa e le editle patch, ho khetha taelo e lumellanang hantle le phetoho e etsoang. Ha o eketsa le ho fetola thepa ea BOM, mekhoa ka bobeli e batla e tšoana. Ha o hlakola thepa e khethehileng kapa likarolo tse ngata edit e tshoana joalo ka ho qala hanghang apply, ho kenyeletsa le ho boloka tlaleho ea hore na tlhaloso e ne e le joang pele le ka mor'a hore e lokisoe, e le hore u ka tlosa thepa le likarolo tse ngata mohloling ka ho hlaka. U hloka ho beha boleng ba thepa ka ho hlaka hore u se ke ua ba le lintlha tsa patchho e ntsha mohloding. Ho tlosa ntho e 'ngoe le e 'ngoe ka ho sebelisa strategic-merge patching ho thata haholo hobane ho hloka tšebeliso ea litaelo tsa ho kopanya. Sheba mekhoa e meng ea ntlafatso ka tlase bakeng sa mekhoa e meng e sebetsang haholoanyane.

Ho kenya ts'ebetsong mekhoa ea ntlafatso ka har'a laeborari ea bareki e sebetsang ka mokhoa o ts'oanang le litaelo tse kaholimo kubectl, e lokela ho behoa ka likopo content-type в application/strategic-merge-patch+json. Haeba u batla ho tlosa thepa ka mokhoa o ikhethileng, o hloka ho beha boleng ba eona ka mokhoa o hlakileng hore e se ke ea sebetsa ka tsela e ts'oanang. kubectl patch. Haeba o hloka ho tlosa likarolo tse ngata, o lokela ho kenyelletsa litaelo tsa ho kopanya ho litlhaloso tsa ntlafatso kapa u sebelise mokhoa o fapaneng oa ho ntlafatsa.

Mekhoa e meng ea ho ntlafatsa

Kubernetes e tšehetsa mekhoa e meng e 'meli ea ntlafatso: JSON kopanya patch и Papali ea JSON. Mokhoa oa ho kopanya oa JSON o nka tlhaloso e sa fellang ea Kubernetes e le ho kenya letsoho 'me e tšehetsa ho kopanya lintho tse tšoanang le mokhoa oa ho kopanya oa leano. Phapang lipakeng tsa tsena tse peli ke hore e ts'ehetsa feela phetolo ea mefuta e mengata, ho kenyeletsoa lethathamo la setshelo ho litlhaloso tsa pod. Sena se bolela hore ha o sebelisa patch ea ho kopanya JSON, o hloka ho fana ka litlhaloso tse felletseng bakeng sa lijana tsohle haeba thepa ea setshelo leha e le sefe e fetoha. Kahoo mokhoa ona o na le thuso bakeng sa ho tlosa likarolo ho tsoa ho sehlopha sa BOM. Moleng oa taelo u ka khetha JSON kopanya patch u sebelisa kubectl patch --type=merge. Ha o sebetsa le Kubernetes API, o lokela ho sebelisa mokhoa oa kopo PATCH le ho kenya content-type в application/merge-patch+json.

Mokhoa oa patch oa JSON, ho e-na le ho fana ka tlhaloso e sa fellang ea mohloli, o sebelisa ho fana ka liphetoho tseo u batlang ho li etsa ho sesebelisoa e le sehlopha, moo karolo ka 'ngoe ea sehlopha e emelang tlhaloso ea phetoho e etsoang mohloling. Mokhoa ona ke mokhoa o feto-fetohang le o matla oa ho hlalosa liphetoho tse ntseng li etsoa, ​​​​empa ka litšenyehelo tsa ho thathamisa liphetoho tse etsoang ka mokhoa o fapaneng, o seng oa Kubernetes, ho e-na le ho romela boitsebiso bo sa fellang ba lisebelisoa. IN kubectl u ka khetha patch ea JSON u sebelisa kubectl patch --type=json. Ha u sebelisa Kubernetes API, mokhoa ona o sebetsa ho sebelisa mokhoa oa kopo PATCH le ho kenya content-type в application/json-patch+json.

Re hloka boitšepo - sebelisa sebaka

Maemong a mang, o hloka ho etsa bonnete ba hore ha ho liphetoho tse etsoang mohloling pakeng tsa nako eo mohloli o baloang le ha o nchafatsoa. Ka mantsoe a mang, u lokela ho etsa bonnete ba hore liphetoho tsohle li tla ba teng athomo. Tabeng ena, ho ntlafatsa lisebelisoa tseo u lokelang ho li sebelisa replace. Mohlala, haeba u na le ConfigMap e nang le k'haontareng e nchafalitsoeng ke mehloli e mengata, u lokela ho etsa bonnete ba hore mehloli e 'meli ha e ntlafatse k'haontareng ka nako e le 'ngoe, e leng se etsang hore ntlafatso e lahlehe. Ho bontša, nahana ka tatellano ea liketsahalo u sebelisa mokhoa oo patch:

  • A le B ba fumana boemo ba hajoale ba sesebelisoa ho tsoa ho API
  • E 'ngoe le e 'ngoe sebakeng sa heno e nchafatsa lintlha ka ho eketsa k'haontara ka e le' ngoe le ho eketsa "A" kapa "B" ka ho latellana ho "updated-by"
  • 'Me e nchafatsa mohlodi kapelenyana
  • B e nchafatsa mohlodi

Ka lebaka leo, ntlafatso A e lahlehile. Opereishene ea ho qetela patch ha e hlola, k'haontareng e eketsoa ka e le 'ngoe sebakeng sa tse peli,' me boleng ba "updated-by" bo qetella ka "B" mme ha bo na "A". Ha re bapise se ka holimo le se etsahalang ha liapdeite li etsoa ho sebelisoa mokhoa replace:

  • A le B ba fumana boemo ba hajoale ba sesebelisoa ho tsoa ho API
  • E 'ngoe le e 'ngoe sebakeng sa heno e nchafatsa lintlha ka ho eketsa k'haontara ka e le' ngoe le ho eketsa "A" kapa "B" ka ho latellana ho "updated-by"
  • 'Me e nchafatsa mohlodi kapelenyana
  • B e leka ho nchafatsa mohlodi, empa ntjhafatso e hanoa ke API hobane mofuta wa mohlodi o ho tse hlalositsweng. replace ha e tsamaellane le mofuta oa hajoale oa sesebelisoa ho Kubernetes hobane mofuta oa sesebelisoa o ekelitsoe ke ts'ebetso ea A.

Tabeng e ka holimo, B e tla tlameha ho lata sesebelisoa hape, ho etsa liphetoho sebakeng se secha ebe o leka hape replace. Sena se tla etsa hore k'haontareng e eketsoe ka tse peli 'me molaetsa oa "updated-by" o kenyelle "AB" qetellong.

Mohlala o ka holimo o bolela hore ha ho etsoa replace Mohloli oohle o nkeloa sebaka ka ho feletseng. Tlhaloso e sebelisitsoeng bakeng sa replace, e se ke ea e-ba leeme, kapa ka likarolo tse kang ho apply, empa e feletse, ho akarelletsa le tlatsetso resourceVersion ho metadata e khethehileng. Ha o so ka o bulela resourceVersion kapa mofuta oo u faneng ka oona ha se oa morao-rao, phetisetso e tla hanoa. Kahoo mokhoa o motle oa ho sebelisa ke replace - bala sesebelisoa, se nchafatse 'me u se nkele sebaka hang-hang. Ho sebelisa kubectl, e ka shebahala tjena:

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

Ke habohlokoa ho hlokomela hore litaelo tse peli tse latelang, tse phethiloeng ka tatellano, li tla phethahatsoa ka katleho, kaha deployment.yaml ha e na thepa .metadata.resourceVersion

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

Sena se ka bonahala se hanana le se boletsoeng ka holimo, i.e. "ho eketsa resourceVersion ho metadata e khethehileng." Na ke phoso ho bua joalo? Che, ha ho joalo, hobane haeba kubectl litemoso tseo u sa li hlalosang resourceVersion, e tla e bala ho tsoa mohloling ebe e e kenyelletsa ho seo u se boletseng, ebe e se etsa feela replace. Hobane sena se ka 'na sa e-ba kotsi haeba u itšetlehile ka atomicity, boselamose bo sebetsa ka ho feletseng ka lehlakore kubectl, ha ua lokela ho itšetleha ka eona ha u sebelisa lilaebrari tsa bareki tse sebetsang le API. Tabeng ena, o tla tlameha ho bala litlhaloso tsa lisebelisoa tsa hajoale, o li ntlafatse ebe o li phetha PUT kopo.

Ha o khone ho etsa patch - re fetola

Ka linako tse ling u hloka ho etsa liphetoho tse ke keng tsa sebetsoa ke API. Maemong ana, o ka qobella ho nkela sebaka sebaka ka ho hlakola le ho se etsa bocha. Sena se etsoa ho sebelisoa kubectl replace --force. Ho tsamaisa taelo hang-hang ho tlosa lisebelisoa ebe ho li khutlisetsa ho tsoa ho litlhaloso tse fanoeng. Ha ho na "force replacer" handler ho API, 'me e le hore u etse joalo ka API, u lokela ho etsa ts'ebetso tse peli. Pele u lokela ho hlakola sesebelisoa ka ho seta bakeng sa sona gracePeriodSeconds ho ea ho zero (0) le propagationPolicy ho "Background" ebe u bopa sesebelisoa sena ka litlhaloso tse lakatsehang.

Tlhokomeliso: Mokhoa ona o ka ba kotsi 'me o ka lebisa boemong bo sa hlalosoang.

Etsa kopo ka lehlakoreng la seva

Joalokaha ho boletsoe ka holimo, bahlahisi ba Kubernetes ba ntse ba sebetsa ho kenya ts'ebetsong mohopolo apply ho tswa kubectl ho Kubernetes API. Maikutlo apply e fumaneha ho Kubernetes 1.18 ka kubectl apply --server-side kapa ka API ho sebelisa mokhoa PATCH с content-type application/apply-patch+YAML.

Tlhokomeliso: JSON e boetse e sebetsa ka YAML, kahoo o ka romella litlhaloso joalo ka JSON leha ho le joalo content-type tla ba application/apply-patch+yaml.

Ntle le monahano oo kubectl e fumaneha ho motho e mong le e mong ka API, apply ka lehlakoreng la seva, e boloka tlaleho ea hore na ke mang ea ikarabellang bakeng sa masimo a boletsoeng, ka hona e lumella phihlello e sireletsehileng ea makhetlo a mangata bakeng sa tokiso ea eona e se nang likhohlano. Ka mantsoe a mang, haeba apply ka lehlakoreng la seva e tla ata haholo, ho tla hlaha sebopeho se sireletsehileng sa bokahohle sa taolo ea lisebelisoa bakeng sa bareki ba fapaneng, mohlala, kubectl, Pulumi kapa Terraform, GitOps, hammoho le mangolo a ngotseng a sebelisa lilaebrari tsa bareki.

Liphello

Ke ts'epa hore kakaretso ena e khuts'oane ea mekhoa e fapaneng ea ho nchafatsa lisebelisoa ka lihlopha e bile thuso ho uena. Ho hotle ho tseba hore ha e sebetse feela khahlano le sebaka; hoa khonahala ho nchafatsa sesebelisoa ka ho sebelisa kopo, ho hlophisa, ho patch kapa ho khutlisa. Ntle le moo, ha e le hantle, mokhoa o mong le o mong o na le sebaka sa ona sa kopo. Bakeng sa liphetoho tsa athomo, ho molemo ho nkela sebaka; ho seng joalo, o lokela ho sebelisa patch ea strategic-merge ka kopo. Bonyane, ke lebelletse hore u utloisise hore u ke ke ua tšepa Google kapa StackOerflow ha u batla "kubernetes apply vs replace". Bonyane ho fihlela sehlooho sena se nkela karabo ea hona joale sebaka.

Papiso e Nepahetseng ea Kubernetes Etsa kopo, Fetola le Patch

Source: www.habr.com

Eketsa ka tlhaloso