werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Mee 27 an der Haaptsall vun der DevOpsConf 2019 Konferenz, am Kader vum Festival ofgehalen RIT++ 2019, am Kader vun der Rubrik "Continuous Delivery" gouf e Bericht "werf - our tool for CI/CD in Kubernetes". Et schwÀtzt iwwer déi Problemer an Erausfuerderungen, déi jidderee konfrontéiert beim Ofbau op Kubernetes, wéi och iwwer Nuancen, déi vlÀicht net direkt bemierkbar sinn. Analyséiere méiglech Léisungen, mir weisen wéi dëst an engem Open Source Tool ëmgesat gëtt werf.

Zënter der Presentatioun huet eis Utility (fréier als Dapp bekannt) en historesche Meilesteen erreecht 1000 StÀren op GitHub - mir hoffen datt seng wuessend Gemeinschaft vu Benotzer d'Liewe méi einfach mécht fir vill DevOps Ingenieuren.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Also, loosst eis virstellen Video vum Bericht (~ 47 Minutten, vill méi informativ wéi den Artikel) an den Haaptextrakt dovunner an Textform. Gitt!

Liwweren Code zu Kubernetes

D'Diskussioun wÀert net méi iwwer werf goen, mee iwwer CI/CD zu Kubernetes, wat implizéiert datt eis Software an Docker Container verpackt ass (Ech hunn iwwer dëst geschwat an Rapport 2016), an K8s wÀert benotzt ginn et zu Produktioun lafen (méi iwwer dëst an 2017 Joer).

Wéi gesÀit d'Liwwerung zu Kubernetes aus?

  • Et gĂ«tt e Git Repository mam Code an Instruktioune fir et ze bauen. D'Applikatioun ass an engem Docker Bild agebaut an am Docker Registry publizĂ©iert.
  • Dee selwechte Repository enthĂ€lt och Instruktioune wĂ©i d'Applikatioun z'installĂ©ieren an ausfĂ©iert. An der Installatiounsstadium ginn dĂ«s Instruktiounen un Kubernetes geschĂ©ckt, dĂ©i de gewĂ«nschte Bild aus der Registry kritt an et lancĂ©iert.
  • Plus, et ginn normalerweis Tester. E puer vun dĂ«sen kĂ«nne gemaach ginn wann Dir e Bild publizĂ©iert. Dir kĂ«nnt och (no dĂ©iselwecht Instruktiounen) eng Kopie vun der Applikatioun ofsetzen (an engem separaten K8s Nummraum oder engem separaten Cluster) an Tester do lafen.
  • Schlussendlech braucht Dir e CI System deen Eventer vu Git kritt (oder KnĂ€ppercher) an all dĂ©i designĂ©iert Etappen nennt: bauen, publizĂ©ieren, deployĂ©ieren, testen.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Et ginn e puer wichteg Notizen hei:

  1. Well mir hunn eng onverÀnnerbar Infrastruktur (onverÀnnerbar Infrastruktur), d'Applikatiounsbild dat an alle Stadien benotzt gëtt (Staging, Produktioun, asw.), et muss een sinn. Ech hunn iwwer dëst méi detailléiert a mat Beispiller geschwat. hei.
  2. Well mir verfollegen d'Infrastruktur als Code Approche (IaC), den Applikatiounscode, d'Instruktioune fir ze montéieren an ze lancéieren sollten sinn genee an engem Repository. Fir méi Informatiounen iwwer dëst, kuckt déi selwecht Rapport.
  3. Liwwerung Kette (Liwwerung) mir gesinn et normalerweis esou: d'Applikatioun gouf zesummegesat, getest, verëffentlecht (Verëffentlechungsstadium) an dat ass et - d'Liwwerung ass stattfonnt. Awer a Wierklechkeet kritt de Benotzer wat Dir ausgerullt hutt, Net dann wann Dir et zu Produktioun geliwwert, a wann hien dohinner goe konnt an dës Produktioun geschafft. Also ech gleewen datt d'Liwwerungskette endet nëmmen an der operationell Etapp (lafen), oder méi prÀzis, och am Moment wou de Code aus der Produktioun gelÀscht gouf (ersetzt et mat engem neien).

Loosst eis zréck op déi uewe genannte Liwwerschema zu Kubernetes: et gouf net nëmme vun eis erfonnt, mee vu wuertwiertlech jiddereen deen mat dësem Problem behandelt huet. TatsÀchlech gëtt dëst Muster elo GitOps genannt (Dir kënnt méi iwwer de Begrëff an d'Iddien hannendrun liesen hei). Loosst eis d'Etappe vum Schema kucken.

Etapp bauen

Et géif schéngen datt Dir iwwer Docker-Biller am Joer 2019 schwÀtze kënnt, wa jidderee weess wéi een Dockerfiles schreift a lafen docker build?.. Hei sinn d'Nuancen op déi ech gÀren oppassen:

  1. Bild Gewiicht wichteg, also benotzen Multi-Etappfir am Bild nëmmen d'Applikatioun ze loossen déi wierklech fir d'Operatioun néideg ass.
  2. Zuel vun Schichten muss miniméiert ginn duerch Kombinatioun vun Ketten vun RUN-Commande no Bedeitung.
  3. AllerdĂ©ngs fĂŒĂŒgt dĂ«st Problemer Debugging, Well wann d'Versammlung klappt, musst Dir de richtege Kommando aus der Kette fannen, dĂ©i de Problem verursaacht huet.
  4. AssemblĂ©e Vitesse wichteg well mir sĂ©ier Ännerungen wĂ«llen ausrollen an d'Resultater gesinn. Zum Beispill, Dir wĂ«llt net OfhĂ€ngegkeeten a SproochbibliothĂ©iken opbauen all KĂ©ier wann Dir eng Applikatioun baut.
  5. Dacks vun engem Git Repository Dir braucht vill Biller, déi duerch e Set vun Dockerfiles (oder benannte Stadien an enger Datei) an engem Bash Skript mat hirer sequentieller Versammlung geléist kënne ginn.

DĂ«st war just den Tipp vum Äisbierg mat deem jidderee konfrontĂ©iert ass. Awer et ginn aner Probleemer, besonnesch:

  1. Dacks brauche mir op der Montagestadium eppes montéieren (zum Beispill, Cache d'Resultat vun engem Kommando wéi apt an engem Drëtt Partei Verzeechnes).
  2. Mir wëllen Sicht amplaz an der Schuel ze schreiwen.
  3. Mir wëllen bauen ouni Docker (firwat brauche mir eng zousÀtzlech virtuell Maschinn, an dÀr mir alles dofir musse konfiguréieren, wa mir schonn e Kubernetes-Cluster hunn, an deem mir Container kënne lafen?).
  4. Parallel Assemblée, déi op verschidde Manéiere verstane kënne ginn: verschidde Kommandoen aus der Dockerfile (wann Multi-Stage benotzt gëtt), verschidde Verpflichtungen vum selwechte Repository, verschidde Dockerfiles.
  5. Verdeelt Versammlung: Mir wëllen Saachen an Pods sammelen déi "ephemeral" sinn, well hire Cache verschwënnt, dat heescht et muss iergendwou separat gespÀichert ginn.
  6. Schlussendlech hunn ech den Héichpunkt vun de Wënsch genannt automagic: Et wier ideal fir an de Repository ze goen, e Kommando ze tippen an e fÀerdegt Bild ze kréien, zesummegesat mat engem VerstÀndnis vu wéi a wat richteg ze maachen. Ech perséinlech sinn awer net sécher, datt all Nuancen esou virausgesinn sinn.

An hei sinn d'Projeten:

  • moby/buildkit - e Builder vun Docker Inc (schonn integrĂ©iert an aktuell Versioune vum Docker), dee probĂ©iert all dĂ«s Problemer ze lĂ©isen;
  • kaniko - e Builder vu Google deen Iech erlaabt ouni Docker ze bauen;
  • Buildpacks.io - De Versuch vum CNCF fir automatesch Magie ze maachen a besonnesch eng interessant LĂ©isung mat Rebase fir Schichten;
  • an eng RĂ«tsch aner Utilities, wĂ©i z bauen, genuinetools/img...

... a kuckt wéivill StÀren se op GitHub hunn. Dat heescht, engersÀits, docker build existéiert a kann eppes maachen, awer an der Realitéit de Problem ass net komplett geléist - Beweis dofir ass d'parallel Entwécklung vun alternativen Sammler, déi jidderee en Deel vun de Problemer léist.

Assemblée zu werf

Also hu mir bis werf (virdrun berĂŒhmt wĂ©i dapp) - En Open Source Utility vun der Flant Firma, dĂ©i mir zĂ«nter ville Joere maachen. Et huet alles ugefaang viru 5 Joer mat Bash Scripten dĂ©i d'Versammlung vun Dockerfiles optimisĂ©iert hunn, a fir dĂ©i lescht 3 Joer ass vollwĂ€erteg EntwĂ©cklung am Kader vun engem Projet mat sengem eegene Git Repository duerchgefouert ginn. (Ă©ischt am Ruby, an dann Ă«mgeschriwwen ze goen, a glĂ€ichzĂ€iteg Ă«mbenannt). Wat AssemblĂ©e Problemer sinn an werf gelĂ©ist?

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

D'Problemer, déi a blo schaarf sinn, si scho implementéiert, de parallele Bau gouf am selwechte Host gemaach, an d'Problemer, déi a giel markéiert sinn, si geplangt bis Enn vum Summer ofgeschloss ze ginn.

Etapp vun der Verëffentlechung am Registry (publicéieren)

Mir hu geruff docker push... - wat kéint schwéier sinn e Bild an d'Registry eropzelueden? An da stellt sech d'Fro: "Wéi eng Tag soll ech op d'Bild setzen?" Et entsteet aus dem Grond datt mir hunn Gitflow (oder aner Git Strategie) a Kubernetes, an d'Industrie probéiert sécherzestellen datt wat an Kubernetes geschitt ass wat am Git geschitt. No allem ass Git eis eenzeg Quell vun der Wourecht.

Wat ass sou schwéier un dësem? Garantéiert d'Reproduktioun: vun engem Engagement am Git, deen an der Natur onverÀnnerbar ass (onverÀnnerbar), zu engem Docker-Bild, dat sollt d'selwecht bleiwen.

Et ass och wichteg fir eis bestëmmen Urspronk, well mir wëlle verstoen aus wéi eng Verpflichtung d'Applikatioun déi am Kubernetes leeft gebaut gouf (da kënne mir Differenzen an Àhnlech Saachen maachen).

Tagging Strategien

DĂ©i Ă©ischt ass einfach git tag. Mir hunn e Registry mat engem Bild markĂ©iert als 1.0. Kubernetes huet BĂŒhn a Produktioun, wou dĂ«st Bild eropgeluede gĂ«tt. Am Git maache mir Verpflichtungen a mir taggen iergendwann 2.0. Mir sammelen et no den Instruktioune vum Repository a setzen se an de Registry mam Tag 2.0. Mir rullen et op d'BĂŒhn an, wann alles gutt ass, dann op d'Produktioun.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

De Problem mat dëser Approche ass datt mir fir d'éischt den Tag setzen, an nëmmen dann getest a gerullt hunn. Firwat? Als éischt ass et einfach onlogesch: mir ginn eng Versioun vu Software eraus, déi mir nach net getest hunn (mir kënnen net anescht maachen, well fir ze kontrolléieren, musse mir e Tag setzen). Zweetens ass dëse Wee net kompatibel mat Gitflow.

Déi zweet Optioun - git commit + tag. D'Meeschtesch Branche huet e Tag 1.0; fir et am Registry - e Bild op d'Produktioun ofgesat. ZousÀtzlech huet de Kubernetes Cluster Virschau an Inszenéierungskonturen. Als nÀchst verfollege mir Gitflow: an der Haaptbranche fir Entwécklung (develop) mir maachen nei Fonctiounen, wat zu engem Engagement mam Identifizéierer resultéiert #c1. Mir sammelen et a publizéieren et am Registry mat dësem Identifizéierer (#c1). Mat deemselwechten Identifizéierer rulle mir aus fir ze kucken. Mir maachen datselwecht mat Verpflichtungen #c2 О #c3.

Wann mir gemierkt hunn, datt et genuch Fonctiounen sinn, mir fĂ€nken alles ze stabilisĂ©ieren. Erstellt eng Filial am Git release_1.1 (op der Basis #c3 aus develop). Et ass net nĂ©ideg dĂ«s VerĂ«ffentlechung ze sammelen, well ... dĂ«st gouf am virege SchrĂ«tt gemaach. Dofir kĂ«nne mir et einfach op d'InszenĂ©ierung rullen. Mir fixen Bugs an #c4 an Ă€hnlech ausrollen op d'BĂŒhn. Zur selwechter ZĂ€it ass d'EntwĂ©cklung amgaang develop, wou Ännerungen periodesch geholl ginn release_1.1. Iergendwann krĂ©ie mir eng Verpflichtung kompilĂ©iert an op d'Staging eropgelueden, mat deem mir frou sinn (#c25).

Da fusionéiere mir (mat Fast-Forward) d'Verëffentlechungszweige (release_1.1) am Meeschter. Mir setzen en Tag mat der neier Versioun op dësem Engagement (1.1). Awer dëst Bild ass schonn am Registry gesammelt, also fir et net erëm ze sammelen, addéiere mer einfach en zweeten Tag op dat existent Bild (elo huet et Tags am Registry #c25 О 1.1). Duerno rullen mir et an d'Produktioun aus.

Et gëtt en Nodeel datt nëmmen ee Bild op d'Staging eropgeluede gëtt (#c25), an an der Produktioun ass et anescht (1.1), awer mir wëssen datt "physesch" dëst datselwecht Bild aus der Registry sinn.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

De richtege Nodeel ass datt et keng ËnnerstĂ«tzung fir Fusiounsverpflichtungen ass, Dir musst sĂ©ier viru maachen.

Mir kënne méi wÀit goen an en Trick maachen ... Loosst eis e Beispill vun engem einfachen Dockerfile kucken:

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

Loosst eis e Fichier dovunner bauen no dem folgende Prinzip:

  • SHA256 vun den IdentifizĂ©ierer vun de benotzte Biller (ruby:2.3 Đž nginx:alpine), dĂ©i Kontrollsumme vun hirem Inhalt sinn;
  • all Équipen (RUN, CMD a sou weider.);
  • SHA256 aus Dateien dĂ©i dobĂ€igesat goufen.

... an huelt de Checksum (erĂ«m SHA256) aus esou engem Fichier. DĂ«st ËnnerschrĂ«ft alles wat den Inhalt vum Docker Bild definĂ©iert.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Loosst eis zrĂ©ck op d'Diagramm an amplaz engagĂ©iert wĂ€erte mir esou ËnnerschrĂ«ften benotzen, d.h. Tag Biller mat ËnnerschrĂ«ften.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Elo, wann et nĂ©ideg ass, zum Beispill, Ännerungen vun enger VerĂ«ffentlechung op Meeschter ze fusionĂ©ieren, kĂ«nne mir e richtege Fusiounsverpflichtung maachen: et wĂ€ert en aneren IdentifizĂ©ierer hunn, awer dĂ©iselwecht ËnnerschrĂ«ft. Mat deemselwechten IdentifizĂ©ierer wĂ€erte mir d'Bild op d'Produktioun rullen.

Den Nodeel ass datt et elo net méiglech ass ze bestëmmen wat fir eng Engagement op d'Produktioun gedréckt gouf - d'Checksumme funktionnéieren nëmmen an eng Richtung. Dëse Problem gëtt duerch eng zousÀtzlech Schicht mat Metadaten geléist - ech soen Iech méi spéit méi.

Tagging in werf

Zu werf si mir nach méi wÀit gaang a si preparéiere fir e verdeelt Build mat engem Cache ze maachen deen net op enger Maschinn gespÀichert ass ... Also, mir bauen zwou Zorte vun Docker Biller, mir nennen se Etapp О Bild.

De werf Git Repository spĂ€ichert Bauspezifesch Instruktiounen dĂ©i dĂ©i verschidden Etappe vum Bau beschreiwen (virun InstallĂ©ieren, installĂ©ieren, virum Setup, ageriicht). Mir sammelen dĂ©i Ă©ischt Stuf Bild mat enger ËnnerschrĂ«ft definĂ©iert als Checksum vun den Ă©ischte SchrĂ«tt. Dann addĂ©iere mer de Quellcode, fir dat neit BĂŒhnbild berechene mir seng Kontrollsumme ... DĂ«s Operatioune gi fir all Etappe widderholl, als Resultat vun deem mir e Set vu BĂŒhnebiller krĂ©ien. Da maache mir dat lescht Bild, dat och Metadaten iwwer hiren Hierkonft enthĂ€lt. A mir markĂ©ieren dĂ«st Bild op verschidde ManĂ©ieren (Detailer mĂ©i spĂ©it).

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Ugeholl datt duerno en neien Engagement erschĂ©ngt an deem nĂ«mmen den Uwendungscode geĂ€nnert gouf. Wat wĂ€ert geschĂ©ien? Fir Code Ännerungen gĂ«tt e Patch erstallt an en neit BĂŒhnbild gĂ«tt virbereet. Seng ËnnerschrĂ«ft gĂ«tt als Checksum vum alen BĂŒhnbild an dem neie Patch bestĂ«mmt. En neit lescht Bild gĂ«tt aus dĂ«sem Bild geformt. Ähnlech Verhalen wĂ€ert geschĂ©ien mat Ännerungen an anere Stadien.

Also, BĂŒhnebiller sinn e Cache, dee verdeelt ka gespĂ€ichert ginn, an d'Biller, dĂ©i scho erstallt goufen, ginn an den Docker Registry eropgelueden.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Botzen vum Registry

Mir schwÀtzen net iwwer d'LÀsche vun Schichten déi no gelÀscht Tags hÀnke bliwwen - dëst ass eng Standard Feature vum Docker Registry selwer. Mir schwÀtzen iwwer eng Situatioun wou vill Docker Tags accumuléieren a mir verstinn datt mir e puer vun hinnen net méi brauchen, awer se huelen Plaz op (an/oder mir bezuelen dofir).

Wat sinn d'Botzstrategien?

  1. Dir kënnt just nÀischt maachen net botzen. Heiansdo ass et wierklech méi einfach e bëssen fir extra Plaz ze bezuelen wéi e risege Wirbel vun Tags z'entdecken. Awer dëst funktionnéiert nëmme bis zu engem gewësse Punkt.
  2. Voll reset. Wann Dir all Biller lÀscht an nëmmen déi aktuell am CI System opbaut, kann e Problem entstoen. Wann de Container an der Produktioun nei gestart gëtt, gëtt en neit Bild dofir gelueden - een deen nach net vu jidderengem getest gouf. Dëst killt d'Iddi vun onverÀnnerbarer Infrastruktur ëm.
  3. Blo-gréng. Ee Registry huet ugefaang ze iwwerflësseg - mir lued Biller op eng aner erop. Dee selwechte Problem wéi an der viregter Method: op wéi engem Punkt kënnt Dir de Registry lÀschen, deen ugefaang huet ze iwwerlafen?
  4. No der ZÀit. All Biller méi al wéi 1 Mount lÀschen? Awer et wÀert definitiv e Service ginn deen zënter engem Mount net aktualiséiert gouf ...
  5. Manuell bestëmmen wat scho gelÀscht ka ginn.

Et ginn zwou wierklech liewensfĂ€eg Optiounen: net botzen oder eng Kombinatioun vu blo-grĂ©ng + manuell. Am leschte Fall schwĂ€tze mir iwwer dĂ©i folgend: Wann Dir versteet datt et ZĂ€it ass de Registry ze botzen, erstellt Dir en neit a fĂŒĂŒgt all nei Biller derbĂ€i am Laf vun zum Beispill engem Mount. A no engem Mount, kuckt wĂ©i eng Pods an Kubernetes nach Ă«mmer dĂ©i al Registry benotzen, a transferĂ©iert se och an dĂ©i nei Registry.

Wat sinn mir komm werf? Mir sammelen:

  1. Git Head: all Tags, all Branchen - unzehuelen datt mir alles brauchen wat am Git an de Biller markéiert ass (a wann net, da musse mir et am Git selwer lÀschen);
  2. all Pods déi momentan op Kubernetes gepompelt ginn;
  3. al ReplicaSets (wat viru kuerzem verëffentlecht gouf), a mir plangen och Helm Verëffentlechungen ze scannen a wielt déi lescht Biller do.

... a maacht eng WĂ€isslĂ«scht aus dĂ«sem Set - eng LĂ«scht vu Biller dĂ©i mir net lĂ€schen. Mir botzen alles anescht, duerno fanne mir orphan BĂŒhnbilder a lĂ€schen se och.

Deploy Stage

ZouverlÀsseg Deklarativitéit

Den éischte Punkt deen ech gÀren opmierksam maachen an der Deployment ass d'Rollout vun der aktualiséierter Ressourcekonfiguratioun, deklarativ deklaréiert. D'Original YAML Dokument Kubernetes Ressourcen beschreift ass ëmmer ganz anescht wéi d'Resultat tatsÀchlech am Cluster lafen. Well Kubernetes der Konfiguratioun bÀidréit:

  1. Identifizéierer;
  2. Service Informatiounen;
  3. vill Default WĂ€erter;
  4. Sektioun mat aktuellen Zoustand;
  5. Ännerungen gemaach als Deel vun der EntrĂ©e Webhook;
  6. d'Resultat vun der Aarbecht vu verschiddene Controller (an dem Scheduler).

Dofir, wann eng nei Ressourcekonfiguratioun erschéngt (nei), kënne mir net nëmmen déi aktuell, "live" Konfiguratioun mat him huelen an iwwerschreiwen (liewen). Fir dëst ze maachen, musse mir verglÀichen nei mat der lescht applizéierter Konfiguratioun (lescht applizéiert) a rullt op liewen krut Patch.

Dës Approche gëtt genannt 2-Wee Fusioun. Et gëtt zum Beispill an Helm benotzt.

Et gëtt och 3-Wee Fusioun, déi ënnerscheet sech an deem:

  • verglĂ€ichen lescht applizĂ©iert Đž nei, mir kucken op wat gelĂ€scht gouf;
  • verglĂ€ichen nei Đž liewen, mir kucken wat dobĂ€i oder geĂ€nnert gouf;
  • de summĂ©ierten Patch gĂ«tt ugewannt liewen.

Mir deployéieren 1000+ Uwendungen mat Helm, sou datt mir tatsÀchlech mat 2-Wee Fusioun liewen. Wéi och ëmmer, et huet eng Rei Probleemer déi mir mat eise Patches geléist hunn, déi hëllefen den Helm normal ze schaffen.

Real Rollout Status

Nodeems eise CI System eng nei Konfiguratioun fir Kubernetes generéiert baséiert op dem nÀchsten Event, iwwerdréit et fir ze benotzen (anwenden) zu engem StÀrekoup - benotzt Helm oder kubectl apply. Als nÀchst geschitt déi scho beschriwwe N-Wee Fusioun, op déi d'Kubernetes API approuvéierend op den CI System reagéiert, an dat op sÀi Benotzer.

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Et gĂ«tt awer e grousse Problem: schliisslech erfollegrĂ€ich Applikatioun heescht net erfollegrĂ€ich Rollout. Wann Kubernetes versteet wĂ©i eng Ännerungen applizĂ©iert musse ginn an et applizĂ©iert, wĂ«sse mir nach Ă«mmer net wat d'Resultat wĂ€ert sinn. Zum Beispill, d'AktualisĂ©ierung an d'Restart vun Pods am Frontend kann erfollegrĂ€ich sinn, awer net am Backend, a mir krĂ©ien verschidde Versioune vun de lafende Applikatiounsbiller.

Fir alles richteg ze maachen, erfuerdert dëse Schema en zousÀtzleche Link - e spezielle Tracker, deen Statusinformatioun vun der Kubernetes API kritt an iwwerdroe fir weider Analyse vum realen Zoustand vun de Saachen. Mir hunn eng Open Source Bibliothéik am Go erstallt - cubedog (kuckt seng Ukënnegung hei), déi dëse Problem léist an an werf agebaut ass.

D'Behuele vun dësem Tracker um werf Niveau ass konfiguréiert mat Annotatiounen déi op Deployments oder StatefulSets gesat ginn. Haaptannotatioun - fail-mode - versteet déi folgend Bedeitungen:

  • IgnoreAndContinueDeployProcess — mir ignorĂ©ieren d'Problemer vun der Ausrollung vun dĂ«ser Komponent a fuere weider mat der Deployment;
  • FailWholeDeployProcessImmediately - e Feeler an dĂ«sem Komponent stoppt den Deploymentprozess;
  • HopeUntilEndOfDeployProcess — mir hoffen, datt dĂ«s komponent bis zum enn vun der deployment funktionĂ©iert.

Zum Beispill, dës Kombinatioun vu Ressourcen an AnnotatiounswÀerter fail-mode:

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Wa mir fir d'éischte Kéier ofsetzen, ass d'Datebank (MongoDB) vlÀicht nach net fÀerdeg - Deployments falen. Awer Dir kënnt op de Moment waarden bis et ufÀnkt, an d'Deployment wÀert nach ëmmer stattfannen.

Et ginn zwou weider Annotatiounen fir kubedog zu werf:

  • failures-allowed-per-replica - d'Zuel vun erlaabt Falen fir all Replica;
  • show-logs-until - regulĂ©iert de Moment, bis deen werf (am stdout) Logbicher vun all ausgerullten Pods weist. De Standard ass PodIsReady (fir Messagen ze ignorĂ©ieren dĂ©i mir wahrscheinlech net wĂ«llen wann de Traffic ufĂ€nkt op de Pod ze kommen), awer WĂ€erter sinn och valabel: ControllerIsReady Đž EndOfDeploy.

Wat soss wëlle mir vum Asaz?

ZousÀtzlech zu deenen zwee schonn beschriwwenen Punkte wëlle mir:

  • ze gesinn Logbicher - an nĂ«mmen dĂ©i nĂ©ideg, an net alles an enger Zeil;
  • Streck FortschrĂ«tt, well wann d'Aarbecht e puer Minutten "roueg" hĂ€nkt, ass et wichteg ze verstoen wat do geschitt;
  • hunn automatesch RĂ©ckroll am Fall wou eppes falsch gaang ass (an dofir ass et kritesch de richtege Status vun der Deployment ze kennen). D'Rollout muss atomesch sinn: entweder geet et bis zum Enn, oder alles geet zrĂ©ck an sĂ€i frĂ©iere Staat.

Resultater

Fir eis als Firma, all beschriwwen Nuancen a verschiddene Liwwerstadien ëmzesetzen (bauen, publizéieren, ofsetzen), CI System an Utility sinn genuch werf.

Amplaz vun enger Conclusioun:

werf - eisen Tool fir CI / CD zu Kubernetes (Iwwerbléck a Videobericht)

Mat der Hëllef vu werf hu mir gutt Fortschrëtter gemaach fir eng grouss Zuel vu Probleemer fir DevOps Ingenieuren ze léisen a wiere frou wann déi breet Gemeinschaft op d'mannst dëst Utility an Aktioun probéiert. Et wÀert méi einfach sinn e gutt Resultat zesummen ze erreechen.

Videoen a Rutschen

Video vun der Leeschtung (~ 47 Minutten):

Spillt Video

Presentatioun vum Rapport:

PS

Aner Berichter iwwer Kubernetes op eisem Blog:

Source: will.com

Setzt e Commentaire