
â nuestra herramienta CLI de GitOps de cĂłdigo abierto para la construcciĂłn y entrega de aplicaciones en Kubernetes. En se introdujo una nueva funcionalidad en el constructor de imĂĄgenes: etiquetado de imĂĄgenes por contenido o content-based tagging. Hasta ahora, el esquema tĂpico de etiquetado en werf implicaba etiquetar imĂĄgenes de Docker segĂșn la etiqueta de Git, la rama de Git o el commit de Git. Pero todos estos esquemas tienen desventajas que se resuelven completamente con la nueva estrategia de etiquetado. Detalles sobre ella y por quĂ© es tan buena se presentan a continuaciĂłn.
Despliegue de un conjunto de microservicios desde un Ășnico repositorio de Git
A menudo se da la situaciĂłn en la que una aplicaciĂłn estĂĄ dividida en mĂșltiples servicios mĂĄs o menos independientes. Las versiones de estos servicios pueden ocurrir de forma independiente: se puede lanzar una o varias versiones a la vez, mientras que los demĂĄs deben seguir funcionando sin cambios. Sin embargo, desde el punto de vista del almacenamiento de cĂłdigo y la gestiĂłn del proyecto, resulta mĂĄs conveniente mantener tales servicios de la aplicaciĂłn en un Ășnico repositorio.
Hay situaciones en las que los servicios son realmente independientes y no estån relacionados con una sola aplicación. En ese caso, estarån ubicados en proyectos separados y su lanzamiento se realizarå a través de diferentes procesos de CI/CD en cada uno de los proyectos.
Sin embargo, en la prĂĄctica, los desarrolladores a menudo descomponen una Ășnica aplicaciĂłn en varios microservicios, pero crear un repositorio y proyecto separados para cada uno... es un exceso evidente. De esto es de lo que se tratarĂĄ a continuaciĂłn: varios de estos microservicios residen en un Ășnico repositorio de proyecto y los lanzamientos se realizan a travĂ©s de un Ășnico proceso en CI/CD.
Etiquetado por rama de Git y etiqueta de Git
Supongamos que se utiliza la estrategia de etiquetado mĂĄs comĂșn â tag-or-branch. Para las ramas de Git, las imĂĄgenes se etiquetan con el nombre de la rama, para una Ășnica rama en un momento dado existe solo una imagen publicada con el nombre de esa rama. Para las etiquetas de Git, las imĂĄgenes se etiquetan con el nombre de la etiqueta correspondiente.
Al crear una nueva etiqueta de Git â por ejemplo, al lanzar una nueva versiĂłn â para todas las imĂĄgenes del proyecto en Docker Registry se crearĂĄ una nueva etiqueta de Docker:
-
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
Estos nuevos nombres de imagen llegan a la configuración de Kubernetes a través de plantillas de Helm. Al ejecutar el despliegue con el comando werf deploy se actualiza el campo image en los manifiestos de recursos de Kubernetes y se reinician los recursos correspondientes debido al cambio en el nombre de la imagen.
Problemi: en el caso de que realmente no se haya cambiado el contenido de la imagen desde el despliegue anterior (etiqueta de Git), sino solo su etiqueta de Docker, ocurre un reinicio extra de esta aplicaciĂłn y, por lo tanto, puede haber un cierto tiempo de inactividad. Aunque no hubo razones reales para realizar este reinicio.
Si pĂ«rfundim, me skemĂ«n aktuale tĂ« etiketimit Ă«shtĂ« e nevojshme tĂ« krijohen disa depove tĂ« ndara Git, dhe ndodhet problemi i organizimit tĂ« lansimit tĂ« kĂ«tyre depove tĂ« shumta. NĂ« pĂ«rgjithĂ«si, njĂ« skemĂ« e tillĂ« rezulton e mbushur dhe e komplikuar. ĂshtĂ« mĂ« mirĂ« tĂ« bashkohen shumĂ« shĂ«rbime nĂ« njĂ« depo tĂ« vetme dhe tĂ« krijohen etiketa Docker nĂ« mĂ«nyrĂ« qĂ« tĂ« mos ketĂ« rinisje tĂ« panevojshme.
Etiketimi sipas Git-commit
Në werf gjithashtu ekziston një strategji etiketimi e lidhur me Git-commit.
Git-commit është identifikuesi i përmbajtjes së depozitës Git dhe varet nga historia e ndryshimeve të skedave në depozitën Git, prandaj duket logjik të përdoret për etiketimin e imazheve në Docker Registry.
Megjithatë, etiketimi sipas Git-commit ka të njëjtat disavantazhe si ai sipas degëve Git ose etiketave Git:
- Mund të jetë krijuar një kommit bosh, i cili nuk ndryshon skedarët, dhe Docker-etiketimi i imazhit do të ndryshohet.
- Mund të jetë krijuar një kommit bashkues, i cili nuk ndryshon skedarët, dhe Docker-etiketimi i imazhit do të ndryshohet.
- Mund të jetë krijuar një kommit, i cili ndryshon ato skedarë në Git, që nuk importohen në imazh, dhe Docker-etiketimi i imazhit do të ndryshohet përsëri.
Etiketimi sipas emrit të degës Git nuk reflekton versionin e imazhit
Ka edhe një problem tjetër që lidhet me strategjinë e etiketimit sipas degëve Git.
Etiketimi sipas emrit të degës funksionon derisa kommitet e kësaj dege të mblidhen me radhë në rend kronologjik.
Nëse në skemën aktuale përdoruesi nis një rivendosje të një kommiti të vjetër, të lidhur me një degë të caktuar, atëherë werf do të mbivendosë imazhin sipas Docker-etiketimit me versionin e ri të ndërtuar për kommitin e vjetër. Depojat që përdorin këtë etikë nga atë moment rrezikojnë që gjatë rinisjes së pod'ave të bëjnë pull një version tjetër të imazhit, si rezultat i së cilës aplikacioni ynë humb lidhjen me sistemin CI, duke u shkëputur.
Për më tepër, gjatë protrudimeve radhës në një degë me një distancë të vogël kohe mes tyre, kommiti i vjetër mund të ndërtohet më vonë se ai më i ri: versioni i vjetër i imazhit do të mbivendosë versionin e ri sipas etiketës Git. Këto probleme mund të zgjidhen nga sistemi CI/CD (p.sh., në GitLab CI për një seri kommitesh fillon pipeline i fundit). Megjithatë, kjo nuk mbështetet nga të gjithë sistemet dhe duhet të ketë një mënyrë më të besueshme për të parandaluar një problem kaq themelor.
ĂfarĂ« Ă«shtĂ« etiketimi i bazuar nĂ« pĂ«rmbajtje?
Pra, çfarĂ« Ă«shtĂ« etiketimi i bazuar nĂ« pĂ«rmbajtje â etiketimi i imazheve sipas pĂ«rmbajtjes.
PĂ«r tĂ« krijuar Docker-etiketa, nuk pĂ«rdoren primitivĂ«t e Git-it (Git-dega, Git-etiketaâŠ), por njĂ« kontroll i shumĂ«sisĂ« i lidhur me:
- përmbajtjen e imazhit. Identifikuesi-etiketë i imazhit reflekton përmbajtjen e tij. Gjatë ndërtimit të një versioni të ri ky identifikues nuk do të ndryshojë, nëse në imazh nuk janë ndryshuar skedarët;
- historinë e krijimit të këtij imazhi në Git. Imazhet që lidhen me degë të ndryshme Git dhe histori të ndryshme ndërtimi përmes werf, do të kenë etiketa-identifikues të ndryshme.
Një etiketë identifikimi e tillë është e njohur si firma e fazave të imazhit.
Ădo imazh pĂ«rbĂ«het nga njĂ« grup fazash: from, before-install, git-archive, install, imports-after-install, before-setup,⊠git-latest-patch etj. Ădo fazĂ« ka njĂ« identifikues qĂ« reflekton pĂ«rmbajtjen e saj, â firma e fazĂ«s (stage signature).
Imazhi pĂ«rfundimtar, i pĂ«rbĂ«rĂ« nga kĂ«to faza, etiketohet me firmĂ«n e ashtuquajtur tĂ« grupit tĂ« kĂ«tyre fazave â stages signature, â e cila Ă«shtĂ« njĂ« pĂ«rmbledhje pĂ«r tĂ« gjitha fazat e imazhit.
Ădo imazh nga konfigurimi werf.yaml nĂ« rregull do tĂ« ketĂ« njĂ« tĂ« tillĂ« firmĂ« dhe, pĂ«r pasojĂ«, njĂ« etiketĂ« Docker.
Firma e fazave zgjidh të gjitha problemet e përmendura:
- ĂshtĂ« e qĂ«ndrueshme ndaj komiteteve tĂ« zbrazĂ«ta Git.
- ĂshtĂ« e qĂ«ndrueshme ndaj komiteteve Git qĂ« ndryshojnĂ« skedarĂ«t, qĂ« nuk janĂ« relevancĂ« pĂ«r imazhin.
- Nuk shkakton një problem me mbivendosjen e versionit aktual të imazhit kur rinisni ndërtimet për komitetet e vjetra Git të degës.
Tani kjo është strategjia e rekomanduar për etiketimin dhe përdoret si parazgjedhje në werf për të gjitha sistemet CI.
Si të aktivizoni dhe përdorni në werf
Opsioni përkatës u shfaq në komandën werf publish: --tag-by-stages-signature=true|false
Në sistemin CI, strategjia e etiketimit përcaktohet nga komanda werf ci-env. Më parë, për të është përcaktuar parametri werf ci-env --tagging-strategy=tag-or-branch. Tani, nëse e specifikoni werf ci-env --tagging-strategy=stages-signature apo nuk e specifikoni këtë opsion, werf do të përdorë si parazgjedhje strategjinë e etiketimit stages-signature. Komanda werf ci-env do të vendosë automatikisht flag-at e nevojshëm për komandën werf build-and-publish (ose werf publish), prandaj nuk është e nevojshme të jepni opsione shtesë për këto komanda.
Për shembull, komanda:
werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature⊠mund të krijojë imazhe të mëposhtme:
-
registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d -
registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6
KĂ«tu 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d â Ă«shtĂ« firma e fazave tĂ« imazhit backend, dhe f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 â firma e fazave tĂ« imazhit frontend.
Duke përdorur funksione speciale werf_container_image dhe werf_container_env në shabllonat Helm nuk ka nevojë të ndryshoni asgjë: këto funksione do të krijojnë automatikisht emrat e saktë të imazheve.
Shembulli i konfigurimit në sistemin CI:
type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deployMë shumë informacion në lidhje me konfigurimin është i disponueshëm në dokumentacion:
- ;
- ;
- .
Në përfundim
- Mundësi e re
werf publish --tag-by-stages-signature=true|false. - Vlera e re e opsionit
werf ci-env --tagging-strategy=stages-signature|tag-or-branch(nëse nuk e spesifikoni, atëherë parazgjedhja do të jetëstages-signature). - Nëse deri tani ishin përdorur opsione etiketimi sipas komiteteve Git (
WERF_TAG_GIT_COMMITapo opsioniwerf publish --tag-git-commit COMMIT), atëherë është e domosdoshme të kaloni në strategjinë e etiketimit stages-signature. - Projektet e reja është mirë t'i kaloni menjëherë në skemën e re të etiketimit.
- Projektet e vjetra, kur kaloni në werf 1.1, është e dëshirueshme t'i kaloni në skemën e re të etiketimit, por e vjetra tag-or-branch ndihmohet akoma.
Etiketime e bazuar në përmbajtje zgjidh të gjitha problemet e përmendura në artikull:
- Qëndrueshmëria e emrit të tag-ëve Docker ndaj komiteteve bosh të Git.
- Qëndrueshmëria e emrit të tag-ëve Docker ndaj komiteteve të Git që ndryshojnë skedarët e parëndësishëm për imazhin.
- Nuk shkakton një problem me mbingarkimin e versionit aktual të imazhit kur rilansohet ndërtimi për komitetet e vjetra të Git për degët e Git.
Përdorni! Dhe mos harroni të na vizitoni në , për të krijuar një issue ose për të gjetur një të ekzistueshëm, për të vendosur një plus, për të krijuar një PR ose thjesht për të ndjekur zhvillimin e projektit.
P.S.
Lexoni gjithashtu në blogun tonë:
- «»
- «»
- «»;
- Cikli i shënimeve mbi risitë në werf:
- «»;
- «»;
- «»;
- «».
Burimi: habr.com
