ProHoster > Blogs > AdministrÄcija > TrÄ«s veidu sapludinÄÅ”ana ar werf: izvietoÅ”ana Kubernetes ar Helm āuz steroÄ«diemā
TrÄ«s veidu sapludinÄÅ”ana ar werf: izvietoÅ”ana Kubernetes ar Helm āuz steroÄ«diemā
Notika tas, ko mÄs (un ne tikai mÄs) ilgi esam gaidÄ«juÅ”i: werf, mÅ«su atvÄrtÄ pirmkoda utilÄ«ta lietojumprogrammu veidoÅ”anai un piegÄdei Kubernetes, tagad atbalsta izmaiÅu piemÄroÅ”anu, izmantojot trÄ«svirzienu sapludinÄÅ”anas ielÄpus! Papildus tam ir iespÄjams izmantot esoÅ”os K3s resursus Helm laidienos, nepÄrbÅ«vÄjot Å”os resursus.
Ja tas ir ļoti Ä«ss, tad liekam WERF_THREE_WAY_MERGE=enabled ā mÄs saÅemam izvietoÅ”anu ākÄ in kubectl apply", kas ir savietojams ar esoÅ”ajÄm Helm 2 instalÄcijÄm un pat nedaudz vairÄk.
Bet sÄksim ar teoriju: kas Ä«sti ir trÄ«svirzienu sapludinÄÅ”anas ielÄpi, kÄ cilvÄki izdomÄja pieeju to Ä£enerÄÅ”anai un kÄpÄc tie ir svarÄ«gi CI/CD procesos ar Kubernetes bÄzÄtu infrastruktÅ«ru? Un pÄc tam apskatÄ«sim, kas ir werf 3-way-mege, kÄdi režīmi tiek izmantoti pÄc noklusÄjuma un kÄ to pÄrvaldÄ«t.
Kas ir trÄ«svirzienu sapludinÄÅ”anas ielÄps?
TÄtad, sÄksim ar uzdevumu ieviest YAML manifestos aprakstÄ«tos resursus Kubernetes.
Lai strÄdÄtu ar resursiem, Kubernetes API piedÄvÄ Å”Ädas pamatdarbÄ«bas: izveide, ielÄps, aizstÄÅ”ana un dzÄÅ”ana. Tiek pieÅemts, ka ar viÅu palÄ«dzÄ«bu ir nepiecieÅ”ams izveidot Ärtu nepÄrtrauktu resursu ievieÅ”anu klasterÄ«. KÄ?
kubectl imperatīvas komandas
PirmÄ pieeja objektu pÄrvaldÄ«bai Kubernetes ir izmantot kubectl imperative komandas, lai izveidotu, modificÄtu un dzÄstu Å”os objektus. VienkÄrÅ”i liec:
komanda kubectl run varat palaist izvietoŔanu vai darbu:
kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE
komanda kubectl scale ā mainÄ«t kopiju skaitu:
kubectl scale --replicas=3 deployment/mysql
uc
Å Ä« pieeja no pirmÄ acu uzmetiena var Ŕķist Ärta. TomÄr ir problÄmas:
Tas ir grÅ«ti automatizÄt.
KÄ atspoguļo konfigurÄciju in Git? KÄ pÄrskatÄ«t klasterÄ« notiekoÅ”Äs izmaiÅas?
Ir skaidrs, ka Ŕī pieeja nav labi piemÄrota lietojumprogrammas un infrastruktÅ«ras glabÄÅ”anai kÄ kods (IaC vai pat GitOps kÄ modernÄka iespÄja, iegÅ«stot popularitÄti Kubernetes ekosistÄmÄ). TÄpÄc Ŕīs komandas nesaÅÄma turpmÄku attÄ«stÄ«bu kubectl.
Izveidojiet, iegÅ«stiet, nomainiet un dzÄsiet darbÄ«bas
Ar primÄro radÄ«Å”anu tas ir vienkÄrÅ”i: nosÅ«tiet manifestu uz operÄciju create kube api un resurss ir izveidots. Manifesta YAML attÄlojumu var saglabÄt Git un izveidot, izmantojot komandu kubectl create -f manifest.yaml.
Š” noÅemÅ”ana arÄ« vienkÄrÅ”i: aizstÄjiet to paÅ”u manifest.yaml no Git uz komandu kubectl delete -f manifest.yaml.
DarbÄ«ba replace ļauj pilnÄ«bÄ aizstÄt resursa konfigurÄciju ar jaunu, neizveidojot resursu no jauna. Tas nozÄ«mÄ, ka pirms izmaiÅu veikÅ”anas resursÄ ir loÄ£iski vaicÄt paÅ”reizÄjo versiju ar operÄciju get, mainiet to un atjauniniet to ar operÄciju replace. kube apiserver ir iebÅ«vÄts optimistiska bloÄ·ÄÅ”ana un, ja pÄc operÄcijas get ir mainÄ«jies objekts, tad darbÄ«ba replace tas nedarbosies.
Lai saglabÄtu konfigurÄciju Git un atjauninÄtu to, izmantojot aizstÄÅ”anu, jums ir jÄveic darbÄ«ba get, sapludiniet konfigurÄciju no Git ar to, ko mÄs saÅÄmÄm, un izpildiet replace. PÄc noklusÄjuma kubectl ļauj izmantot tikai komandu kubectl replace -f manifest.yamlKur manifest.yaml ā jau pilnÄ«bÄ sagatavots (mÅ«su gadÄ«jumÄ apvienots) manifests, kas jÄinstalÄ. IzrÄdÄs, ka lietotÄjam ir jÄievieÅ” sapludinÄÅ”anas manifesti, un tas nav mazsvarÄ«gs...
Ir arÄ« vÄrts atzÄ«mÄt, ka, lai gan manifest.yaml un tiek glabÄts Git, mÄs nevaram iepriekÅ” zinÄt, vai ir nepiecieÅ”ams izveidot objektu vai to atjauninÄt - tas ir jÄdara lietotÄja programmatÅ«rai.
KopÄ: vai mÄs varam izveidot nepÄrtrauktu izlaiÅ”anu tikai izmantojot izveidot, aizstÄt un dzÄst, nodroÅ”inot, ka infrastruktÅ«ras konfigurÄcija tiek saglabÄta Git kopÄ ar kodu un Ärtu CI/CD?
PrincipÄ mÄs varam... Par Å”o jums bÅ«s jÄÄ«steno apvienoÅ”anas darbÄ«ba manifesti un sava veida saistÄ«ba, kas:
pÄrbauda objekta klÄtbÅ«tni klasterÄ«,
veic sÄkotnÄjo resursu izveidi,
atjaunina vai dzÄÅ” to.
Atjauninot, lÅ«dzu, Åemiet vÄrÄ to resurss var bÅ«t mainÄ«jies kopÅ” pÄdÄjÄs get un automÄtiski apstrÄdÄjiet optimistiskas bloÄ·ÄÅ”anas gadÄ«jumu ā veiciet atkÄrtotas atjauninÄÅ”anas mÄÄ£inÄjumus.
TomÄr kÄpÄc no jauna izgudrot riteni, ja kube-apiserver piedÄvÄ citu veidu, kÄ atjauninÄt resursus: darbÄ«bu patch, kas atbrÄ«vo lietotÄju no dažÄm aprakstÄ«tajÄm problÄmÄm?
plÄksteris
Tagad mÄs nonÄkam pie ielÄpiem.
IelÄpi ir galvenais veids, kÄ lietot izmaiÅas esoÅ”ajos Kubernetes objektos. DarbÄ«ba patch tas darbojas Å”Ädi:
kube-apiserver lietotÄjam ir jÄnosÅ«ta ielÄps JSON formÄ un jÄnorÄda objekts,
un apiserver pats tiks galÄ ar objekta paÅ”reizÄjo stÄvokli un izveidos to vajadzÄ«gajÄ formÄ.
Optimistiska bloÄ·ÄÅ”ana Å”ajÄ gadÄ«jumÄ nav nepiecieÅ”ama. Å Ä« darbÄ«ba ir vairÄk deklaratÄ«va nekÄ aizstÄÅ”ana, lai gan sÄkotnÄji var Ŕķist otrÄdi.
TÄdÄ veidÄ:
izmantojot operÄciju create mÄs izveidojam objektu saskaÅÄ ar Git manifestu,
via delete ā dzÄst, ja objekts vairs nav vajadzÄ«gs,
via patch ā mainÄm objektu, nogÄdÄjot to Git aprakstÄ«tajÄ formÄ.
TomÄr, lai to izdarÄ«tu, jums ir jÄizveido pareizs plÄksteris!
KÄ ielÄpi darbojas Helm 2: divvirzienu sapludinÄÅ”ana
Pirmoreiz instalÄjot laidienu, Helm veic operÄciju create diagrammas resursiem.
Atjauninot Helm laidienu katram resursam:
Åem vÄrÄ ielÄpu starp resursa versiju no iepriekÅ”ÄjÄs diagrammas un paÅ”reizÄjo diagrammas versiju,
lieto Å”o ielÄpu.
MÄs sauksim Å”o ielÄpu Divvirzienu sapludinÄÅ”anas ielÄps, jo tÄ izveidÄ ir iesaistÄ«ti 2 manifesti:
resursu manifests no iepriekÅ”ÄjÄs laidiena,
resursa manifests no paÅ”reizÄjÄ resursa.
NoÅemot operÄciju delete in kube apiserver tiek izsaukts resursiem, kas tika deklarÄti iepriekÅ”ÄjÄ laidienÄ, bet nav deklarÄti paÅ”reizÄjÄ.
Divvirzienu sapludinÄÅ”anas ielÄpu pieejai ir problÄma: tÄ noved pie nav sinhronizÄcijas ar reÄlo resursa stÄvokli klasterÄ« un manifestu Git.
ProblÄmas ilustrÄcija ar piemÄru
ProgrammÄ Git diagrammÄ tiek saglabÄts manifests, kurÄ lauks image IzvietoÅ”anai ir nozÄ«me ubuntu:18.04.
LietotÄjs, izmantojot kubectl edit mainÄ«ja Ŕī lauka vÄrtÄ«bu uz ubuntu:19.04.
AtkÄrtoti izvietojot Helm diagrammu neÄ£enerÄ ielÄpu, jo lauks image iepriekÅ”ÄjÄ izdevuma versijÄ un paÅ”reizÄjÄ diagrammÄ ir vienÄdas.
PÄc atkÄrtotas izvietoÅ”anas image paliek ubuntu:19.04, lai gan diagrammÄ teikts ubuntu:18.04.
MÄs saÅÄmÄm desinhronizÄciju un zaudÄjÄm deklarativitÄti.
Kas ir sinhronizÄts resurss?
VispÄrÄ«gi runÄjot pabeigt Nav iespÄjams iegÅ«t atbilstÄ«bu starp resursa manifestu darbojas klasterÄ« un manifestu no Git. Jo reÄlÄ manifestÄ var bÅ«t pakalpojuma anotÄcijas/iezÄ«mes, papildu konteineri un citi dati, ko daži kontrolieri dinamiski pievieno un noÅem no resursa. MÄs nevaram un nevÄlamies saglabÄt Å”os datus Git. TomÄr mÄs vÄlamies, lai lauki, kurus mÄs skaidri norÄdÄ«jÄm pakalpojumÄ Git, pÄc izlaiÅ”anas iegÅ«tu atbilstoÅ”Äs vÄrtÄ«bas.
Tas izrÄdÄs tik vispÄrÄ«gi sinhronizÄto resursu kÄrtula: izlaižot resursu, varat mainÄ«t vai dzÄst tikai tos laukus, kas ir skaidri norÄdÄ«ti Git manifestÄ (vai tika norÄdÄ«ti iepriekÅ”ÄjÄ versijÄ un tagad ir dzÄsti).
Divvirzienu sapludinÄÅ”anas ielÄps
galvenÄ doma Divvirzienu sapludinÄÅ”anas ielÄps: mÄs Ä£enerÄjam ielÄpu starp pÄdÄjo lietoto manifesta versiju no Git un manifesta mÄrÄ·a versiju no Git, Åemot vÄrÄ paÅ”reizÄjo manifesta versiju no darbÄ«bas klastera. IegÅ«tajam ielÄpam jÄatbilst sinhronizÄtÄ resursa noteikumam:
jauni lauki, kas pievienoti mÄrÄ·a versijai, tiek pievienoti, izmantojot ielÄpu;
IepriekÅ” esoÅ”ie lauki pÄdÄjÄ lietotajÄ versijÄ un nepastÄvÄjuÅ”i mÄrÄ·a versijÄ tiek atiestatÄ«ti, izmantojot ielÄpu;
Lauki objekta paÅ”reizÄjÄ versijÄ, kas atŔķiras no manifesta mÄrÄ·a versijas, tiek atjauninÄti, izmantojot ielÄpu.
PÄc Ŕī principa tas Ä£enerÄ ielÄpus kubectl apply:
pÄdÄjÄ lietotÄ manifesta versija tiek saglabÄta paÅ”a objekta anotÄcijÄ,
mÄrÄ·is - Åemts no norÄdÄ«tÄ YAML faila,
paÅ”reizÄjais ir no darbojas klastera.
Tagad, kad esam sakÄrtojuÅ”i teoriju, ir pienÄcis laiks pastÄstÄ«t, ko mÄs darÄ«jÄm werf.
IzmaiÅu piemÄroÅ”ana werf
IepriekÅ” werf, tÄpat kÄ Helm 2, izmantoja divvirzienu sapludinÄÅ”anas ielÄpus.
Remonta plÄksteris
Lai pÄrietu uz jauna veida ielÄpiem - 3-way-merge -, pirmais solis tika ieviests t.s. remonta ielÄpi.
Izvietojot tiek izmantots standarta divvirzienu sapludinÄÅ”anas ielÄps, bet werf papildus Ä£enerÄ ielÄpu, kas sinhronizÄtu reÄlo resursa stÄvokli ar Git rakstÄ«to (Å”Äds ielÄps tiek izveidots, izmantojot to paÅ”u iepriekÅ” aprakstÄ«to sinhronizÄtÄ resursa kÄrtulu) .
Ja notiek desinhronizÄcija, izvietoÅ”anas beigÄs lietotÄjs saÅem BRÄŖDINÄJUMU ar atbilstoÅ”u ziÅojumu un ielÄpu, kas jÄpielieto, lai resurss nonÄktu sinhronizÄtÄ formÄ. Å is ielÄps ir ierakstÄ«ts arÄ« Ä«paÅ”Ä anotÄcijÄ werf.io/repair-patch. Tiek pieÅemts, ka lietotÄja rokÄs pats uzliks Å”o ielÄpu: werf to neuzliks vispÄr.
LaboÅ”anas ielÄpu Ä£enerÄÅ”ana ir pagaidu pasÄkums, kas ļauj faktiski pÄrbaudÄ«t ielÄpu izveidi, pamatojoties uz trÄ«svirzienu sapludinÄÅ”anas principu, bet nelietot Å”os ielÄpus automÄtiski. Å obrÄ«d Å”is darbÄ«bas režīms ir iespÄjots pÄc noklusÄjuma.
TrÄ«svirzienu sapludinÄÅ”anas ielÄps tikai jauniem izdevumiem
SÄkot ar 1. gada 2019. decembri, sÄksies werf beta un alfa versijas pÄc noklusÄjuma izmantojiet pilnvÄrtÄ«gus trÄ«svirzienu sapludinÄÅ”anas ielÄpus, lai izmaiÅas lietotu tikai jaunajiem Helm laidieniem, kas izlaisti caur werf. EsoÅ”ie laidieni turpinÄs izmantot divvirzienu sapludinÄÅ”anas un laboÅ”anas ielÄpu pieeju.
Å o darbÄ«bas režīmu var tieÅ”i iespÄjot, iestatot WERF_THREE_WAY_MERGE_MODE=onlyNewReleases tagad.
PiezÄ«me: funkcija parÄdÄ«jÄs werf vairÄkos laidienos: alfa kanÄlÄ tÄ kļuva gatava ar versiju v1.0.5-alpha.19, bet beta kanÄlÄ - ar v1.0.4-beta.20.
3 virzienu sapludinÄÅ”anas ielÄps visiem laidieniem
SÄkot ar 15. gada 2019. decembri, werf beta un alfa versijas pÄc noklusÄjuma sÄk izmantot pilnus trÄ«svirzienu sapludinÄÅ”anas ielÄpus, lai piemÄrotu izmaiÅas visiem laidieniem.
Å o darbÄ«bas režīmu var tieÅ”i iespÄjot, iestatot WERF_THREE_WAY_MERGE_MODE=enabled tagad.
Ko darÄ«t ar resursu automÄtisko mÄrogoÅ”anu?
ProgrammÄ Kubernetes ir 2 automÄtiskÄs mÄrogoÅ”anas veidi: HPA (horizontÄlÄ) un VPA (vertikÄlÄ).
HorizontÄli automÄtiski izvÄlas reprodukciju skaitu, vertikÄlÄ - resursu skaitu. Gan reprodukciju skaits, gan resursu prasÄ«bas ir norÄdÄ«tas resursa manifestÄ (skatiet Resursu manifestu). spec.replicas vai spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory Šø pÄrÄjie).
ProblÄma: ja lietotÄjs diagrammÄ konfigurÄ resursu tÄ, lai tas norÄdÄ«tu noteiktas vÄrtÄ«bas resursiem vai replikÄm un Å”im resursam ir iespÄjoti automÄtiskie mÄrogotÄji, tad ar katru izvietoÅ”anu werf atiestatÄ«s Ŕīs vÄrtÄ«bas uz diagrammas manifestÄ rakstÄ«tajÄm vÄrtÄ«bÄm. .
ProblÄmai ir divi risinÄjumi. SÄkumÄ vislabÄk ir izvairÄ«ties no automÄtiskÄs mÄrogoÅ”anas vÄrtÄ«bu skaidras norÄdÄ«Å”anas diagrammas manifestÄ. Ja Ŕī opcija kÄda iemesla dÄļ nav piemÄrota (piemÄram, tÄpÄc, ka diagrammÄ ir Ärti iestatÄ«t sÄkotnÄjos resursu ierobežojumus un reprodukciju skaitu), werf piedÄvÄ Å”Ädas anotÄcijas:
werf.io/set-replicas-only-on-creation=true
werf.io/set-resources-only-on-creation=true
Ja ir Å”Äda anotÄcija, werf neatiestatÄ«s atbilstoÅ”Äs vÄrtÄ«bas katrÄ izvietoÅ”anÄ, bet iestatÄ«s tÄs tikai tad, kad resurss tiks sÄkotnÄji izveidots.
SÄ«kÄku informÄciju skatiet projekta dokumentÄcijÄ HPA Šø BPN.
Aizliegt izmantot 3-way-mege plÄksteri
LietotÄjs paÅ”laik var aizliegt jaunu ielÄpu izmantoÅ”anu werf, izmantojot vides mainÄ«go WERF_THREE_WAY_MERGE_MODE=disabled. TomÄr sÄkot No 1. gada 2020. marta Å”is aizliegums vairs nebÅ«s spÄkÄ. un bÅ«s iespÄjams izmantot tikai 3-way-mege ielÄpus.
Resursu pieÅemÅ”ana werf
IzmaiÅu pielietoÅ”anas metodes apguve ar trÄ«svirzienu sapludinÄÅ”anas ielÄpiem ļÄva mums nekavÄjoties ieviest tÄdu lÄ«dzekli kÄ klasterÄ« esoÅ”o resursu pÄrÅemÅ”ana Helm laidienÄ.
Helm 2 ir problÄma: jÅ«s nevarat pievienot resursu diagrammas manifestiem, kas jau pastÄv klasterÄ«, ja Å”is resurss nav izveidots no jauna (sk. #6031, #3275). MÄs mÄcÄ«jÄm werf pieÅemt esoÅ”os resursus atbrÄ«voÅ”anai. Lai to izdarÄ«tu, ir jÄinstalÄ anotÄcija paÅ”reizÄjÄ resursa versijÄ no darbojoÅ”Äs klastera (piemÄram, izmantojot kubectl edit):
"werf.io/allow-adoption-by-release": RELEASE_NAME
Tagad resurss ir jÄapraksta diagrammÄ, un nÄkamreiz, kad werf izvietos laidienu ar atbilstoÅ”u nosaukumu, esoÅ”ais resurss tiks pieÅemts Å”ajÄ laidienÄ un paliks tÄ kontrolÄ. TurklÄt, pieÅemot resursa izlaiÅ”anai, werf nodos paÅ”reizÄjo resursa stÄvokli no darba klastera lÄ«dz stÄvoklim, kas aprakstÄ«ts diagrammÄ, izmantojot tos paÅ”us trÄ«sceļu sapludinÄÅ”anas ielÄpus un sinhronizÄtÄ resursa kÄrtulu.
PiezÄ«me: iestatÄ«Å”ana WERF_THREE_WAY_MERGE_MODE neietekmÄ resursu pieÅemÅ”anu - adopcijas gadÄ«jumÄ vienmÄr tiek izmantots 3 virzienu sapludinÄÅ”anas ielÄps.
Ceru, ka pÄc Ŕī raksta ir kļuvis skaidrÄks, kas ir 3-way-merge ielÄpi un kÄpÄc tie nonÄca pie tiem. No werf projekta izstrÄdes praktiskÄ viedokļa to Ä«stenoÅ”ana bija vÄl viens solis Helm lÄ«dzÄ«gÄs izvietoÅ”anas uzlaboÅ”anai. Tagad varat aizmirst par problÄmÄm ar konfigurÄcijas sinhronizÄciju, kas bieži radÄs, izmantojot Helm 2. TajÄ paÅ”Ä laikÄ Helm izlaidumam tika pievienota jauna noderÄ«ga funkcija, kas ļauj pieÅemt jau lejupielÄdÄtos Kubernetes resursus.
JoprojÄm pastÄv dažas problÄmas un problÄmas ar Helm lÄ«dzÄ«gu izvietoÅ”anu, piemÄram, Go veidÅu izmantoÅ”anu, kuras mÄs turpinÄsim risinÄt.
InformÄciju par resursu atjauninÄÅ”anas metodÄm un pieÅemÅ”anu var atrast arÄ« vietnÄ Å”ajÄ dokumentÄcijas lapÄ.
Stūre 3
ÄŖpaÅ”as piezÄ«mes vÄrts atbrÄ«vots tikai citu dienu jauna galvenÄ Helm versija ā v3 ā, kas arÄ« izmanto trÄ«svirzienu sapludinÄÅ”anas ielÄpus un atbrÄ«vojas no Tiller. Jaunajai Helm versijai ir nepiecieÅ”ams migrÄcija esoÅ”Äs instalÄcijas, lai tÄs pÄrvÄrstu jaunÄ laidiena krÄtuves formÄtÄ.
SavukÄrt Werf paÅ”laik ir atbrÄ«vojies no Tiller izmantoÅ”anas, pÄrgÄjis uz 3-way-mege un pievienojis daudz vairÄk, vienlaikus saglabÄjot saderÄ«bu ar esoÅ”ajÄm Helm 2 instalÄcijÄm (nav jÄizpilda migrÄcijas skripti). TÄpÄc lÄ«dz brÄ«dim, kad werf pÄriet uz Helm 3, werf lietotÄji nezaudÄ Helm 3 galvenÄs priekÅ”rocÄ«bas salÄ«dzinÄjumÄ ar Helm 2 (tÄs ir arÄ« werf).
TomÄr werf pÄreja uz Helm 3 kodu bÄzi ir neizbÄgama un notiks tuvÄkajÄ nÄkotnÄ. DomÄjams, ka Ŕī bÅ«s werf 1.1 vai werf 1.2 (Å”obrÄ«d werf galvenÄ versija ir 1.0; plaÅ”Äku informÄciju par werf versiju veidoÅ”anas ierÄ«ci sk. Å”eit). Å ajÄ laikÄ Helm 3 bÅ«s laiks stabilizÄties.