
Para njĂ« vit e gjysmĂ«, mĂ« 5 mars 2018, kompania Google publikoi versionin e parĂ« alfa tĂ« projektit tĂ« saj Open Source pĂ«r CI/CD tĂ« quajtur , e cila kishte si qĂ«llim krijimin e njĂ« zhvillimi "tĂ« thjeshtĂ« dhe tĂ« riprodhueshĂ«m nĂ«n Kubernetes", nĂ« mĂ«nyrĂ« qĂ« zhvilluesit tĂ« pĂ«rqendrohen nĂ« zhvillim, e jo nĂ« administrim. ĂfarĂ« e bĂ«n Skaffold interesant? Siç duket, ai ka disa aspekte tĂ« favorshme nĂ« tĂ« cilat mund tĂ« bĂ«het njĂ« mjet i fortĂ« pĂ«r zhvilluesin, madje dhe pĂ«r inxhinierin e operacioneve. Le tĂ« njihemi me projektin dhe mundĂ«sitĂ« e tij.
NB: Për rastin, ne kemi folur shkurtimisht për Skaffold në , jetët e të cilëve lidhen me Kubernetes.
Teoria. Qëllimi dhe mundësitë
Pra, nëse flasim përgjithësisht, Skaffold zgjidh problemin e automatizimit të ciklit CI/CD (në fazat e build, push, deploy), duke ofruar zhvilluesit reagim të shpejtë, dmth. mundësinë për të marrë shpejt rezultate të ndryshimeve të kodit - në formën e aplikacioneve të përditësuara, që funksionojnë në klasterin Kubernetes. Po ashtu, ai mund të funksionojë në konture të ndryshme (dev, stage, production...), për të cilat Skaffold ndihmon në përshkrimin e pipelines për publikim.
Kodi burimor i Skaffold është shkruar në gjuhën Go, në kushtet e licencës së lirë Apache License 2.0 (GitHub).
Le të shqyrtojmë funksionet dhe karakteristikat kryesore. Të parat përfshijnë:
- Skaffold ofron mjete për krijimin e pipelines CI/CD.
- Lejon që në sfond të monitorojë ndryshimet në kodin burimor dhe të nisin 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ë repozitor me katalogun punues në kontejner.
- Automatikisht teston me ndihmën e container-structure-test.
- Rreth portet.
- Lexon log-et e aplikacionit të nisur në kontejner.
- Ndihmon në depurimin e aplikacioneve të shkruara në Java, Node.js, Python, Go.
Tani - për karakteristikat:
- Skaffold nuk ka komponente në anën e klasterit. Pra, nuk është e nevojshme të konfiguroni për më shumë Kubernetes për të përdorur këtë utilitet.
- Different pipelines për aplikacionin tuaj. Duhet të publikoni kodin në Minikube lokal, ndërsa jeni duke zhvilluar, dhe më pas - në stage ose production? Për këtë janë parashikuar dhe konfigurimet e përdoruesve, variablat e mjedisit dhe flamujt, që lejojnë përshkrimin e pipeline-ve të ndryshme për një aplikacion të vetëm.
- CLI. Vetëm utilitar konsolë dhe konfigurime në YAML. Në internet mund të gjeni përmendje të përpjekjeve për të krijuar , megjithatë, aktualisht kjo do të thotë se dikush e ka nevojë për atë, por jo shumë.
- Modulariteti. Skaffold nuk është një kombinator i pavarur, por synon të përdorë module të veçanta ose zgjidhje ekzistuese për detyra specifike.
Ilustrimi i fundit:
- Në fazën e ndërtimit mund të përdoren:
- 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Ă« cilat ekzekutohen lokal. NĂ«se ju nevojitet tĂ« ekzekutoni njĂ« zgjidhje tjetĂ«r (mĂ« fleksibĂ«l / tĂ« njohur / âŠ) pĂ«r ndĂ«rtim, ajo pĂ«rshkruhet nĂ« skriptin qĂ« Skaffold e ekzekuton atĂ« (). Kjo lejon pĂ«rdorimin e çdo ndĂ«rtuesi qĂ« mund tĂ« thirret me anĂ« tĂ« skriptit;
- Në fazën e testimit përkrahët testi i përmendur më parë ;
- Për deploy janë parashikuar:
- Kubectl;
- Helm;
- kustomize.
Falë kësaj, Skaffold mund të quhet një lloj kornizë për ndërtimin e CI / CD. Ja një shembull i një procesi të punës gjatë përdorimit të tij (nga dokumentacioni i projektit):

Si duken në përgjithësi veprimet e Skaffold?
- Utilitarja monitoron ndryshimet nĂ« direktorinĂ« e kodit burimor. NĂ«se ndodhin modifikime nĂ« skedarĂ«, ato sinkronizohen me pod-in e aplikacionit nĂ« klasterin Kubernetes. NĂ«se Ă«shtĂ« e mundur â pa ndĂ«rtuar njĂ« imazh tĂ« ri. NĂ« tĂ« kundĂ«rt, njĂ« imazh i ri ndalohet.
- Imagini i ndërtuar kontrollohet me container-structure-test, etiketizohet dhe dërgohet në Docker Registry.
- Pas kĂ«saj, imazhi niset â zbatohet nĂ« klasterin Kubernetes.
- Nëse nisja është iniciuar me komandën
skaffold dev, atëherë fillojmë të marrim log-et nga aplikacioni, ndërsa Skaffold pret ndryshime për të përsëritur të gjitha veprimet nga fillimi.

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 më tepër, mund të gjeni edhe shumë shembuj të tjerë, duke marrë parasysh specifikën e ndryshme. Të gjitha veprimet do t'i kryej lokal në Minikube. Instalimi është i thjeshtë dhe do të zgjasë disa minuta, dhe për të filluar 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 të klonojmë repositorin e Skaffold-së me shembujt e nevojshëm:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesKam zgjedhur një shembull me dy podë, secili prej të cilëve përmban një aplikacion të vogël në Go. Një aplikacion është frontend (leeroy-web), që redirekton kërkesat në aplikacionin tjetër - backend (leeroy-app). Le të shohim se si duket kjo:
~/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ë kodin në Go dhe Dockerfile të thjeshta për mbledhjen lokale 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 - është e mjaftueshme të dinë se leeroy-web pranon kërkesa dhe i proksionon ato në leeroy-app. Prandaj, në skedarët Deployment.yaml ekziston një Shërbim vetëm për app (për rutimin e brendshëm). Porta e pod-it web do ta kalojmë 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ësaj konfig , ka edhe një skedar me cilësime globale - ~/ .skaffold/config. Mund ta redaktoni 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ën true, pas së cilës Skaffold nuk do të përpiqet të 'dërgojë' imazhet në një regjistër të largët. Nëse jeni duke zhvilluar lokal, mund të përdorni këtë komandë për të ruajtur imazhet gjithashtu lokal.
Le të kthehemi te skaffold.yaml:
- Në fazën
buildne tregojmĂ« se tĂ« ndĂ«rtojmĂ« dhe ruajmĂ« imazhin duhet tĂ« jetĂ« lokal. Pas herĂ«s sĂ« parĂ« qĂ« do tĂ« fillojĂ« ndĂ«rtimi, do tĂ« shohim ndodhi tĂ« mĂ«poshtme:// Ń.Đș. 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 duket, Skaffold ka etiketuar imazhet vetĂ«. PĂ«r mĂ« tepĂ«r, mbĂ«shteten disa politika etiketimi.
- Më pas, në konfigurim është e specifikuar
context: .\/leeroy-app\/, pra është caktuar konteksti në të cilin ndërtohet imazhi. - Në fazën e shpërndarjes, përcaktohet se do të përdorim kubectl dhe masën për manifestet e nevojshme.
-
PortForward: nĂ« mĂ«nyrĂ« tĂ« ngjashme me atĂ« siç zakonisht kalojmĂ« portet pĂ«rmeskubectl 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Ă« Deploymentin me emrinleeroy-web.
ĂshtĂ« koha tĂ« fillojmĂ« skaffold dev: komanda do tĂ« krijojĂ« njĂ« "cikĂ«l tĂ« vazhdueshĂ«m feedback-u", pra jo vetĂ«m qĂ« do tĂ« ndĂ«rtojĂ« gjithçka dhe do ta shpĂ«rndajĂ« nĂ« klaster, por gjithashtu do tĂ« raportojĂ« pĂ«r gjendjen e podĂ«ve nĂ« kĂ«tĂ« moment, do tĂ« monitorojĂ« ndryshimet dhe do tĂ« azhurnojĂ« gjendjen e podĂ«ve.
Këtu është rezultati i lançimit skaffold dev --port-forward në ndërtim të përsëritur:

Së pari, duket qartë se po përdoret memoria cache. Më pas, aplikacioni ndërtohet, shpërndahet, portet kalohen. Duke qenë se është e specifikuar --port-forward, Skaffold kaloi portin siç ia kërkuam, dhe ja webai e kaloi sipas dëshirës së vet (zgjodhi më të afërtin të lirë). Pas kësaj, marrim logët e para nga aplikacionet. app Të kontrollojmë funksionalitetin?
~\/skaffold\/examples\/microservices # kubectl get po\nNAME READY STATUS RESTARTS AGE\nleeroy-app-6998dfcc95-2nxvf 1\/1 Running 0 103s\nleeroy-web-69f7d47c9d-5ff77 1\/1 Running 0 103s\n~\/skaffold\/examples\/microservices # curl localhost:9000\nleeroooooy app!!!
ModifikojmĂ« skedarin leeroy-app\/app.go â kalojnĂ« disa sekonda⊠dhe: ~\/skaffold\/examples\/microservices # kubectl get po\nNAME READY STATUS RESTARTS AGE\nleeroy-app-ffd79d986-l6nwp 1\/1 Running 0 11s\nleeroy-web-69f7d47c9d-5ff77 1\/1 Running 0 4m59s\n~\/skaffold\/examples\/microservices # curl localhost:9000\nleeroooooy Habr!!!
Në të njëjtën kohë, vetë Skaffold printoi në konsolën e njëjtën gjë si më parë, përveç një momenti: ai nxori vetëm , e jo gjithçka menjëherë. leeroy-appMë shumë praktikë
Duhet të përmendet gjithashtu se kur krijoni një projekt të ri, konfigurimet për Skaffold mund të bootstrapped me komandën
, që është shumë e përshtatshme. Për më tepër, mund të shkruani disa konfigurime: të zhvilloni në konfigurimin e paracaktuar, pas së cilës të kaloni në stage me komandën init(të njëjtin proces, që dhe run (po e njëjta procedurë, vetëm që nuk monitoron ndryshimet), duke përdorur një konfigurim tjetër. devNë katacoda ka
udhëzime me shumë thjeshtë. Por atje ofrohet një sandbox i gatshëm me Kubernetes, një aplikacion dhe Skaffold. Një opsion i shkëlqyer nëse jeni të interesuar të provoni vetë bazat.
Një nga mundësitë për të përdorur Skaffold është zhvillimi në një klasër të largët. Nuk është e lehtë për të gjithëve të nisin Minikube në harduerin e tyre dhe më pas të nxjerrin aplikacionin duke pritur funksionimin e tij të duhur⊠Në këtë rast, Skaffold zgjidh shkëlqyeshëm detyrën e paraqitur, siç mund të konfirmojnë, për shembull, inxhinierët e Reddit, për të cilët ne tashmë në blogun tonë.
Dhe në nga Weaveworks mund të gjeni një shembull të krijimit të një pipeline për production.
Përfundim
Skaffold është një mjet i përshtatshëm për ndërtimin e pipeline-ve, që nënkupton nxjerrjen e aplikacioneve në Kubernetes dhe është kryesisht i orientuar drejt nevojave të zhvillimit. Me të, është mjaft e lehtë të krijoni një pipeline "të shkurtër", që merr parasysh nevojat bazë të zhvilluesit, por nëse dëshironi, mund të organizoni edhe procese më të mëdha. Si një nga shembujt e dukshëm të përdorimit të Skaffold në proceset CI/CD një me 10 mikroshërbime, që përdorin mundësitë e Kubernetes, gRPC, Istio dhe OpenCensus Tracing.
Skaffold ka marrë tashmë mbi 8000 yje në GitHub, zhvillohet nga Google dhe është pjesë e - në përgjithësi, në këtë moment ka të gjitha arsyet për të besuar se projekti do të zhvillohet gjatë dhe me sukses.
P.S.
Lexoni gjithashtu në blogun tonë:
- «»;
- «»;
- «»;
- «».
Burimi: habr.com
