Hoʻohālikelike kūpono o nā Kubernetes e noi, hoʻololi a hoʻopaʻa

He nui nā koho no Kubernetes no ka hoʻonui ʻana i nā kumuwaiwai: hoʻopili, hoʻoponopono, paʻi a hoʻololi. Aia ka huikau e pili ana i ka hana a kēlā me kēia a me ka wā e hoʻohana ai. E noʻonoʻo kākou.

Hoʻohālikelike kūpono o nā Kubernetes e noi, hoʻololi a hoʻopaʻa

ina huli ma Google aia ka huaʻōlelo "kubernetes apply vs replace". pane iā StackOverflow, ka mea pololei ole. I ka huli ana "kubernetes apply vs patch" ʻo ka loulou mua ka palapala no kubectl patch, ʻaʻole i komo ka hoʻohālikelike apply и patch. E nānā kēiaʻatikala i nā koho likeʻole, a me ka hoʻohana ponoʻana o kēlā me kēia.

I ka wā o ke ola o kahi kumu waiwai Kubernetes (lawelawe, hoʻolaha, komo, a me nā mea ʻē aʻe), i kekahi manawa pono ʻoe e hoʻololi, hoʻohui a wehe paha i kekahi mau waiwai o kēia kumuwaiwai. No ka laʻana, hoʻohui i kahi leka, hoʻonui a hoʻemi paha i ka helu o nā replicas.

Kubernetes CLI

Inā ʻoe e hana nei me nā pūʻulu Kubernetes ma o ka CLI, ua kamaʻāina ʻoe apply и edit. Hui apply Heluhelu ʻo ia i ka ʻōlelo kikoʻī waiwai mai ka faila a hana i kahi "upsert" i ka hui Kubernetes, ʻo ia hoʻi. hana i ka punawai inā ʻaʻole i loaʻa a hōʻano hou inā loaʻa. Hui edit Heluhelu i kahi kumuwaiwai ma o ka API, a laila kākau i ka ʻōlelo kikoʻī i kahi faila kūloko, a laila wehe ʻia i kahi hoʻoponopono kikokikona. Ma hope o kou hoʻoponopono ʻana a mālama i ka faila, kubectl e hoʻouna i nā hoʻololi i hana ʻia ma o ka API, nāna e hoʻopili pono i kēia mau hoʻololi i ka kumuwaiwai.

ʻAʻole ʻike nā kānaka a pau i nā kauoha patch и replace. Hui patch hiki iā ʻoe ke hoʻololi i kahi ʻāpana o kahi kikoʻī waiwai, hāʻawi wale i ka ʻāpana i hoʻololi ʻia ma ka laina kauoha. Hui replace hana like me edit, akā pono nā mea a pau e hana me ka lima: pono ʻoe e hoʻoiho i ka mana o kēia manawa o ka kikoʻī waiwai, no ka laʻana, me ka hoʻohana kubectl get -o yaml, hoʻoponopono, a laila hoʻohana replace e hoʻohou i kahi kumuwaiwai e like me kahi kikoʻī i hoʻololi ʻia. Hui replace ʻaʻole e holo inā loaʻa kekahi hoʻololi ma waena o ka heluhelu ʻana a me ka hoʻololi ʻana i ka punawai.

API Kubernetes

Ua kamaʻāina paha ʻoe i nā ʻano hana CoreV1().Pods().Update(), replaceNamespacedService ai ole ia, patch_namespaced_deployment, inā ʻoe e hana pū me nā pūʻulu ma o waihona mea kūʻai aku no Kubernetes API ka hoʻohana ʻana i kekahi ʻōlelo papahana. Mālama ka waihona i kēia mau ala ma o nā noi HTTP me ka hoʻohana ʻana i nā ala PUT и PATCH... Ma hea lā update и replace hoʻohana PUTa me ka patch, ʻaʻohe mea liʻiliʻi paha, hoʻohana PATCH.

He mea kūpono eʻike i kēlā kubectl hana pū me nā pūʻulu ma o API. ʻO ia hoʻi, kubectlhe wīwī ma luna o ka waihona mea kūʻai aku no ka ʻōlelo Go, kahi e hāʻawi nui ai i ka hiki ke hāʻawi i nā subcommands ma kahi ʻano paʻa a hiki ke heluhelu ʻia me ka hoʻohui ʻana i nā mana API maʻamau. No ka laʻana, e like me kāu i ʻike mua ai, ke ʻano apply ʻaʻole i ʻōlelo ʻia ma luna ma ka paukū mua. I kēia manawa (Mei 2020, kokoke. mea unuhi) nā loina a pau kubectl apply, i.e. ka hana ʻana i nā kumu waiwai ʻole a me ka hoʻonui ʻana i nā mea i loaʻa, hana holoʻokoʻa ma ka ʻaoʻao code kubectl. Ke hooikaika nei ma ka hoʻoili manaʻo apply i ka ʻaoʻao API, akā aia nō i ka beta. E kākau au i nā kikoʻī hou aku ma lalo nei.

Pākuʻi ma ka paʻamau

Hoʻohana maikaʻi ʻia patch, inā makemake ʻoe e hōʻano hou i ka punawai. Pēlā e hana ai nā hale waihona puke ʻelua ma luna o ka Kubernetes API a kubectl (ʻaʻole he mea kupanaha, no ka mea, he wahī ia no ka waihona mea kūʻai aku, kokoke. mea unuhi).

E hana ma ka hoʻolālā

Nā hui a pau kubectl apply, edit и patch hoʻohana i ke ʻano PATCH i nā noi HTTP e hoʻohou i kahi kumuwaiwai i loaʻa. Inā ʻoe e ʻimi i ka hoʻokō ʻana i nā kauoha i nā kikoʻī hou aku, a laila hoʻohana lākou a pau i ke ala hoʻopili hoʻohui ʻia e hōʻano hou i nā kumuwaiwai, ʻoiai ke kauoha patch hiki ke hoʻohana i nā ala ʻē aʻe (e pili ana i kēia ma lalo). Ke ho'āʻo nei ka hoʻolālā hoʻohui hoʻohui i ka "hoʻoponopono" ma ka hoʻohui ʻana i ka kikoʻī i hāʻawi ʻia me ka kikoʻī e kū nei. ʻOi aku ka kikoʻī, hoʻāʻo ʻo ia e hoʻohui i nā mea ʻelua a me nā arrays, ʻo ia hoʻi nā loli i hoʻohui ʻia. No ka laʻana, e holo ana i ke kauoha patch me kahi loli kaiapuni hou i ka kikoʻī pahu pahu, e hoʻohui ʻia kēlā ʻano hoʻololi kaiapuni i nā loli kaiapuni e kū nei ma mua o ke kākau ʻana iā lākou. No ka wehe ʻana i ka hoʻohana ʻana i kēia ala, pono ʻoe e hoʻoikaika i ka waiwai parameter i ka null i ka kikoʻī i hāʻawi ʻia. ʻO wai o nā hui kubectl ʻOi aku ka maikaʻi o ka hoʻohana ʻana no ka hoʻonui ʻana?

Inā ʻoe e hana a mālama i kāu mau kumuwaiwai me ka hoʻohana ʻana kubectl apply, i ka wā e hoʻonui ai ʻoi aku ka maikaʻi o ka hoʻohana mau ʻana kubectl applyno laila kubectl hiki ke hoʻokele i ka hoʻonohonoho ʻana a nānā pono i nā hoʻololi i noi ʻia mai kahi noi i kahi noi. Hoʻohana mau ka pōmaikaʻi apply ʻo ia ka mālama ʻana i kahi kikoʻī i noi mua ʻia, e ʻae iā ia e ʻike i ka wā e wehe ʻia ai nā waiwai kikoʻī a me nā mea hoʻonohonoho. ʻAe kēia iā ʻoe e hoʻohana apply e hoʻoneʻe i nā waiwai a me nā mea hoʻonohonoho, ʻoiai ʻaʻole e holo ka hui hoʻolālā maʻamau. Nā hui edit и patch mai hōʻano hou i nā memo i kēlā kubectl apply hoʻohana e hahai i kāna mau hoʻololi, no laila ke nānā ʻia a hana ʻia ma o ka Kubernetes API, akā hana ʻia ma o nā kauoha. edit и patch, ʻike ʻole ʻia e nā kauoha ma hope apply,ʻo ia hoʻi apply ʻaʻole ia e wehe iā lākou inā ʻaʻole lākou i ʻike ʻia ma ka kikoʻī kikoʻī no apply (Ua ʻōlelo ka palapala edit и patch hana hou i nā memo i hoʻohana ʻia apply, akā ma ka hana - ʻaʻole).

Inā ʻaʻole ʻoe e hoʻohana i ke kauoha apply, hiki ke hoʻohana e like me edit, a patch, ke koho ʻana i ke kauoha i kūpono i ka hoʻololi e hana ʻia nei. I ka hoʻohui ʻana a me ka hoʻololi ʻana i nā waiwai BOM, ʻano like nā ala ʻelua. I ka holoi ʻana i nā waiwai kikoʻī a i ʻole nā ​​mea hoʻonohonoho edit hana e like me ka hoʻomaka hoʻokahi manawa apply, me ka mālama ʻana i ke ʻano o ka kikoʻī ma mua a ma hope o ka hoʻoponopono ʻia ʻana, no laila hiki iā ʻoe ke wehe pono i nā waiwai a me nā mea hoʻonohonoho mai kahi kumuwaiwai. Pono ʻoe e hoʻonohonoho pono i ka waiwai waiwai i ka null i ka kikoʻī no patche hoʻoneʻe iā ia mai ka punawai. ʻOi aku ka paʻakikī o ka wehe ʻana i kahi mea hoʻohana me ka hoʻohana ʻana i ka hoʻopili ʻana i ka hoʻohui ʻana no ka mea pono ia i ka hoʻohana ʻana i nā kuhikuhi merge. E ʻike i nā ala hoʻonui ʻē aʻe ma lalo nei no nā koho ʻē aʻe.

E hoʻokō i nā ʻano hana hou i ka waihona mea kūʻai aku e hana like me nā kauoha i luna kubectl, pono e hoonoho i na noi content-type в application/strategic-merge-patch+json. Inā makemake ʻoe e wehe i nā waiwai i kahi kikoʻī, pono ʻoe e hoʻonohonoho pono i kā lākou mau waiwai i ka null ma ke ʻano like. kubectl patch. Inā pono ʻoe e wehe i nā mea hoʻonohonoho, pono ʻoe e hoʻokomo i nā kuhikuhi hoʻohui i ka kikoʻī hou a i ʻole e hoʻohana i kahi ala ʻē aʻe i nā mea hou.

ʻO nā ala ʻē aʻe e hoʻonui ai

Kākoʻo ʻo Kubernetes i ʻelua mau ala hou: ʻO JSON hui pū ʻia и JSON paʻi. Lawe ka JSON merge patch i kahi kikoʻī Kubernetes ma ke ʻano he hoʻokomo a kākoʻo i ka hoʻohui ʻana i nā mea e like me ka hoʻolālā hoʻohui hoʻolālā. ʻO ka ʻokoʻa ma waena o nā mea ʻelua, ʻo ia wale nō ke kākoʻo i ka hoʻololi ʻana i ka array, me ka pūʻulu pahu i ka kikoʻī pod. ʻO ia ke ʻano o ka hoʻohana ʻana i kahi JSON merge patch, pono ʻoe e hāʻawi i nā kikoʻī piha no nā pahu āpau inā hoʻololi kekahi waiwai o kekahi pahu. No laila he mea pono kēia ala no ka wehe ʻana i nā mea mai kahi array i kahi BOM. Ma ka laina kauoha hiki iā ʻoe ke koho iā JSON merge patch me ka hoʻohana ʻana kubectl patch --type=merge. Ke hana pū me ka Kubernetes API, pono ʻoe e hoʻohana i ke ʻano noi PATCH a me ka hoʻokomo content-type в application/merge-patch+json.

Hoʻohana ka JSON patch approach, ma mua o ka hāʻawi ʻana i kahi kikoʻī ʻāpana o kahi kumuwaiwai, hoʻohana i ka hāʻawi ʻana i nā hoʻololi āu e makemake ai e hana i ka punawai ma ke ʻano he array, kahi i hōʻike ʻia ai kēlā me kēia ʻāpana o ka array i kahi wehewehe o ka hoʻololi i hana ʻia i ka punawai. He ala ʻoi aku ka maʻalahi a me ka ikaika o kēia ala e hōʻike ai i nā loli i hana ʻia, akā ma ke kumukūʻai o ka papa inoa ʻana i nā hoʻololi i hana ʻia ma kahi ʻano kūʻokoʻa, non-Kubernetes, ma mua o ka hoʻouna ʻana i kahi kikoʻī kumu waiwai. IN kubectl hiki iā ʻoe ke koho iā JSON patch me ka hoʻohana kubectl patch --type=json. Ke hoʻohana nei i ka Kubernetes API, hana kēia ala me ke ʻano noi PATCH a me ka hoʻokomo content-type в application/json-patch+json.

Pono mākou i ka hilinaʻi - hoʻohana i ka hoʻololi

I kekahi mau hihia, pono ʻoe e hōʻoia ʻaʻole i hoʻololi ʻia kahi kumuwaiwai ma waena o ka manawa i heluhelu ʻia ai ka punawai a me ka wā e hoʻonui ʻia ai. I nā huaʻōlelo ʻē aʻe, pono ʻoe e hōʻoia i nā loli a pau atomika. I kēia hihia, pono ʻoe e hoʻohana e hoʻonui i nā kumuwaiwai replace. No ka laʻana, inā loaʻa iā ʻoe kahi ConfigMap me kahi counter i hōʻano hou ʻia e nā kumu he nui, pono ʻoe e hōʻoia ʻaʻole e hoʻonui ʻia nā kumu ʻelua i ka counter i ka manawa like, e nalowale ai ka mea hou. No ka hōʻike ʻana, e noʻonoʻo i kahi kaʻina o nā hanana e hoʻohana ana i ke ala patch:

  • Loaʻa iā A a me B ke kūlana o kēia manawa o ka waiwai mai ka API
  • Hoʻohou kēlā me kēia kūloko i ka kikoʻī ma ka hoʻonui ʻana i ka counter e hoʻokahi a me ka hoʻohui ʻana iā "A" a i ʻole "B" i kēlā me kēia me ka "updated-by" memo.
  • A hoʻonui iki i ka punawai
  • Hoʻohou ʻo B i ka punawai

ʻO ka hopena, ua nalowale ka hōʻano hou A. Hana hope patch lanakila, hoʻonui ʻia ka counter e hoʻokahi ma mua o ʻelua, a pau ka waiwai o ka memo "updated-by" me "B" a ʻaʻohe "A". E hoʻohālikelike kākou i ka mea i luna me ka mea e hana ʻia ke hana ʻia nā mea hou me ka hoʻohana ʻana i ke ala replace:

  • Loaʻa iā A a me B ke kūlana o kēia manawa o ka waiwai mai ka API
  • Hoʻohou kēlā me kēia kūloko i ka kikoʻī ma ka hoʻonui ʻana i ka counter e hoʻokahi a me ka hoʻohui ʻana iā "A" a i ʻole "B" i kēlā me kēia me ka "updated-by" memo.
  • A hoʻonui iki i ka punawai
  • Hoʻāʻo ʻo B e hōʻano hou i ka punawai, akā hōʻole ʻia ka mea hou e ka API no ka mea aia ka mana kumu i ka kikoʻī. replace 'a'ole i kūlike me ka mana o kēia manawa o ka punawai ma Kubernetes no ka mea, ua ho'onui 'ia ka mana o ka punawai e ka hana pani a A.

Ma ka hihia i luna, pono ʻo B e kiʻi hou i ka kumuwaiwai, e hoʻololi i ka mokuʻāina hou a hoʻāʻo hou replace. E hoʻonui kēia i ka counter e ʻelua a me ka memo "updated-by" e hoʻokomo i ka "AB" ma ka hopena.

Hōʻike ka laʻana i luna i ka wā e hoʻokō ai replace Hoʻololi piha ʻia ka waiwai holoʻokoʻa. Hoʻohana ʻia no replace, ʻaʻole pono he hapa, a i ʻole ma nā ʻāpana e like me ka apply, akā piha, me ka hoʻohui resourceVersion i loko o ka metadata kikoʻī. Inā ʻaʻole ʻoe i hoʻā resourceVersion a i ʻole ka mana āu e hāʻawi ai i kēia manawa, e hōʻole ʻia ka mea pani. No laila ke ala maikaʻi loa e hoʻohana ai replace - heluhelu i ka punawai, hoʻohou a hoʻololi koke. Ke hoʻohana nei kubectl, penei paha ke ano:

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

Pono e hoʻomaopopo i kēia mau kauoha ʻelua, i hoʻokō ʻia ma ke kaʻina hana, e hoʻokō pono ana, ʻoiai deployment.yaml aole waiwai .metadata.resourceVersion

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

Me he mea lā ua kūʻē kēia i ka mea i ʻōlelo ʻia ma luna, ʻo ia hoʻi. "hoʻohui resourceVersion i loko o ka metadata kikoʻī." He hewa paha ka ʻōlelo ʻana pēlā? ʻAʻole, ʻaʻole ia, no ka mea inā kubectl nā hoʻolaha āu i kuhikuhi ʻole ai resourceVersion, e heluhelu ia mai ka punawai a hoʻohui i ka kikoʻī āu i kuhikuhi ai, a laila hoʻokō wale ia. replace. No ka mea hiki ke pilikia kēia inā hilinaʻi ʻoe i ka atomicity, hana holoʻokoʻa ka hana kilokilo ma ka ʻaoʻao kubectl, ʻaʻole pono ʻoe e hilinaʻi iā ia i ka wā e hoʻohana ai i nā hale waihona puke mea kūʻai aku e hana pū me ka API. I kēia hihia, pono ʻoe e heluhelu i ka ʻōlelo kikoʻī o kēia manawa, hoʻololi a hoʻokō PUT noi.

ʻAʻole hiki iā ʻoe ke hana i kahi pāpale - hana mākou i kahi pani

I kekahi manawa pono ʻoe e hana i kekahi mau loli i hiki ʻole ke mālama ʻia e ka API. I kēia mau hihia, hiki iā ʻoe ke hoʻoikaika i ka hoʻololi ʻana i ka kumuwaiwai ma ka holoi ʻana a hana hou iā ia. Hana ʻia kēia me ka hoʻohana ʻana kubectl replace --force. ʻO ka holo ʻana i ke kauoha e wehe koke i nā kumuwaiwai a laila hana hou iā lākou mai ka kikoʻī i hāʻawi ʻia. ʻAʻohe mea "hoʻololi ikaika" i ka API, a i mea e hana ai ma o ka API, pono ʻoe e hana i ʻelua hana. Pono mua ʻoe e holoi i ka punawai ma ka hoʻonohonoho ʻana iā ia gracePeriodSeconds i ka zero (0) a propagationPolicy ma "Background" a laila e hana hou i kēia kumuwaiwai me ka kikoʻī i makemake ʻia.

'Ōlelo Aʻo: He pilikia kēia ala a hiki ke alakaʻi i kahi kūlana i wehewehe ʻole ʻia.

E noi ma ka ʻaoʻao kikowaena

E like me ka mea i ʻōlelo ʻia ma luna, ke hana nei nā mea hoʻomohala Kubernetes i ka hoʻokō ʻana i ka loiloi apply mai kubectl i ka Kubernetes API. Lokoka apply loaʻa ma Kubernetes 1.18 ma o kubectl apply --server-side a i ʻole ma o ka API e hoʻohana ana i ke ʻano PATCH с content-type application/apply-patch+YAML.

'Ōlelo Aʻo: He YAML kūpono ʻo JSON, no laila hiki iā ʻoe ke hoʻouna i ka kikoʻī e like me JSON inā paha content-type e e application/apply-patch+yaml.

Ma waho aʻe o kēlā loiloi kubectl loaʻa i nā mea a pau ma o ka API, apply ma ka ʻaoʻao kikowaena, mālama i ka mea nona ke kuleana no nā māla i ka kikoʻī, pēlā e ʻae ai i ka hoʻopaʻa ʻana i nā mea he nui no kāna hoʻoponopono hakakā ʻole. ʻO ia hoʻi, inā apply ma ka ʻaoʻao kikowaena e hoʻolaha nui ʻia, e ʻike ʻia kahi kikowaena hoʻokele waiwai palekana honua no nā mea kūʻai aku like ʻole, no ka laʻana, kubectl, Pulumi a i ʻole Terraform, GitOps, a me nā palapala kākau ponoʻī e hoʻohana ana i nā hale waihona puke.

Nā hopena

Manaʻo wau ua kōkua kēia ʻike pōkole o nā ʻano like ʻole e hoʻonui ai i nā kumuwaiwai i nā pūʻulu. Maikaʻi ka ʻike ʻana ʻaʻole pili wale ia me ka hoʻololi; hiki ke hoʻonui i kahi kumuwaiwai me ka hoʻohana ʻana i ka noi, hoʻoponopono, patch, a i ʻole ke pani. Ma hope o nā mea a pau, ma ke kumu, aia kēlā me kēia ala i kāna wahi ponoʻī o ka noi. No nā hoʻololi atomika, ʻoi aku ka maikaʻi o ka hoʻololi ʻana; inā ʻaʻole, pono ʻoe e hoʻohana i ka papa hoʻohui hoʻolālā ma o ka noi. Ma ka liʻiliʻi loa, manaʻo wau e hoʻomaopopo ʻoe ʻaʻole hiki iā ʻoe ke hilinaʻi iā Google a i ʻole StackOerflow ke ʻimi nei i "kubernetes apply vs replace". Ma ka liʻiliʻi a hiki i kēia ʻatikala ke pani i ka pane o kēia manawa.

Hoʻohālikelike kūpono o nā Kubernetes e noi, hoʻololi a hoʻopaʻa

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka