werf 1.1 vÀljaanne: tÀna tÀiustused ehitajale ja tulevikuplaanid

werf 1.1 vÀljaanne: tÀna tÀiustused ehitajale ja tulevikuplaanid

werf — meie avatud lĂ€htekoodiga GitOps CLI-utility rakenduste koostamiseks ja tarnimiseks Kubernetesesse. Nagu lubatud, vĂ€ljaanne versioon v1.0 tĂ€histas uute vĂ”imaluste lisamise ja harjumuspĂ€raste lĂ€henemiste ĂŒlevaatamise algust werfis. NĂŒĂŒd oleme rÔÔmsad esitleda vĂ€ljaannet v1.1, mis on suur samm edasi ja alus tulevikuks koostaja werf. Versioon on praegu saadaval kanalis 1.1 ea.

VĂ€ljaande alus on uus etappide salvestuse arhitektuur ja kahe koostaja (Stapel ja Dockerfile) töö optimeerimine. Uus salvestuse arhitektuur avab vĂ”imalused hajutatud koostamiseks mitmelt hostilt ja paralleelseks koostamiseks ĂŒhel hostil.

Töö optimeerimine hĂ”lmab liialdavate arvutuste kĂ”rvaldamist etappide allkirjade arvutamise etapis ja failide kontrollsummade arvutamismehhanismide muutmist efektiivsemateks. See optimeerimine vĂ€hendab keskmist projekti koostamise aega werfiga. Ja tĂŒhjad koostamised, kui kĂ”ik etapid eksisteerivad vahemĂ€lus stages-storage, on nĂŒĂŒd tĂ”eliselt kiired. Enamikel juhtudel toimub koostamise uuesti kĂ€ivitamine kiiremini kui 1 sekund! See kehtib ka etappide kinnitamisprotseduuride kohta meeskondade töötamise kĂ€igus werf deploy ja werf run.

Lisaks on selles vĂ€ljaandes ilmunud kujundusstrateegia piltide mĂ€rgistamiseks sisu pĂ”hjal — sisu pĂ”hine mĂ€rgistamine, mis on nĂŒĂŒd vaikimisi lubatud ja ainus soovitatav.

Vaatame lÀhemalt werfi v1.1 pÔhimuudatusi ja rÀÀgime ka tulevikuplaanidest.

Mis on werf v1.1-s muutunud?

Uus etappide nimede formaat ja etappide valimise algoritm vahemÀlust

Uus etappide nime genereerimise reegel. NĂŒĂŒdsest genereerib iga etapi koostamine unikaalse etapi nime, mis koosneb kahest osast: allkiri (nagu v1.0-s) pluss unikaalne ajasild.

NÀiteks, tÀielik etapi pildi nimi vÔib vÀlja nÀha nii:

werf-stages-storage/myproject:d2c5ad3d2c9fcd9e57b50edd9cb26c32d156165eb355318cebc3412b-1582656767835


 vĂ”i ĂŒldises vormis:

werf-stages-storage/PROJECT:SIGNATURE-TIMESTAMP_MILLISEC

Siin:

  • SIGNATURE — see on etapi allkiri, mis esindab etapi sisu identifikaatorit ja sĂ”ltub Git-i muudatuste ajaloost, mis viis sellise sisuni;
  • TIMESTAMP_MILLISEC — see on garanteeritult ainulaadne pildi identifikaator, mis genereeritakse uue pildi koostmise hetkel.

Etappide valimise algoritm vahemÀlust pÔhineb Git-i commitide suguluse kontrollimisel:

  1. Werf arvutab mingi etapi allkirja.
  2. Uues stages-storage Sama allkirjaga vÔib olla mitu etappi. Werf valib kÔik allkirjale vastavad etapid.
  3. Kui praegune etapp on seotud Gitiga (git-archive, kasutaja etapp Git-patchide jaoks: install, beforeSetup, setup; vÔi git-latest-patch), valib werf ainult need etapid, mis on seotud commit'iga, mis on praeguse commit'i eelkÀija (mille jaoks kutsuti esile koostamine).
  4. JĂ€relejÀÀnud sobivate etappide hulgast valitakse ĂŒks – kĂ”ige vanem loomise kuupĂ€eva jĂ€rgi.

Erinevates Git-oksades vÔib samal etapp olla sama allkirjaga. Kuid werf takistab erinevate okste vahel koodi vahetamist, isegi kui allkirjad kattuvad.

→ Dokumentatsioon.

Uus etappide loomise ja salvestamise algoritm etappide salves

Kui werf ei leia vahemÀlust sobivat etappi, algatatakse uue etapi koostamisprotsess.

MĂ€rkusena, et mitu protsessi (ĂŒhel vĂ”i mitmel serveril) vĂ”ivad alustada sama etapi koostamist umbes samal ajal. Werf kasutab optimistliku lukustamise algoritmi stages-storage vĂ€rskelt loodud pildi salvestamise hetkel stages-storage. Seega, kui uue etapi koostamine on valmis, lukustab werf stages-storage ja salvestab sinna vĂ€rskelt loodud pildi ainult juhul, kui seal ei eksisteeri juba sobivat pilti (allkirja ja muude parameetrite kohaselt – vt uut algoritmi etappide valimiseks vahemĂ€lust).

VÀrskelt loodud pildil on garanteeritud ainulaadne ID TIMESTAMP_MILLISEC (vt uut etappide nimede formaat). Kui stages-storage leidub sobiv pilt, loob werf vÀrskelt loodud pildi kÔrvale ja kasutab vahemÀlus olevat pilti.

TeisisĂ”nu: esimene protsess, mis lĂ”petab pildi koostamise (kĂ”ige kiirem), saab Ă”iguse salvestada selle stages-storage'isse (ja just seda ainukest pilti kasutatakse kĂ”igi koostamiste jaoks). Aeglane koostamisprotsess ei takista kunagi kiiremat protsessi praeguse etapi koostamise tulemuste salvestamisel ja jĂ€rgmise etapi koostamisele ĂŒleminekul.

→ Dokumentatsioon.

Dockerfile'i koosturi jÔudlust on parandatud

Praegu koosneb Dockerfile'ist genereeritava pildi etapi rida ĂŒhest etapist – dockerfile. Allkirja arvutamisel arvestatakse failide hajutuse summat. context, mis kasutatakse kogumisel. Selle tĂ€iustamise eel saavutab werf rekurssiivselt kĂ”ikidel failidel kontrollsummad, vĂ”ttes arvesse konteksti ja iga faili moodulit. Alates versioonist v1.1 saab werf kasutada arvutatud kontrollsummasid, mis on talletatud Git-repositooriumis.

Algoritmi aluseks on git ls-tree. Algoritm arvestab kirjeid .dockerignore ja lĂ€bib rekurssiivselt failipuid ainult vajadusel. Nii oleme vabastanud end failisĂŒsteemi lugemise sĂ”ltuvusest ja algoritmi sĂ”ltuvus context ei ole oluline.

Samuti kontrollib algoritm jÀlgimata faile ja arvestab neid vajadusel kontrollsummas.

Parandatud on jÔudlust, kui faile importitakse

Werf v1.1 versioonides kasutatakse rsync-serverit failide importimisel artefaktidest ja piltidest. Varem viidi import lĂ€bi kahes etapis, kasutades host-sĂŒsteemi kausta montaaĆŸi.

Importsed jÔudlust macOS-is ei piira enam Docker volumes, import toimub sama ajaga nagu Linuxis ja Windowsis.

Sisu pÔhine mÀrgistamine

Werf v1.1 toetab nn pildisisese sisu mĂ€rgistamist — sisu pĂ”hine mĂ€rgistamine. Tulemuseks oleva Docker-pildi mĂ€rgid sĂ”ltuvad nende piltide sisust.

KĂ€ivitades kĂ€su werf publish --tags-by-stages-signature vĂ”i werf ci-env --tagging-strategy=stages-signature mĂ€rgistatakse avaldatud pildid nii nimetatud staadiumi allkirjaga pildi jaoks. Iga pilt saab omaenda selle pildi staadiumi allkirja, mis arvutatakse samade reeglite jĂ€rgi kui iga eraldi staadiumi regulaarne allkiri, kuid on pildi ĂŒldine identifikaator.

Pildi staadiumi allkiri sÔltub:

  1. selle pildi sisust;
  2. Git’is toimunud muudatuste ajaloost, mis viis sellise sisuni.

Git-repositooriumis on alati tĂŒhjad kommitsioonid, mis ei muuda pildi failide sisu. NĂ€iteks ainult kommentaaridega kommitsioonid vĂ”i sulandumise kommitsioonid, vĂ”i kommitsioonid, mis muudavad Git’is faile, mis ei impordita pildisse.

Sisu pĂ”hise mĂ€rgistamise kasutamisel lahendatakse probleeme liigsete pod'i taaskĂ€ivitustega Kubernetes'is pildi nime muutuste tĂ”ttu, isegi kui pildi sisu ei ole muutunud. Üldiselt on see ĂŒks pĂ”hjusi, miks on keeruline hoida mitmeid mikroteenuseid ĂŒhes rakenduses ĂŒhes Git-repositooriumis.

Samuti on content-based tagging usaldusvÀÀrsem meetod sildistamiseks kui Git-haarude sildistamine, kuna loodud piltide sisu ei sĂ”ltu pipeline'ide tĂ€itmise jĂ€rjekorrast CI-sĂŒsteemis, et koguda mitmeid sama haru commit'e.

Oluline: alates kĂ€esolevast hetkest stages-signature — see on ainus soovitatav sildistamisstrateegia. See hakkab vaikimisi kasutama meeskonnas werf ci-env (kui ei ole selgelt mÀÀratud teist sildistamisskeemi).

→ Dokumentatsioon. Sellele funktsioonile pĂŒhendatakse ka eraldi artikkel. UUENDATUD (3. aprill): Artikkel ĂŒksikasjadega avalikustatud.

Logimise tasemed

Kasutajal on vÔimalus kontrollida vÀljundit, mÀÀrata logimise taset ja töötada silumisinfoga. Lisatud valikud --log-quiet, --log-verbose, --log-debug.

Vaikimisi sisaldab vÀljund minimaalset teavet:

werf 1.1 vÀljaanne: tÀna tÀiustused ehitajale ja tulevikuplaanid

Kasutades pÔhjalikku vÀljundit (--log-verbose) saab jÀlgida, kuidas werf töötab:

werf 1.1 vÀljaanne: tÀna tÀiustused ehitajale ja tulevikuplaanid

TÀpne vÀljund (--log-debug), lisaks werf'i silumisinfotele, sisaldab ka kasutatavate raamatukogude logisid. NÀiteks saab nÀha, kuidas toimub suhtlemine Docker Registry'ga, ning fikseerida kohad, kus kulub oluline kogus aega:

werf 1.1 vÀljaanne: tÀna tÀiustused ehitajale ja tulevikuplaanid

Edasised plaanid

TÀhelepanu! Allpool kirjeldatud funktsioonid, mis on mÀrgitud v1.1 on juba selle versiooni jooksul saadaval, paljusid neist - peagi. Uuendused tulevad automaatsete tÀiendustega kasutades multiwerf. Need funktsioonid ei mÔjuta v1.1 stabiilsete funktsioonide osa, nende ilmumine ei nÔua kasutajalt kÀsitsi sekkumist juba olemasolevatesse konfiguratsioonidesse.

TĂ€ielik toetus erinevatele Docker Registry rakendustele (UUED)

  • Versioon: v1.1
  • Ajad: mĂ€rts
  • Probleem

EesmÀrk - kasutaja peaks saama kasutada suvalist rakendust piiranguteta, kasutades werf'i.

Praegu oleme vÀlja selgitanud jÀrgmise lahenduste komplekti, mille jaoks plaanime tÀielikku toetust tagada:

  • Default (library/registry)*,
  • AWS ECR,
  • Azure*,
  • Docker Hub,
  • GCR*,
  • GitHub Packages,
  • GitLab Registry*,
  • Harbor*,
  • Quay.

TĂ€rniga mĂ€rgitud lahendused, mis on hetkel juba tĂ€ielikult werf'i poolt toetatud. ÜlejÀÀnute puhul on toetus olemas, kuid piirangutega.

Saab eristada kahte peamist probleemi:

  • MĂ”ned lahendused ei toeta siltide kustutamist Docker Registry API kaudu, mis ei luba kasutajatel kasutada werf'is rakendatud automaatset puhastamist. See kehtib AWS ECR, Docker Hub ja GitHub Packages kohta.
  • MĂ”ned lahendused ei toeta nii öeldud nested repositories (Docker Hub, GitHub Packages ja Quay) vĂ”i toetavad, kuid kasutaja peab need kĂ€sitsi looma, kasutades UI-d vĂ”i API-d (AWS ECR).

Nende ja teiste probleemide lahendamiseks kavatseme kasutada lahenduste natiivseid API-sid. See ĂŒlesanne hĂ”lmab ka testide katvuse loomist werfi kogu töötsĂŒkli jaoks igaĂŒhe jaoks.

Jaotatud piltide kogu (↑)

  • Versioon: v1.2 v1.1 (selle vĂ”imaluse rakendamise prioriteet on suurenenud)
  • Ajavahemikud: mĂ€rts-aprill mĂ€rts
  • Probleem

Hetkel saab werfi v1.0 ja v1.1 kasutada vaid ĂŒhel eraldatud serveril, et teostada pilte kogumist ja avaldamist ning rakenduse juurutamist Kubernetesesse.

Et avada werfi jaotatud töövÔimalused, kui rakenduste kogumine ja juurutamine Kuberneteses algatatakse mitmetel suvalistel serveritel ning need serverid ei hoia oma seisundit kogumiste vahel (ajalised runnerid), on werfilt vajalik rakendada Docker Registry kasutamise vÔimalust etappide salvestamiseks.

Varem, kui projekt werf veel dapp-ina tuntud oli, oli sellel selline vÔimalus. Siiski seisime silmitsi mitmete probleemidega, mida on vaja arvesse vÔtta selle funktsiooni rakendamisel werfis.

MĂ€rkus. See vĂ”imalus ei eelda kogujate töötamist Kuberneteses pod’ides, kuna selleks on vajalik loobuda kohalikest Docker-serveri sĂ”ltuvustest (Kuberneteses pod’is ei ole juurdepÀÀsu kohalikule Docker-serverile, kuna protsess ise töötab konteineris ja werf ei toeta ega hakka toetama Docker-serveriga vĂ”rgust töötamist). Kuberneteses töötamise tugi rakendatakse eraldi.

Ametlik tugi GitHub Actions (UUS)

  • Versioon: v1.1
  • Ajad: mĂ€rts
  • Probleem

Selle hulka kuulub werf dokumentatsioon (peatĂŒkid reference ja guide), samuti ametlik GitHub Action, et töötada werfiga.

Lisaks vÔimaldab see werfi tööle minna efemÀÀrsetel runneritel.

Kasutaja suhtlemismehhanism CI-sĂŒsteemiga pĂ”hineb labelite mÀÀramisel pull-requestidele, et algatada teatud tegevusi rakenduse kogumisel/vĂ€lja toomisel.

Kohalik arendus ja rakenduste juurutamine werfiga (↓)

  • Versioon: v1.1
  • Ajavahemikud: jaanuar-veebruar aprill
  • Probleem

Peamine eesmĂ€rk on saavutada ĂŒhtne ĂŒhtne konfigureerimine rakenduste juurutamiseks nii kohalikult kui ka tootmises, ilma keerukate toiminguteta, „karbist vĂ€lja“.

werf nĂ”uab ka tööreĆŸiimi, kus on mugav rakenduse koodi redigeerida ja koheselt saada tagasisidet töötavast rakendusest veaotsimiseks.

Uus puhastamise algoritm (UUS)

  • Versioon: v1.1
  • TĂ€htajad: aprill
  • Probleem

Aktuaalses versioonis werf v1.1 on protsessis cleanup ei ole ette nĂ€htud kuvandeid puhastamiseks sisu pĂ”hjal (content-based tagging) — need pildid kogunevad.

Samuti kasutatakse aktuaalses versioonis werf (v1.0 ja v1.1) erinevaid puhastusstrateegiaid piltide jaoks, mis on avaldatud tÀhistamisstrateegiate alusel: Git-haru, Git-silt vÔi Git-commit.

On vĂ€lja töötatud uus ĂŒhtne kĂ”igile tĂ€histamisstrateegiatele mĂ”eldud piltide puhastusalgoritm, mis pĂ”hineb Git'i commitide ajaloos:

  • Hoida mitte rohkem kui N1 pilti, mis on seotud N2 viimase commitiga iga git HEAD (haru ja sildid) jaoks.
  • Hoida mitte rohkem kui N1 staatus ettepanekut, mis on seotud N2 viimase commitiga iga git HEAD (haru ja sildid) jaoks.
  • Hoida kĂ”ik pildid, mida kasutatakse mis tahes Kubernetes klastrite ressursside konfiguratsioonis (skannitakse kĂ”iki kube-kontekste konfiguratsioonifailist ja nimekohtadest; seda kĂ€itumist saab piirata eriliste valikute abil).
  • Hoida kĂ”ik pildid, mida kasutatakse ressursside konfiguratsioonide manifestides, mis on salvestatud Helm'i vĂ€ljalaskes.
  • Pilt vĂ”ib olla eemaldatud, kui see ei ole seotud ĂŒhegi git HEAD'iga (nt kuna vastav HEAD on eemaldatud) ja ei ole kasutusel ĂŒheski manifestis Kubernetes klastris ja Helm'i vĂ€ljalaskes.

Paralleelne piltide kogumine (↓)

  • Versioon: v1.1
  • TĂ€htajad: jaanuar-veebruar aprill*

Aktuaalne versioon werf kogub pilte ja artefakte, nagu on kirjeldatud werf.yaml, jÀrjestikku. On vajalik jagada sÔltumatute piltide ja artefaktide kogumise protsess ning tagada mugav ja informatiivne vÀljund.

* MĂ€rkus: tĂ€htaeg on nihkunud distribuudi kogumise kĂ”rgema prioriteedi tĂ”ttu, mis lisab rohkem horisontaalse skaleeritavuse vĂ”imalusi, samuti kasutades werf'i GitHub Actions'iga. Paralleelne kogumine on jĂ€rgmine optimeerimise etapp, tasandades vertikaalselt ĂŒhe projekti kogumist.

Üleminek Helm 3-le (↓)

  • Versioon: v1.2
  • TĂ€htajad: veebruar-mĂ€rts mai*

Sisaldab ĂŒleminekut uuele koodibaasile Helm 3 ja tĂ”estatud, mugav migratsiooniviis olemasolevate installatsioonide jaoks.

* MĂ€rkus: ĂŒleminek Helm 3-le ei lisa werf-ile olulisi vĂ”imalusi, kuna kĂ”ik Helm 3 pĂ”hifunktsioonid (3-way-merge ja tilleri puudumine) on juba werf-is rakendatud. Veelgi enam, werf-l on lisafunktsioonid lisaks nimetatutele. Siiski jÀÀb see ĂŒleminek meie plaanidesse ja see teostatakse.

Jsonnet Kubernetes'i konfiguratsiooni kirjeldamiseks (↓)

  • Versioon: v1.2
  • Ajakava: jaanuar-veebruar aprill-mai

Werf toetab Kubernetes'i konfiguratsiooni kirjeldamist Jsonnet formaadis. Samuti jÀÀb werf Helmiga ĂŒhilduvaks ja on vĂ”imalus valida kirjeldusformaati.

PÔhjuseks on asjaolu, et Go keele mallid, paljude arvates, on neil kÔrge sisenemisbarjÀÀr ning nende mallide koodi arusaadavus on samuti probleemne.

Samuti kaalutakse vĂ”imalust vĂ”tta kasutusele teiseid Kubernetes'i konfiguratsiooni kirjeldamise sĂŒsteeme (nĂ€iteks Kustomize).

Töö Kubernetes'is (↓)

  • Versioon: v1.2
  • Ajakava: aprill-mai mai-juuni

EesmÀrk: tagada piltide koostamine ja rakenduse kohaletoimetamine runnerite abil Kubernetes'is. St. uute piltide koostamine, nende avaldamine, puhastamine ja juurutamine vÔib toimuda otse Kubernetes'i pod'idest.

Selle vÔimaluse teostamiseks on kÔigepealt vajalik jaotatud piltide koostamise vÔimalus (vt eelpool).

Samuti on vajalik toetada koostaja tööreĆŸiimi ilma Docker-serverita (st Kaniko-sarnane koostamine vĂ”i koostamine userspace'is).

Werf toetab Kubernetes'is piltide koostamist mitte ainult Dockerfile'i kaudu, vaid ka oma koostajaga Stapel, koos inkrementaalsete ĂŒmberkoostamiste ja Ansible'iga.

Samm avatud arendamise suunas

Me armastame oma kogukonda (GitHub, Telegram) ja soovime, et ĂŒha rohkem inimesi aitaks werf'i paremaks teha, mĂ”istaks, millises suunas me liigume, ning osaleks arenduses.

Hiljuti otsustati minna ĂŒle GitHubi projektide tahvlitele et avada meie meeskonna tööprotsess. NĂŒĂŒd saab vaadata lĂ€hituleviku plaane, samuti kĂ€imasolevaid töid jĂ€rgmistes suundades:

On tehtud suur töö issue'idega:

  • Ebavajalikud on eemaldatud.
  • Olemasolevad on viidud ĂŒhtsesse vormingusse, piisavas koguses detaile ja pĂ”hjalikkust.
  • Uued issues on lisatud ideede ja ettepanekutega.

Kuidas lubada versioon v1.1

Versioon on praegu saadaval kanalis 1.1 ea (kanalites stable ja rock-solid vÀljaanded ilmuvad stabiliseerimise kÀigus, kuid ea ise on juba piisavalt stabiilne kasutamiseks, kuna see on lÀbinud kanalid alpha ja beta). Aktiveeritakse multiwerf kaudu jÀrgmistel viisidel:

source $(multiwerf use 1.1 ea)
werf COMMAND ...

KokkuvÔte

Uus ladustamise etappide arhitektuur ja ehituse optimeerimine Stapeli ja Dockerfile ehitajate jaoks avavad vÔimalusi jaotatud ja paralleelsete ehituste teostamiseks werf'is. Need vÔimalused saavad peagi olema kergelt kÀttesaadavad versioonis v1.1 ja saadaval automaatselt uuendamise mehhanismi kaudu (kasutajatele multiwerf).

Selles versioonis lisati piltide sisu pĂ”hine ettepanekute strateegia — sisu pĂ”hine mĂ€rgistamine, — mis on nĂŒĂŒd vaikimisi strateegia. Samuti on ĂŒmber kujundatud peamiste kĂ€skude logi: werf build, werf publish, werf deploy, werf dismiss, werf cleanup.

JĂ€rgmine oluline samm on jaotatud ehituste lisamine. Alates v1.0'st on jaotatud ehitused olnud prioriteediks rohkem kui paralleelsed ehitused, sest need toovad werf'ile rohkem vÀÀrtust: ehitajate vertikaalne skaleerimine ja ajutiste ehitajate toetamine erinevates CI/CD sĂŒsteemides, samuti vĂ”imalus ametlikuks toeks GitHub Actions'ile. SeetĂ”ttu on paralleelsete ehituste teostamise tĂ€htaegu edasi lĂŒkatud. Töötame siiski selle nimel, et viia ellu mĂ”lemad vĂ”imalused pigem varakult.

JĂ€lgige uudiseid! Ja Ă€rge unustage kĂŒlastada meid GitHub, et luua issue, leida juba olemasolev ja panna pluss, luua PR vĂ”i lihtsalt jĂ€lgida projekti arengut.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster