
NjĂ« e gjysmĂ« vjetĂ« mĂ« parĂ«, mĂ« 5 mars 2018, kompania Google publikoi versionin e parĂ« alfa tĂ« projektit tĂ« saj Open Source pĂ«r CI/CD tĂ« quajtur , me qĂ«llimin pĂ«r tĂ« krijuar njĂ« "zhvillim tĂ« lehtĂ« dhe tĂ« riprodhueshĂ«m nĂ«n Kubernetes", nĂ« mĂ«nyrĂ« qĂ« zhvilluesit tĂ« mund tĂ« pĂ«rqendrohen nĂ« zhvillim dhe jo nĂ« administrim. ĂfarĂ« e bĂ«n Skaffold interesante? Siç doli, ai ka disa as nĂ« mĂ«ngĂ«, duke e bĂ«rĂ« atĂ« njĂ« mjet tĂ« fortĂ« pĂ«r zhvilluesin, dhe ndoshta edhe pĂ«r inxhinierin e operacioneve. Le tĂ« njihemi me projektin dhe mundĂ«sitĂ« e tij.
NB: Për fat të mirë, ne përmendëm shkurtimisht Skaffold në , jetët e të cilëve janë të lidhura me Kubernetes.
Teoria. Qëllimi dhe mundësitë
Pra ndaj, nĂ«se flasim nĂ« pĂ«rgjithĂ«si, Skaffold zgjidh problemin e automatizimit tĂ« ciklit CI/CD (nĂ« fazat build, push, deploy), duke ofruar reagim tĂ« shpejtĂ« pĂ«r zhvilluesin, domethĂ«nĂ« mundĂ«sinĂ« pĂ«r tĂ« marrĂ« shpejt rezultatin e ndryshimeve tĂ« fundit nĂ« kod â nĂ« formĂ«n e njĂ« aplikacioni tĂ« pĂ«rditĂ«suar, qĂ« funksionon nĂ« klasterin Kubernetes. Ajo mund tĂ« funksionojĂ« nĂ« ambiente tĂ« ndryshme (dev, stage, productionâŠ), pĂ«r tĂ« cilat Skaffold ndihmon nĂ« pĂ«rshkrimin e pipeline-ve pĂ«r publikimin.
Kodi burimor i Skaffold është shkruar në gjuhën Go, nën kushte të licencës së lirë Apache License 2.0 (GitHub).
Të shqyrtojmë funksionet dhe veçoritë kryesore. Midis tyre, mund të përmendim këto:
- Skaffold ofron mjete për krijimin e pipeline-ve CI/CD.
- Lejon të ndjekë në sfond ndryshimet në kodin burimor dhe të aktivizojë procesin automatizues të ndërtimit të kodit në imazhe kontejnerësh, publikimin e këtyre imazheve në Docker Registry dhe vendosjen e tyre në klasterin Kubernetes.
- Sinkronizon skedarët në repositor me katalogun e punës në kontejner.
- Automatikisht teston duke përdorur container-structure-test.
- Ruan portet.
- Lexon log-et e aplikacionit, që funksionon në kontejner.
- Ndihmon në debugin e aplikacioneve të shkruara në Java, Node.js, Python, Go.
Tani â mbi veçoritĂ«:
- Skaffold nuk ka komponente anësore në klaster. Pra, nuk është e nevojshme të konfiguroni Kubernetes për të përdorur këtë utilitare.
- Pipa tĂ« ndryshme pĂ«r aplikacionin tuaj. Duhet tĂ« lĂ«shoni kodin nĂ« Minikube lokal, ndĂ«rsa jeni nĂ« zhvillim, dhe mĂ« pas â nĂ« stage ose production? PĂ«r kĂ«tĂ« janĂ« parashikuar dhe konfigurime tĂ« pĂ«rdoruesve, variabla ambienti dhe flamuj, qĂ« lejojnĂ« pĂ«rshkrimin e pipa tĂ« ndryshme pĂ«r njĂ« aplikacion.
- CLI. Vetëm utilitare konsolash dhe konfigurime në YAML. Në rrjet mund të gjeni përmendje të përpjekjeve për të krijuar , megjithatë, për momentin kjo më tepër tregon se dikujt i nevojitet, por jo shumë.
- Modulariteti. Skaffold nuk është një kombajn autonom, por synon të përdorë modulet të veçanta ose zgjidhje ekzistuese për detyra të caktuara.
Illustrimi i fundit:
- Në fazën e ndërtimit mund të përdorni:
- docker build lokal, në klaster me kaniko ose në Google Cloud Build;
- Bazel lokal;
- Jib Maven dhe Jib Gradle lokal ose në Google Cloud Build;
- skripte ndĂ«rtimi tĂ« personalizuara, tĂ« ekzekutuara lokal. NĂ«se ju nevojitet tĂ« ekzekutoni njĂ« zgjidhje tjetĂ«r (mĂ« fleksibĂ«l/tĂ« njohur/âŠ) pĂ«r ndĂ«rtim, ajo pĂ«rshkruhet nĂ« skript, nĂ« mĂ«nyrĂ« qĂ« Skaffold tĂ« ekzekutojĂ« pikĂ«risht atĂ« (). Kjo lejon pĂ«rdorimin e çdo ndĂ«rtuesi qĂ« mund tĂ« thirret pĂ«rmes skriptit;
- Në fazën e testimit, mbështetet tashmë e përmendura ;
- Për deploy parashikohen:
- Kubectl;
- Helm;
- kustomize.
Për këtë arsye, Skaffold mund të quhet një lloj framework për ndërtimin CI/CD. Ja një shembull i njëworkflow gjatë përdorimit të tij (nga dokumentacioni i projektit):

Si duket në mënyrë të përgjithshme puna e Skaffold?
- Utilita monitoron ndryshimet nĂ« drejtorinĂ« e kodit burimor. NĂ«se modifikohen skedarĂ«t, ato sinkronizohen me pod-in e aplikacionit nĂ« klusterin Kubernetes. NĂ«se Ă«shtĂ« e mundur â pa e rindĂ«rtuar imazhin. NĂ« rastin tjetĂ«r â ndĂ«rtohet njĂ« imazh i ri.
- Imazhi i ndërtuar kontrollohet me container-structure-test, etiketzohet dhe dërgohet në Docker Registry.
- Pas kĂ«saj, imazhi Ă«shtĂ« deployed â dislokuar nĂ« klusterin Kubernetes.
- Nëse ekzekutimi është inicializuar me komandën
skaffold dev, atëherë fillojmë të marrim log-et nga aplikacioni, dhe Skaffold pret ndryshime për të rikthyer të gjitha veprimet nga e para.

Ilustrimi i fazave kryesore të punës së Skaffold
Praktika. Provojmë Skaffold
PĂ«r tĂ« demonstruar pĂ«rdorimin e Skaffold, do tĂ« marr njĂ« shembull nga . PĂ«r fat tĂ« mirĂ«, mund tĂ« gjeni edhe shumĂ« shembuj tĂ« tjerĂ«, tĂ« cilat marrin parasysh specifika tĂ« ndryshme. TĂ« gjitha veprimet do tâi kryej lokalisht nĂ« Minikube. Instalimi Ă«shtĂ« i thjeshtĂ« dhe do tĂ« marrĂ« disa minuta, dhe pĂ«r tĂ« filluar punĂ«n do tĂ« nevojitet kubectl.
Le të instalojmë Skaffold:
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1Do ta klonojmë repo-n e Skaffold me shembujt e nevojshëm:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesKam zgjedhur njĂ« shembull me dy pod-e, secili prej tĂ« cilĂ«ve pĂ«rmban njĂ« aplikacion tĂ« vogĂ«l nĂ« Go. NjĂ« aplikacion Ă«shtĂ« fronti (leeroy-web), qĂ« redakton kĂ«rkesat pĂ«r nĂ« aplikacionin e dytĂ« â prapaskenĂ« (leeroy-app). Le tĂ« shohim si duket:
~/skaffold/examples/microservices # tree
.
âââ leeroy-app
â âââ app.go
â âââ Dockerfile
â âââ kubernetes
â âââ deployment.yaml
âââ leeroy-web
â âââ Dockerfile
â âââ kubernetes
â â âââ deployment.yaml
â âââ web.go
âââ README.adoc
âââ skaffold.yaml
4 directories, 8 filesleeroy-app dhe leeroy-web përmbajnë kod në Go dhe Dockerfile të thjeshtë për ndërtimin lokal të këtij kodi:
~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app . Nuk do tĂ« sjell kodin e aplikacioneve â mjafton tĂ« dini se leeroy-web pranon kĂ«rkesa dhe i proxyn ato nĂ« leeroy-app. Prandaj, nĂ« skedaret Deployment.yaml ekziston njĂ« ShĂ«rbim vetĂ«m pĂ«r app (pĂ«r ruterin e brendshĂ«m). Porta e pod-it web ne do ta kalojmĂ« vetes pĂ«r qasje tĂ« shpejtĂ« nĂ« aplikacion.
Si duket skaffold.yaml:
~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
artifacts:
- image: leeroy-web
context: ./leeroy-web/
- image: leeroy-app
context: ./leeroy-app/
deploy:
kubectl:
manifests:
- ./leeroy-web/kubernetes/*
- ./leeroy-app/kubernetes/*
portForward:
- resourceType: deployment
resourceName: leeroy-web
port: 8080
localPort: 9000 KĂ«tu pĂ«rshkruhen tĂ« gjitha fazat e pĂ«rmendura mĂ« sipĂ«r. PĂ«rveç kĂ«tij konfigurimi Ă«shtĂ« edhe njĂ« skedar me cilĂ«sime globale â ~/.skaffold/config. Mund tĂ« redaktohet manualisht ose pĂ«rmes CLI â pĂ«r shembull, kĂ«shtu:
skaffold config set --global local-cluster true Ky komandĂ« do tĂ« vendosĂ« njĂ« variabĂ«l globale local-cluster nĂ« vlerĂ« e vĂ«rtetĂ«, pas sĂ« cilĂ«s Skaffold nuk do tĂ« pĂ«rpiqet tĂ« âpushâ imazhet nĂ« njĂ« regjistĂ«r tĂ« largĂ«t. NĂ«se po zhvilloni lokal, mund tĂ« pĂ«rdorni kĂ«tĂ« komandĂ« pĂ«r tĂ« ruajtur imazhet gjithashtu lokal.
TĂ« kthehemi te skaffold.yaml:
- Në etapën
ndĂ«rtone tregojmĂ« se imazhi duhet tĂ« ndĂ«rtohet dhe ruhet lokal. Pas herĂ«s sĂ« parĂ« qĂ« do tĂ« fillojĂ« ndĂ«rtimi, do tĂ« shohim si vijon:// Ń.Đș. Minikube ŃĐŸĐ·ĐŽĐ°Đ”Ń ĐșлаŃŃĐ”Ń ĐČ ĐŸŃЎДлŃĐœĐŸĐč ĐČĐžŃŃŃалŃĐœĐŸĐč ĐŒĐ°ŃĐžĐœĐ”, // ĐżŃОЎДŃŃŃ ĐżŃĐŸĐœĐžĐșĐœŃŃŃ ĐČĐœŃŃŃŃ, ŃŃĐŸĐ±Ń ĐœĐ°ĐčŃĐž ĐŸĐ±ŃĐ°Đ·Ń # minikube ssh $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MBSiç mund tĂ« shihet, Skaffold automatikisht ka etiketuar imazhet. PĂ«rndryshe, mbĂ«shteten disa politika etiketimi.
- Më tej në konfigurim është e specifikuar
context: ./leeroy-app/, dmth. është caktuar konteksti në të cilin ndërtohet imazhi. - Në fazën e deploy-it përcaktohet se do të përdorim kubectl dhe maskën për manifestet e nevojshme.
-
PortForward: nĂ« mĂ«nyrĂ« tĂ« ngjashme me atĂ« si zakonisht ne kalojmĂ« portet me anĂ« tĂ«kubectl port-forward, i japim udhĂ«zime Skaffold pĂ«r tĂ« thirrur kĂ«tĂ« komandĂ«. NĂ« kĂ«tĂ« rast â porta lokale 9000 kalon nĂ« 8080 nĂ« Deployment me emrinleeroy-web.
ĂshtĂ« koha tĂ« fillojmĂ« skaffold dev: ekipi do tĂ« krijojĂ« njĂ« «cikĂ«l mbrapsht» vazhdues, dmth jo vetĂ«m se do tĂ« mbledhĂ« gjithçka dhe do ta deplojojĂ« nĂ« klaster, por gjithashtu do tĂ« raportojĂ« pĂ«r gjendjen e pod-Ă«ve nĂ« atĂ« moment, do tĂ« monitorojĂ« ndryshimet dhe do tĂ« pĂ«rditĂ«sojĂ« gjendjen e pod-Ă«ve.
Ja rezultati i ekzekutimit skaffold dev --port-forward gjatë rbuild-it të dytë:

SĂ« pari, duket se po pĂ«rdoret cache. MĂ« pas â aplikacioni ndĂ«rtohet, deplohet, portet kalohen. Duke qenĂ« se Ă«shtĂ« specifikuar --port-forward, Skaffold kaloi portin deri web, siç u kĂ«rkua, ndĂ«rsa app e kaloi sipas dĂ«shirĂ«s sĂ« tij (zgjodhi portin mĂ« tĂ« afĂ«rt tĂ« lirĂ«). Pas kĂ«saj, marrim log-et e para nga aplikacionet.
A do ta kontrollojmë funksionalitetin?
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!! ModifikojmĂ« skedarin leeroy-app/app.go â kalojnĂ« disa sekonda⊠dhe:
~/skaffold/examples/microservices # kubectl get po
NAME READY STATUS RESTARTS AGE
leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s
leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!! Megjithatë, Skaffold nxori në konsol të njëjtin informacion si më parë, përveç një detaji: ai e nxori vetëm leeroy-app, dhe jo të gjitha menjëherë.
Më shumë praktikë
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« pĂ«rmendim se kur krijoni njĂ« projekt tĂ« ri, konfigurimet pĂ«r Skaffold mund tĂ« âbootstrapâ-ohen pĂ«rmes komandĂ«s procesi, qĂ« Ă«shtĂ« shumĂ« e pĂ«rshtatshme. Po ashtu, Ă«shtĂ« e mundur tĂ« shkruani disa konfigurime: tĂ« zhvilloni mbi konfigurimin standard, dhe mĂ« pas ta publikoni nĂ« stage me komandĂ«n run (i njĂ«jti proces si dhe dev, vetĂ«m se nuk bie nĂ«n vĂ«zhgim ndryshimet), duke pĂ«rdorur njĂ« konfigurim tjetĂ«r.
Në katacoda ka një shembull edhe më të thjeshtë. Atje ofrohet një tërësi e gatshme me Kubernetes, një aplikacion dhe Skaffold. Një opsion i shkëlqyer, nëse ju intereson të provoni vetë themelore.
Një nga mundësitë e mundshme të përdorimit të Skaffold është zhvillimi në një klashtër të largët. Nuk është komod për të gjithë që të startojnë Minikube në harduerin e vet, pas së cilës publikojnë aplikacionin dhe presin që ai të funksionojë siç duhet⊠Në këtë rast, Skaffold zgjidh shkëlqyer problemin, çfarë mund të konfirmojnë, për shembull, inxhinierët e Reddit, për të cilin ne tashmë në blogun tonë.
Dhe në nga Weaveworks mund të gjeni një shembull të krijimit të një pipeline për production.
Përfundimi
Skaffold â njĂ« mjet i pĂ«rshtatshĂ«m pĂ«r ndĂ«rtimin e pipeline-Ă«ve qĂ« pĂ«rfshijnĂ« lançimin e aplikacioneve nĂ« Kubernetes dhe qĂ« janĂ« kryesisht tĂ« orientuara drejt nevojave tĂ« zhvillimit. Me tĂ«, Ă«shtĂ« mjaft e lehtĂ« tĂ« krijosh njĂ« pipeline "tĂ« shkurtĂ«r", qĂ« merr parasysh nevojat kryesore tĂ« zhvilluesit, por nĂ«se dĂ«shirohet, mund tĂ« organizohen edhe procese mĂ« tĂ« mĂ«dha. NjĂ« nga shembujt e dukshĂ«m tĂ« pĂ«rdorimit tĂ« Skaffold nĂ« proceset CI/CD tĂ« tillĂ« i pĂ«rbĂ«rĂ« nga 10 mikroshĂ«rbime, qĂ« pĂ«rdorin mundĂ«sitĂ« e Kubernetes, gRPC, Istio dhe OpenCensus Tracing.
Skaffold ka marrĂ« tashmĂ« pothuajse 8000+ yje nĂ« GitHub, zhvillohet nga Google dhe Ă«shtĂ« pjesĂ« e â nĂ« pĂ«rgjithĂ«si, pĂ«r momentin ka tĂ« gjithĂ« arsyet pĂ«r tĂ« besuar se projekti do tĂ« vazhdojĂ« tĂ« zhvillohet pĂ«r njĂ« kohĂ« tĂ« gjatĂ« dhe me sukses.
P.S.
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «»;
- «».
Burimi: habr.com
