
För ett och ett halvt Är sedan, den 5 mars 2018, slÀppte Google den första alfa-versionen av sitt Open Source-projekt för CI/CD med namnet , vars mÄl var att skapa "en enkel och reproducerbar utvecklingsmiljö för Kubernetes" sÄ att utvecklare kunde fokusera pÄ sjÀlva utvecklingen snarare Àn pÄ administration. Vad kan Skaffold intressera? Det visar sig att det har flera ess i rockÀrmen som kan göra det till ett kraftfullt verktyg för bÄde utvecklare och driftsingenjörer. LÄt oss bekanta oss med projektet och dess möjligheter.
NB: För övrigt har vi redan kortfattat berÀttat om Skaffold i vÄr övergripande , vars liv Àr kopplat till Kubernetes.
Teori. Syfte och funktioner
SĂ„, om vi pratar allmĂ€nt, löser Skaffold problemet med automatisering av CI/CD-cykeln (i faserna build, push, deploy), genom att erbjuda utvecklaren snabb Ă„terkoppling, dvs. möjligheten att snabbt fĂ„ resultat av de senaste kodĂ€ndringarna â i form av en uppdaterad applikation som körs i Kubernetes-klustret. Det kan fungera i olika miljöer (dev, stage, productionâŠ), och för detta hjĂ€lper Skaffold till att beskriva de relevanta pipelines för distribution.
KÀllkoden till Skaffold Àr skriven i Go-sprÄket, under villkoren för den fria licensen Apache License 2.0 (GitHub).
LÄt oss titta pÄ de grundlÀggande funktionerna och egenskaperna. Till de första kan vi nÀmna följande:
- Skaffold erbjuder verktyg för att skapa CI/CD-pipelines.
- Det möjliggör att i bakgrunden övervaka Àndringar i kÀllkoden och starta en automatiserad process för att bygga koden till containerbilder, publicera dessa bilder i Docker Registry och distribuera dem till Kubernetes-klustret.
- Synkroniserar filer i repositoryt med arbetskatalogen i containern.
- Automatiskt testar med hjÀlp av container-structure-test.
- Vidarebefordrar portar.
- LÀser loggar frÄn applikationen som körs i containern.
- HjÀlper till med att felsöka applikationer skrivna i Java, Node.js, Python, Go.
Nu â om funktionerna:
- Skaffold har inga komponenter pÄ kluster-sidan.Det betyder att ytterligare konfiguration av Kubernetes för att anvÀnda detta verktyg inte krÀvs.
- Olika pipelines för din applikation.Behöver du distribuera koden till den lokala Minikube medan du utvecklar, och sedan till stage eller produktion? Detta Àr möjligt med och anvÀndarkonfigurationer, miljövariabler och flaggor som gör det möjligt att beskriva olika pipelines för en och samma applikation.
- CLI. Endast ett kommandoradsverktyg och konfigurationer i YAML. PÄ nÀtet kan man hitta omnÀmnanden av försök att skapa , men för nÀrvarande innebÀr det snarare att det Àr nÄgon som behöver det, men inte sÄ mycket.
- Modularitet. Skaffold Àr ingen fristÄende maskin, utan strÀvar efter att anvÀnda separata moduler eller redan existerande lösningar för specifika uppgifter.
En illustration av det senaste:
- Under byggsteget kan du anvÀnda:
- docker build lokalt, i klustret med hjÀlp av kaniko eller i Google Cloud Build;
- Bazel lokalt;
- Jib Maven och Jib Gradle lokalt eller i Google Cloud Build;
- anpassade build-skript som körs lokalt. Om du behöver köra en annan (mer flexibel / bekant / ...) lösning för byggande, beskrivs den i skriptet sÄ att Skaffold exakt kör den (). Detta gör det möjligt att anvÀnda vilken byggare som helst som kan anropas med hjÀlp av skript;
- Under teststeget stöds redan nÀmnda ;
- För distribution finns:
- Kubectl;
- Helm;
- kustomize.
Tack vare detta kan Skaffold kallas en slags ramverk för att bygga CI/CD. HÀr Àr ett exempel pÄ arbetsflödet vid anvÀndning av det (frÄn projektets dokumentation):

Hur ser Skaffold ut i grova drag?
- Verktyget övervakar Ă€ndringar i kĂ€llkoden. Om filer modifieras synkroniseras de med podden i applikationen i Kubernetes-klustret. Om det Ă€r möjligt â utan att bygga om bilden. I annat fall â byggs en ny bild.
- Den byggda bilden verifieras med hjÀlp av container-structure-test, taggas och skickas till Docker Registry.
- Efter det distribueras bilden â den rullas ut i Kubernetes-klustret.
- Om körningen har initierats med kommandot
skaffold dev, börjar vi fÄ loggar frÄn applikationen, och Skaffold vÀntar pÄ förÀndringar för att upprepa alla ÄtgÀrder.

En illustration av de grundlÀggande stegen i Skaffolds arbete
Praktik. LÄt oss prova Skaffold
För att demonstrera anvÀndningen av Skaffold tar jag ett exempel frÄn . Förresten, mÄnga andra exempel som tar hÀnsyn till olika specifikationer. Alla ÄtgÀrder kommer att utföras lokalt i Minikube. Installation Àr enkel och tar nÄgra minuter, och för att komma igÄng behövs kubectl.
Installera 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.1Vi klonar Skaffold-repot med nödvÀndiga exempel:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesJag har valt exemplet med tvĂ„ poddar, var och en innehĂ„llande en liten applikation i Go. En applikation Ă€r frontenden (leeroy-web) som dirigerar förfrĂ„gningar till den andra applikationen â backend (leeroy-app). LĂ„t oss se hur det ser ut:
~/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 kataloger, 8 filerleeroy-app och leeroy-web innehÄller kod i Go och enkla Dockerfiles för lokal byggnation av denna kod:
~/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 . Jag kommer inte att ge koden för applikationerna â det rĂ€cker att veta att leeroy-web tar emot förfrĂ„gningar och proxar dem till leeroy-app. DĂ€rför finns det en service i filerna Deployment.yaml bara för app (för intern ruttning). Porten för podden web kommer vi att vidarebefordra för snabb Ă„tkomst till applikationen.
Hur ser det ut 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 HĂ€r beskrivs alla steg som nĂ€mnts ovan. Utöver denna konfiguration finns det Ă€ven en fil med globala instĂ€llningar â ~/.skaffold/config. Den kan redigeras manuellt eller via CLI â till exempel sĂ„ hĂ€r:
skaffold config set --global local-cluster true Detta kommando stÀller in den globala variabeln local-cluster till vÀrdet true, varefter Skaffold inte kommer att försöka "push"-a bilder till ett fjÀrrregister. Om du utvecklar lokalt kan du anvÀnda detta kommando för att lagra bilder lokalt ocksÄ.
LÄt oss Äterkomma till skaffold.yaml:
- Under fasen
buildvi anger att vi ska bygga och spara bilden lokalt. NĂ€r bygget körs första gĂ„ngen ser vi följande:// Ń.Đș. 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.1MBSom man kan se har Skaffold automatiskt taggat bilderna. Förresten, flera taggningspolicyer stöds.
- DĂ€refter anges i konfigen
context: ./leeroy-app/, dvs. den kontext som anvÀnds för att bygga bilden. - Under deployment, it is determined that we will use kubectl and the mask for the required manifests.
-
PortForward: similar to how we usually forward ports usingkubectl port-forward, we provide Skaffold with instructions to invoke this command. In this case, the local port 9000 is forwarded to 8080 in a Deployment namedleeroy-web.
Now is the time to run skaffold dev: the command will create a continuous "feedback loop", i.e., it will not only build everything and deploy it to the cluster, but also report on the current state of the pods, watch for changes, and update the pod states.
Here are the results of starting skaffold dev --port-forward on a rebuild:

First of all, we see that caching is being used. Next, the application is being built, deployed, and ports are being forwarded. Since it is specified --port-forward, Skaffold has forwarded the port to web, as requested, but it app forwarded at its own discretion (it chose the nearest available one). After that, we get the first logs from the applications.
Shall we check the functionality?
~\/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!!! Let's modify the file leeroy-app\/app.go â a few seconds pass⊠and:
~\/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!!! At the same time, Skaffold output the same thing to the console as before, with one exception: it only emitted leeroy-app, rather than everything at once.
More practice
It is worth mentioning that when creating a new project, Skaffold configs can be 'bootstrapped' using the command init, which is very convenient. Furthermore, you can write several configs: develop on the default config, and then deploy to stage using the command run (the same process as dev, just not monitoring changes), using a different config.
On Katacoda, there is an even simpler example. It offers a ready-made sandbox with Kubernetes, an application, and Skaffold. A great option if you're interested in trying out the basics yourself.
Ett av de möjliga anvÀndningsomrÄdena för Skaffold Àr att hantera utveckling pÄ en fjÀrrkluster. Inte alla tycker att det Àr bekvÀmt att köra Minikube pÄ sin egen hÄrdvara och sedan lansera applikationen och vÀnta pÄ att den ska fungera korrekt⊠I sÄdana fall löser Skaffold uppgiften utmÀrkt, vilket kan bekrÀftas av till exempel Reddit-ingenjörer, vilket vi redan har nÀmnt. finnas i vÄr blogg.
Och i frÄn Weaveworks finns ett exempel pÄ hur man skapar en pipeline för produktion.
Slutsats
Skaffold Àr ett praktiskt verktyg för att bygga pipelines som innebÀr lansering av applikationer i Kubernetes och som frÀmst Àr inriktade pÄ utvecklarens behov. Det Àr ganska enkelt att skapa en "kort" pipeline som tar hÀnsyn till utvecklarens grundlÀggande behov, men om sÄ önskas kan man ocksÄ organisera mer omfattande processer. Som ett av de tydliga exemplen pÄ tillÀmpningen av Skaffold i CI/CD-processer en sÄdan som bestÄr av 10 mikrotjÀnster som anvÀnder sig av Kubernetes, gRPC, Istio och OpenCensus Tracing.
Skaffold har redan fĂ„tt nĂ€stan 8000 stjĂ€rnor pĂ„ GitHub, utvecklas av Google och Ă€r en del av â sĂ„ i allmĂ€nhet finns det just nu all anledning att tro att projektet kommer att fortsĂ€tta att utvecklas lĂ„ngsiktigt och framgĂ„ngsrikt.
P.S.
LÀs Àven i vÄr blogg:
- «»;
- «»;
- «»;
- «».
KĂ€lla: habr.com
