3-rigting samesmelting na werf: ontplooiing na Kubernetes met Helm “op steroïede”

Waarop ons (en nie net ons nie) al lank gewag het, het gebeur: werf, ons oopbron-hulpmiddel vir die bou van toepassings en die lewering daarvan aan Kubernetes, ondersteun nou die toepassing van veranderinge deur gebruik te maak van 3-rigting-samevoegingskolle! Daarbenewens is dit moontlik om bestaande K8s-hulpbronne in Helm-vrystellings aan te neem sonder om hierdie hulpbronne te herbou.

3-rigting samesmelting na werf: ontplooiing na Kubernetes met Helm “op steroïede”

As dit baie kort is, dan sit ons WERF_THREE_WAY_MERGE=enabled - ons kry ontplooiing "soos in kubectl apply", versoenbaar met bestaande Helm 2-installasies en selfs 'n bietjie meer.

Maar kom ons begin met die teorie: wat presies is 3-rigting-samevoeging-kolle, hoe het mense vorendag gekom met die benadering om dit te genereer, en hoekom is dit belangrik in CI/CD-prosesse met Kubernetes-gebaseerde infrastruktuur? En daarna, kom ons kyk wat 3-way-merge in werf is, watter modusse by verstek gebruik word en hoe om dit te bestuur.

Wat is 'n 3-rigting-samevoegingspleister?

Dus, kom ons begin met die taak om die hulpbronne wat in YAML-manifeste beskryf word in Kubernetes uit te rol.

Om met hulpbronne te werk, bied die Kubernetes API die volgende basiese bewerkings: skep, pleister, vervang en verwyder. Daar word aanvaar dat dit met hul hulp nodig is om 'n gerieflike deurlopende uitrol van hulpbronne na die groepering te bou. Hoe?

kubectl gebiedende opdragte

Die eerste benadering tot die bestuur van voorwerpe in Kubernetes is om kubectl-imperatiewe opdragte te gebruik om daardie voorwerpe te skep, te wysig en uit te vee. Eenvoudig gestel:

  • per span kubectl run jy kan Deployment of Job laat loop:
    kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE
  • per span kubectl scale - verander die aantal replikas:
    kubectl scale --replicas=3 deployment/mysql
  • ens.

Hierdie benadering kan met die eerste oogopslag gerieflik lyk. Daar is egter probleme:

  1. Dit is moeilik outomatiseer.
  2. As weerspieël konfigurasie in Git? Hoe om veranderinge wat met die groepie gebeur, te hersien?
  3. Hoe om te voorsien reproduceerbaarheid konfigurasies tydens herbegin?
  4. ...

Dit is duidelik dat hierdie benadering nie goed pas by die stoor van toepassings en infrastruktuur as kode (IaC; of selfs GitOps as 'n meer moderne opsie, wat gewild raak in die Kubernetes-ekosisteem). Daarom het hierdie bevele nie verdere ontwikkeling in kubectl ontvang nie.

Skep, kry, vervang en vee bewerkings uit

Met primêre skepping dit is eenvoudig: stuur die manifes na die operasie create kube api en die hulpbron is geskep. Die YAML-voorstelling van die manifes kan in Git gestoor word en met die opdrag geskep word kubectl create -f manifest.yaml.

С verwydering ook eenvoudig: vervang dieselfde manifest.yaml van Git tot span kubectl delete -f manifest.yaml.

operasie replace laat jou toe om die hulpbronkonfigurasie heeltemal te vervang met 'n nuwe een, sonder om die hulpbron te herskep. Dit beteken dat dit logies is om die huidige weergawe met die operasie te bevraagteken voordat 'n verandering aan 'n hulpbron gemaak word get, verander dit en werk dit op met die bewerking replace. kube apiserver is ingebou optimistiese sluiting en, indien na die operasie get die voorwerp het verander, dan die bewerking replace dit sal nie werk nie.

Om die konfigurasie in Git te stoor en dit op te dateer met vervanging, moet jy die operasie doen get, voeg die konfigurasie van Git saam met wat ons ontvang het, en voer uit replace. By verstek laat kubectl jou slegs toe om die opdrag te gebruik kubectl replace -f manifest.yamlWaar manifest.yaml - 'n reeds volledig voorbereide (in ons geval, saamgevoegde) manifes wat geïnstalleer moet word. Dit blyk dat die gebruiker samesmeltingsmanifeste moet implementeer, en dit is nie 'n onbenullige saak nie ...

Dit is ook opmerklik dat alhoewel manifest.yaml en in Git gestoor word, kan ons nie vooraf weet of dit nodig is om 'n objek te skep of dit op te dateer nie - dit moet deur gebruikerssagteware gedoen word.

Totaal: kan ons 'n deurlopende uitrol bou gebruik slegs skep, vervang en verwyder, om te verseker dat die infrastruktuurkonfigurasie in Git gestoor word saam met die kode en gerieflike CI/CD?

In beginsel kan ons... Hiervoor jy sal die samesmeltingsoperasie moet implementeer manifeste en 'n soort binding wat:

  • kontroleer die teenwoordigheid van 'n voorwerp in die groep,
  • voer aanvanklike hulpbronskepping uit,
  • dateer of vee dit uit.

Let asseblief daarop dat wanneer u opdateer hulpbron kan verander het sedert laas get en hanteer outomaties die geval van optimistiese sluiting - maak herhaalde opdateringspogings.

Waarom egter die wiel herontdek wanneer kube-apiserver 'n ander manier bied om hulpbronne op te dateer: die operasie patch, wat die gebruiker van sommige van die beskryfde probleme onthef?

Patch

Nou kom ons by die kolletjies.

Pleisters is die primêre manier om veranderinge op bestaande voorwerpe in Kubernetes toe te pas. Operasie patch dit werk so:

  • die kube-apiserver-gebruiker moet 'n pleister in JSON-vorm stuur en die voorwerp spesifiseer,
  • en apiserver self sal die huidige toestand van die voorwerp hanteer en dit in die vereiste vorm bring.

Optimistiese sluiting word nie in hierdie geval vereis nie. Hierdie operasie is meer verklarend as vervang, hoewel dit aanvanklik andersom kan lyk.

dus:

  • met behulp van 'n operasie create ons skep 'n voorwerp volgens die manifes van Git,
  • met die hulp delete - skrap as die voorwerp nie meer nodig is nie,
  • met die hulp patch - ons verander die voorwerp en bring dit na die vorm wat in Git beskryf word.

Om dit te doen, moet jy egter skep korrekte pleister!

Hoe pleisters werk in Helm 2: 2-rigting-samevoeging

Wanneer jy die eerste keer 'n vrystelling installeer, voer Helm die bewerking uit create vir grafiekhulpbronne.

Wanneer 'n Helm-vrystelling vir elke hulpbron bygewerk word:

  • beskou die pleister tussen die hulpbronweergawe van die vorige grafiek en die huidige grafiekweergawe,
  • pas hierdie pleister toe.

Ons sal hierdie pleister noem 2-rigting samesmeltingspleister, want 2 manifeste is betrokke by die skepping daarvan:

  • hulpbronmanifes van die vorige vrystelling,
  • hulpbronmanifes vanaf die huidige hulpbron.

Wanneer die operasie verwyder word delete in kube apiserver word geroep vir hulpbronne wat in die vorige vrystelling verklaar is, maar nie in die huidige een verklaar is nie.

Die 2 manier samesmelting pleister benadering het 'n probleem: dit lei tot nie gesinchroniseer met die werklike toestand van die hulpbron in die groepering en die manifes in Git.

Illustrasie van die probleem met 'n voorbeeld

  • In Git stoor 'n grafiek 'n manifes waarin die veld image Ontplooiing maak saak ubuntu:18.04.
  • Gebruiker via kubectl edit het die waarde van hierdie veld verander na ubuntu:19.04.
  • Wanneer die Helm-grafiek herontplooi word genereer nie 'n pleister nie, want die veld image in die vorige weergawe van die vrystelling en in die huidige grafiek is dieselfde.
  • Na herontplooiing image bly oor ubuntu:19.04, hoewel die grafiek sê ubuntu:18.04.

Ons het desinchronisasie gekry en verklaarbaarheid verloor.

Wat is 'n gesinchroniseerde hulpbron?

Oor die algemeen vol Dit is onmoontlik om 'n passing te verkry tussen die hulpbronmanifes in 'n lopende groepering en die manifes van Git. Want in 'n werklike manifes kan daar diensaantekeninge/-etikette, bykomende houers en ander data wees wat dinamies deur sommige beheerders bygevoeg en verwyder word van die hulpbron. Ons kan en wil nie hierdie data in Git hou nie. Ons wil egter hê dat die velde wat ons uitdruklik in Git gespesifiseer het, die toepaslike waardes moet aanneem by die ontplooiing.

Dit blyk so algemeen gesinchroniseerde hulpbronreël: wanneer u 'n hulpbron uitrol, kan u slegs daardie velde verander of uitvee wat uitdruklik in die manifes van Git gespesifiseer is (of in 'n vorige weergawe gespesifiseer is en nou uitgevee is).

3-rigting samesmeltingspleister

sentrale idee 3-rigting samesmeltingspleister: genereer 'n pleister tussen die laaste toegepaste weergawe van die manifes vanaf Git en die teikenweergawe van die manifes vanaf Git, met inagneming van die huidige weergawe van die manifes vanaf die lopende groep. Die gevolglike pleister moet voldoen aan die gesinchroniseerde hulpbronreël:

  • nuwe velde wat by die teikenweergawe gevoeg word, word bygevoeg met behulp van 'n pleister;
  • voorheen bestaande velde in die laaste toegepaste weergawe en wat nie in die teikenweergawe bestaan ​​nie, word met 'n pleister teruggestel;
  • velde in die huidige weergawe van die voorwerp wat verskil van die teikenweergawe van die manifes, word opgedateer met behulp van die pleister.

Dit is op hierdie beginsel dat dit kolle genereer kubectl apply:

  • die laaste toegepaste weergawe van die manifes word gestoor in die annotasie van die voorwerp self,
  • teiken - geneem uit die gespesifiseerde YAML-lêer,
  • die huidige een is van 'n lopende groep.

Noudat ons die teorie uitgesorteer het, is dit tyd om jou te vertel wat ons in werf gedoen het.

Pas veranderinge op werf toe

Voorheen het werf, soos Helm 2, 2-rigting-samevoegingspleisters gebruik.

Herstel pleister

Om oor te skakel na 'n nuwe tipe pleisters - 3-way-merge - die eerste stap het ons die sg. pleisters herstel.

By ontplooiing word 'n standaard 2-rigting-samevoeging-pleister gebruik, maar werf genereer ook 'n pleister wat die werklike toestand van die hulpbron sal sinchroniseer met wat in Git geskryf is (so 'n pleister word geskep met dieselfde gesinchroniseerde hulpbronreël wat hierbo beskryf is) .

As 'n desinchronisasie plaasvind, ontvang die gebruiker aan die einde van die ontplooiing 'n WAARSKUWING met 'n ooreenstemmende boodskap en 'n pleister wat toegepas moet word om die hulpbron na 'n gesinchroniseerde vorm te bring. Hierdie pleister is ook in 'n spesiale aantekening aangeteken werf.io/repair-patch. Daar word aanvaar dat die gebruiker se hande deur homself sal hierdie pleister toepas: werf sal dit glad nie toepas nie.

Die generering van herstelpleisters is 'n tydelike maatreël wat jou toelaat om die skepping van pleisters werklik te toets gebaseer op die 3-rigting-samevoegingsbeginsel, maar moenie hierdie pleisters outomaties toepas nie. Op die oomblik is hierdie bedryfsmodus by verstek geaktiveer.

3-rigting-samevoeging-pleister slegs vir nuwe vrystellings

Vanaf 1 Desember 2019 begin beta- en alfa-weergawes van werf by verstek gebruik volwaardige 3-rigting-samevoegings kolle om veranderinge slegs toe te pas op nuwe Helm-vrystellings wat deur werf uitgerol word. Bestaande vrystellings sal voortgaan om die 2-rigting-samevoeging + herstelpleisterbenadering te gebruik.

Hierdie bedryfsmodus kan eksplisiet geaktiveer word deur die instelling WERF_THREE_WAY_MERGE_MODE=onlyNewReleases nou.

Let daarop: die funksie het oor verskeie vrystellings in werf verskyn: in die alfakanaal het dit gereed geword met weergawe v1.0.5-alfa.19, en in die beta-kanaal - met v1.0.4-beta.20.

3-rigting-samevoegingspleister vir alle vrystellings

Vanaf 15 Desember 2019 begin beta- en alfa-weergawes van werf by verstek volledige 3-rigting-samevoeging-kolle gebruik om veranderinge op alle vrystellings toe te pas.

Hierdie bedryfsmodus kan eksplisiet geaktiveer word deur die instelling WERF_THREE_WAY_MERGE_MODE=enabled nou.

Wat om te doen met hulpbron-outoskaal?

Daar is 2 tipes outoskaling in Kubernetes: HPA (horisontaal) en VPA (vertikaal).

Horisontaal kies outomaties die aantal replikas, vertikaal - die aantal hulpbronne. Beide die aantal replikas en hulpbronvereistes word in die hulpbronmanifes gespesifiseer (sien Hulpbronmanifes). spec.replicas of spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory и ander).

Probleem: as 'n gebruiker 'n hulpbron in 'n grafiek konfigureer sodat dit sekere waardes vir hulpbronne spesifiseer of replikas en outoskalers vir hierdie hulpbron geaktiveer is, sal werf met elke ontplooiing hierdie waardes terugstel na wat in die grafiekmanifes geskryf is .

Daar is twee oplossings vir die probleem. Om mee te begin, is dit die beste om te vermy dat outoskaalwaardes uitdruklik in die grafiekmanifes gespesifiseer word. As hierdie opsie om een ​​of ander rede nie geskik is nie (byvoorbeeld omdat dit gerieflik is om aanvanklike hulpbronlimiete en die aantal replikas in die grafiek te stel), dan bied werf die volgende aantekeninge:

  • werf.io/set-replicas-only-on-creation=true
  • werf.io/set-resources-only-on-creation=true

Indien so 'n aantekening teenwoordig is, sal werf nie die ooreenstemmende waardes op elke ontplooiing terugstel nie, maar sal dit eers stel wanneer die hulpbron aanvanklik geskep word.

Vir meer besonderhede, sien die projekdokumentasie vir HPA и VPA.

Verbied die gebruik van 3-rigting-samevoegingspleister

Die gebruiker kan tans die gebruik van nuwe kolle in werf verbied deur 'n omgewingsveranderlike te gebruik WERF_THREE_WAY_MERGE_MODE=disabled. Begin egter Vanaf 1 Maart 2020 sal hierdie verbod nie meer geld nie. en dit sal slegs moontlik wees om 3-rigting-samevoegings kolle te gebruik.

Aanneming van hulpbronne in werf

Die bemeestering van die metode om veranderinge toe te pas met 3-rigting-samevoegings kolle het ons toegelaat om onmiddellik so 'n kenmerk te implementeer soos om hulpbronne wat in die groepering bestaan, in die Helm-vrystelling aan te neem.

Roer 2 het 'n probleem: jy kan nie 'n hulpbron by kaartmanifes voeg wat reeds in die groepering bestaan ​​sonder om hierdie hulpbron van nuuts af te herskep nie (sien. #6031, #3275). Ons het werf geleer om bestaande hulpbronne vir vrystelling te aanvaar. Om dit te doen, moet jy 'n aantekening installeer op die huidige weergawe van die hulpbron vanaf die lopende groepering (byvoorbeeld deur gebruik te maak van kubectl edit):

"werf.io/allow-adoption-by-release": RELEASE_NAME

Nou moet die hulpbron in die grafiek beskryf word en die volgende keer as werf 'n vrystelling met die toepaslike naam ontplooi, sal die bestaande hulpbron in hierdie vrystelling aanvaar word en onder sy beheer bly. Bowendien, in die proses om 'n hulpbron vir vrystelling te aanvaar, sal werf die huidige toestand van die hulpbron vanaf die lopende kluster bring na die toestand wat in die grafiek beskryf word, deur dieselfde 3-rigting-samevoegingskolle en die gesinchroniseerde hulpbronreël te gebruik.

Let daarop: instelling WERF_THREE_WAY_MERGE_MODE beïnvloed nie die aanvaarding van hulpbronne nie - in die geval van aanneming word 'n 3-rigting-samevoeging-pleister altyd gebruik.

Besonderhede - in dokumentasie.

Gevolgtrekkings en toekomsplanne

Ek hoop dat dit na hierdie artikel duideliker geword het wat 3-rigting-samesmeltings kolle is en hoekom hulle na hulle gekom het. Uit 'n praktiese oogpunt van die ontwikkeling van die werfprojek was die implementering daarvan nog 'n stap in die rigting van die verbetering van die Roer-agtige ontplooiing. Nou kan jy vergeet van die probleme met konfigurasie-sinchronisasie, wat dikwels ontstaan ​​het met die gebruik van Helm 2. Terselfdertyd is 'n nuwe nuttige kenmerk van die aanneming van reeds afgelaaide Kubernetes-hulpbronne by die Helm-vrystelling gevoeg.

Daar is nog 'n paar kwessies en uitdagings met Helm-agtige ontplooiings, soos die gebruik van Go-sjablone, wat ons sal voortgaan om aan te spreek.

Inligting oor hulpbronopdateringsmetodes en aanvaarding kan ook gevind word by hierdie dokumentasiebladsy.

Roer 3

Beslis waardig vrygestel net die ander dag 'n nuwe hoof weergawe van Helm - v3 - wat ook gebruik maak van 3-rigting-samevoeg kolle en ontslae raak van Tiller. Die nuwe weergawe van Helm vereis migrasie bestaande installasies om dit om te skakel na die nuwe vrystelling stoorformaat.

Werf, op sy beurt, het tans ontslae geraak van die gebruik van Tiller, oorgeskakel na 3-rigting-samevoeging en bygevoeg baie meer, terwyl dit versoenbaar bly met bestaande Helm 2-installasies (geen migrasie-skrifte hoef uitgevoer te word nie). Dus, totdat werf na Helm 3 oorskakel, verloor werfgebruikers nie die belangrikste voordele van Helm 3 bo Helm 2 nie (werf het dit ook).

Die oorskakeling van werf na die Helm 3-kodebasis is egter onvermydelik en sal in die nabye toekoms gebeur. Vermoedelik sal dit werf 1.1 of werf 1.2 wees (op die oomblik is die hoof weergawe van werf 1.0; vir meer inligting oor die werf weergawe toestel, sien hier). Gedurende hierdie tyd sal Helm 3 tyd hê om te stabiliseer.

PS

Lees ook op ons blog:

Bron: will.com

Voeg 'n opmerking