Sisu pÔhine mÀrgistamine werf kogujas: miks ja kuidas see töötab?

Sisu pÔhine mÀrgistamine werf kogujas: miks ja kuidas see töötab?

werf — meie GitOps CLI tööriist, millel on avatud kood, et ehitada ja tarnida rakendusi Kubernetesesse. V vĂ€ljalaskes v1.1 tutvustati uut funktsiooni piltide koostamisel: piltide mĂ€rgistamine sisu vĂ”i sisu pĂ”hine mĂ€rgistamine. Varasemalt eeldas tĂŒĂŒpiline mĂ€rgistamisplaan werf'is, et Docker-pilte mĂ€rgistatakse Git'i sildi, Git'i haru vĂ”i Git'i commit'e jĂ€rgi. Kuid kĂ”igil neil skeemidel on puudused, mille lahendab tĂ€ielikult uus mĂ€rgistamisstrateegia. Üksikasjad sellest ja miks see on nii hea — allpool.

Mikroteenuste komplekti vĂ€ljatöötamine ĂŒhest Git-repositoriumist

Sageli esineb olukord, kus rakendus on jagatud mitmeks enam-vĂ€hem iseseiliseks teenuseks. Nende teenuste vĂ€ljalaskmine vĂ”ib toimuda iseseisvalt: korraga vĂ”ib vĂ€lja lasta ĂŒhe vĂ”i mitu teenust, samal ajal kui teised peavad jĂ€tkama tööd ilma muudatusteta. Kuid koodi salvestamise ja projekti juhtimise seisukohalt on mugavam hoida selliseid rakenduse teenuseid ĂŒhes repos.

On olukordi, kus teenused on tĂ”eliselt iseseisvad ja ei ole seotud ĂŒhe rakendusega. Sel juhul asuvad need eraldi projektides ning nende vĂ€ljaandmine toimub iga projekti kaudu eraldi CI/CD protsesside kaudu.

Kuid tegelikkuses jagavad arendajad sageli ĂŒhte rakendust mitmeks mikroteenuseks, kuid igaĂŒhe jaoks eraldi hoidla ja projekti loomine
 on ilmselge ĂŒleliialdus. Just sellest olukorrast juttu tuleb: mitu sellist mikroteenust asub ĂŒhes projektis ja vĂ€ljaanded toimuvad lĂ€bi ĂŒhtse CI/CD protsessi.

Tegimine Git haru ja Git sildiga

Oletame, et kasutatakse kĂ”ige levinumat sildistamisstrateegiat — tag-or-branch. Git harude puhul sildistatakse pildid haru nimega, ĂŒhe haru kohta eksisteerib hetkel ainult ĂŒks avaldatud pilt selle haru nimega. Git siltide puhul sildistatakse pildid vastavalt sildi nimega.

Uue Git-sildi loomisel — nĂ€iteks uue versiooni vĂ€ljalaskmisel — luuakse kĂ”igi projekti piltide jaoks Docker Registry's uus Docker-silt:

  • myregistry.org/myproject/frontend:v1.1.10
  • myregistry.org/myproject/myservice1:v1.1.10
  • myregistry.org/myproject/myservice2:v1.1.10
  • myregistry.org/myproject/myservice3:v1.1.10
  • myregistry.org/myproject/myservice4:v1.1.10
  • myregistry.org/myproject/myservice5:v1.1.10
  • myregistry.org/myproject/database:v1.1.10

Need uurde uued pildid sekod Helem malli kaudu Kubernetes'i konfiguratsiooni. KÀivitamisel deployment'i kÀsuga werf deploy uuendatakse pilt Kubernetes'i ressursimainetes ja vastavate ressursside taaskÀivitamine seoses pildi nime muutumisega.

Probleem: juhul, kui eelmisest vÀljalaskmisest (Git-silt) ei muutu pildi sisu, vaid ainult selle Docker-silt, toimub liigne taaskÀivitamine ning vastavalt on vÔimalik mÔningane lihtne. Kuigi pole olnud reaalseid pÔhjuseid selle taaskÀivitamise tegemiseks.

SeetĂ”ttu, praeguse silti-mÀÀramise skeemi korral tuleb kasutada mitut eraldi Git-repositooriumi ja tekib mitme repositooriumi vĂ€ljalaskmise korraldamise probleem. Üldiselt on selline skeem ĂŒlekoormatud ja keeruline. Parim on ĂŒhendada mitmed teenused ĂŒhte repositooriumisse ja teha selliseid Docker-silte, et vĂ€ltida liigseid taaskĂ€ivitamisi.

Siltimine Git-kommi kaudu

Werf'is on samuti silti-mÀÀramise strateegia, mis on seotud Git-kommidega.

Git commit on Git-repo sisu identifikaator ja sÔltub Git-reposi failide muudatuste ajaloost, seega tundub loogiline kasutada seda Docker Registry piltide mÀrgistamiseks.

Kuid Git commit'il pÔhinev mÀrgistamine omab samu puudusi kui Git harude vÔi Git tÀhiste puhul:

  • VĂ”ib olla loodud tĂŒhi commit, mis ei muuda faile, ja Docker-pildi silt muutub.
  • VĂ”ib olla loodud merge commit, mis ei muuda faile, ja Docker-pildi silt muutub.
  • VĂ”ib olla loodud commit, mis muudab Git'is faile, mis ei impordita pildile, ja Docker-pildi silt muutub jĂ€lle.

Harunime pÔhinev mÀrgistamine ei kajasta pildi versiooni.

On veel ĂŒks probleem, mis on seotud harunime pĂ”hise mĂ€rgistamisstrateegiaga.

Harunime pÔhine mÀrgistamine töötab seni, kuni selle haru commit'id kogutakse jÀrjestikku kronoloogilises jÀrjekorras.

Kui kasutaja kĂ€ivitab vanade commit'de ĂŒmberkomplekteerimise antud harus, siis werf asendab pildi vastava Docker'i sildiga uue versiooniga vanast commit'ist. Edasi kasutavad selle silti Deployment'id riskivad, et pod'ide taaskĂ€ivitamisel tĂ”mmatakse teine pildi versioon, mille tĂ”ttu meie rakendus kaotab ĂŒhenduse CI-sĂŒsteemiga ja satub desĂŒnkroonsusse.

Lisaks, kui ĂŒhte haru surutakse jĂ€rjestikku lĂŒhikese ajavahega, vĂ”ib vana commit tulla vĂ€lja hiljem kui uuem: vana pildi versioon asendab uue Git-haru sildi jĂ€rgi. Selliseid probleeme vĂ”ib lahendada CI/CD-sĂŒsteem (nĂ€iteks GitLab CI puhul kĂ€ivitub viimasest commit'st pipeline). Kuid mitte kĂ”ik sĂŒsteemid ei toeta seda ning peab olema usaldusvÀÀrsem viis selliste pĂ”hiprobleemide vĂ€ltimiseks.

Mis on sisupÔhine sildistamine?

Nii et mis on sisupĂ”hine sildistamine — piltide sildistamine sisu alusel.

Docker'i siltide loomiseks ei kasutata Git'i primitiive (Git-haru, Git-silt
), vaid kontrollsummat, mis on seotud:

  • pildi sisuga. Pildi identifikaatori silt kajastab selle sisu. Uue versiooni koostamisel ei muutu see identifikaator, kui pildis ei ole faile muudetud;
  • selle pildi loomise ajalooga Git. Erinevatest Git-haarudest ja erineva koostamise ajalooga seotud pildid werf'i kaudu saavad erinevad sildid-identifikaatorid.

Sellise identifikaatori silt on nii kutsutud staadiumi allkiri.

Iga pilt koosneb staadiumide kogumist: from, before-install, git-archive, install, imports-after-install, before-setup,
 git-latest-patch jne. Igal staadiumil on identifikaator, mis kajastab selle sisu, — staadiumi allkiri (stage signature).

LĂ”plik pilt, mis koosneb nendest staadiumidest, sildistatakse nii nimetatud staadiumite kogumi allkirjaga — stages signature, — mis on ĂŒldistav kĂ”igi pildi staadiumide jaoks.

Igal pildil, mis on saadud konfiguratsioonist werf.yaml , on tavaliselt oma selline allkiri ja seega ka Docker-silt.

Staadiumi allkiri lahendab kÔik eespool nimetatud probleemid:

  • On vastupidav tĂŒhjade Git-commit'ide suhtes.
  • On vastupidav Git-commit'ide suhtes, mis muudavad faile, mis ei ole pildile asjakohased.
  • Ei pĂ”hjusta probleemi hetke pildi versiooni kattumisega vanade Git-kommiteede harude kogumite taaskĂ€ivitamisel.

See on nĂŒĂŒd soovitatav sildistamise strateegia ja seda kasutatakse vaikimisi werf'is kĂ”ikides CI-sĂŒsteemides.

Kuidas werf'is sisse lĂŒlitada ja kasutada

Seotud valik ilmnes kÀsule werf publish: --tag-by-stages-signature=true|false

CI-sĂŒsteemis mÀÀratakse sildistamise strateegia kĂ€suga werf ci-env. Varasemalt mÀÀrati selle jaoks parameeter werf ci-env --tagging-strategy=tag-or-branch. NĂŒĂŒd, kui mÀÀrata werf ci-env --tagging-strategy=stages-signature vĂ”i seda valikut mitte mÀÀrata, kasutab werf vaikimisi sildistamise strateegiat stages-signature. KĂ€sk werf ci-env seadistab automaatselt vajalikud lipud kĂ€sule werf build-and-publish (vĂ”i werf publish), seega ei ole nende kĂ€skude jaoks vaja tĂ€iendavaid valikuid mÀÀrata.

NÀiteks kÀsk:

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature


 vÔib luua jÀrgmised pildid:

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

Siit 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d — on pildi etappide allkiri tagaosa, ja f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 — pildi etappide allkiri eesmine.

Kasutades spetsiaalseid funktsioone werf_container_image ja werf_container_env Helmi mallides ei ole muudatusi vajalikke: need funktsioonid genereerivad automaatselt Ôiged pildinimed.

Konfiguratsiooni nĂ€ide CI-sĂŒsteemis:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

Rohkem teavet seadistamise kohta on saadaval dokumentatsioonis:

Kokku

  • Uus valik werf publish --tag-by-stages-signature=true|false.
  • Uue valiku vÀÀrtus werf ci-env --tagging-strategy=stages-signature|tag-or-branch (kui ei ole mÀÀratud, siis vaikimisi on stages-signature).
  • Kui enne oli kasutusel Git-commitide pĂ”hine sildistamine (WERF_TAG_GIT_COMMIT vĂ”i valik werf publish --tag-git-commit COMMIT), siis tuleb kindlasti vahetada sildistamistrateegiale stages-signature.
  • Uued projektid on parem kohe uuele sildistamisskeemile ĂŒle viia.
  • Vanad projektid tasub werf 1.1 kasutusele vĂ”ttes ĂŒle viia uuele sildistamisskeemile, kuid vana tag-or-branch on endiselt toetatud.

Sisu pÔhine sildistamine lahendab kÔik artiklis kÀsitletud probleemid:

  • Docker-tagi nime vastupidavus tĂŒhi Git-commitide suhtes.
  • Docker-tagi nimi pĂŒsivus Git-commit'ide suhtes, mis muudavad konteineriga mitte seotud faile.
  • Ei pĂ”hjusta probleeme olemasoleva konteineri versiooni ĂŒle kirjutamisega vanemate Git-commit'ide vĂ”i Git-harude ehituste kordamisel.

Kasutage julgelt! Ja Àrge unustage meie juurde vaadata GitHub, et luua probleem vÔi leida juba olemasolev, anda plusspoole, esitada PR vÔi lihtsalt jÀlgida projekti arengut.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster