
Anderhalve jaar geleden, op 5 maart 2018, heeft Google de eerste alfa-versie van zijn Open Source-project voor CI/CD genaamd , met als doel het creëren van "eenvoudige en reproduceerbare ontwikkeling op Kubernetes", zodat ontwikkelaars zich kunnen concentreren op het ontwikkelen in plaats van op het beheer. Wat maakt Skaffold interessant? Het lijkt erop dat het enkele troeven heeft waardoor het een krachtig hulpmiddel kan worden voor zowel ontwikkelaars als operationele ingenieurs. Laten we kennismaken met het project en zijn mogelijkheden.
NB: Overigens hebben we kort al iets verteld over Skaffold in onze algemene , wiens leven verband houdt met Kubernetes.
Theorie. Doel en mogelijkheden
Dus, om het algemeen te zeggen, lost Skaffold de automatiseringsvraag van de CI/CD-cyclus op (in de fasen build, push, deploy), door de ontwikkelaar directe feedback te bieden, dat wil zeggen de mogelijkheid om snel de resultaten van recente codewijzigingen te ontvangen - in de vorm van een bijgewerkte applicatie die draait in een Kubernetes-cluster. En het kan werken in verschillende omgevingen (dev, stage, production...), waarvoor Skaffold helpt om de bijbehorende pipelines voor implementatie te beschrijven.
De broncode van Skaffold is geschreven in de programmeertaal Go, onder de voorwaarden van de Apache License 2.0 (GitHub).
Laten we de belangrijkste functies en mogelijkheden bekijken. Tot de eerste behoren de volgende:
- Skaffold biedt hulpmiddelen voor het creëren van CI/CD-pipelines.
- Staat achtergrondmonitoring toe van wijzigingen in de broncode en lanceert een geautomatiseerd proces voor het bouwen van code in containerafbeeldingen, het publiceren van deze afbeeldingen in de Docker Registry en hun implementatie in het Kubernetes-cluster.
- Synchroniseert bestanden in de repository met de werkdirectory in de container.
- Test automatisch met behulp van container-structure-test.
- Stelt poorten door.
- Leest de logs van de applicatie die in de container draait.
- Helpt bij het debuggen van applicaties die zijn geschreven in Java, Node.js, Python, Go.
Laten we nu kijken naar de kenmerken:
- Skaffold zelf heeft geen componenten aan de clusterzijde. Dit betekent dat Kubernetes niet extra geconfigureerd hoeft te worden voor gebruik met deze tool.
- Verschillende pipelines voor uw applicatie. Moet code uitrollen naar de lokale Minikube terwijl je ontwikkelt, en daarna naar staging of productie? Daarvoor zijn er en gebruikersconfiguraties, omgevingsvariabelen en vlaggen die het mogelijk maken verschillende pipelines voor één applicatie te beschrijven.
- CLIHet is alleen een consoletool en configuraties in YAML. Online zijn er vermeldingen van pogingen om een , maar op dit moment betekent dit eerder dat iemand het nodig heeft, maar niet veel.
- Modulariteit. Skaffold is geen op zichzelf staande tool, maar streeft ernaar om afzonderlijke modules of al bestaande oplossingen voor specifieke taken te gebruiken.
Een illustratie hiervan:
- In de bouwfase kunnen de volgende middelen worden gebruikt:
- docker build lokaal, in een cluster met behulp van kaniko of in Google Cloud Build;
- Bazel lokaal;
- Jib Maven en Jib Gradle lokaal of in Google Cloud Build;
- aangepaste build-scripts die lokaal worden uitgevoerd. Als u een andere (meer flexibele / gebruikelijke / ...) buildoplossing wilt gebruiken, wordt deze in het script beschreven zodat Skaffold precies die uitvoert (). Dit maakt het mogelijk om elke builder te gebruiken die via een script kan worden aangeroepen;
- Tijdens de testfase wordt al genoemd ;
- Voor deployment zijn de volgende middelen beschikbaar:
- Kubectl;
- Helm;
- kustomize.
Hierdoor kan Skaffold worden beschouwd als een soort framework voor CI/CD. Hier is een voorbeeld van een workflow bij gebruik (uit de documentatie van het project):

Hoe ziet de werking van Skaffold er globaal uit?
- De tool houdt wijzigingen in de map met de broncode in de gaten. Als er wijzigingen in de bestanden worden aangebracht, worden deze gesynchroniseerd met de pod van de applicatie in het Kubernetes-cluster. Indien mogelijk — zonder de afbeelding opnieuw te bouwen. In andere gevallen — wordt een nieuwe afbeelding gebouwd.
- De gebouwde afbeelding wordt gecontroleerd met container-structure-test, getagd en naar de Docker Registry gestuurd.
- Daarna wordt de afbeelding gedeployed — uitgerold in het Kubernetes-cluster.
- Als de uitvoering is gestart met het commando
skaffold dev, dan beginnen we logboeken van de applicatie te ontvangen, terwijl Skaffold wacht op wijzigingen om alle acties opnieuw te herhalen.

Illusie van de belangrijkste stappen in de werking van Skaffold
Praktijk. Probeer Skaffold
Voor een demonstratie van het gebruik van Skaffold neem ik een voorbeeld uit de . Übrigens, Er zijn ook veel andere voorbeelden te vinden die rekening houden met verschillende specificaties. Alle acties worden lokaal in Minikube uitgevoerd. De installatie is eenvoudig en duurt een paar minuten, en voor de eerste stap is kubectl nodig.
Laten we Skaffold installeren:
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.1We klonen de Skaffold-repository met de benodigde voorbeelden:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesIk heb een voorbeeld gekozen met twee pods, elk met een kleine applicatie geschreven in Go. Eén applicatie is de frontend (leeroy-web), die verzoeken doorstuurt naar de tweede applicatie, de backend (leeroy-app). Laten we eens kijken hoe dat eruitziet:
~/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 en leeroy-web bevatten Go-code en eenvoudige Dockerfiles voor de lokale opbouw van deze code:
~/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 . Ik zal de code van de applicaties niet geven — het is voldoende om te weten dat leeroy-web verzoeken aanvaardt en deze doorstuurt naar leeroy-app. Daarom bevat het bestand Deployment.yaml een Service alleen voor app (voor interne routering). De poort van de pod web gaan we doorsturen voor snelle toegang tot de applicatie.
Hoe ziet 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 Hier worden alle fasen beschreven die eerder zijn genoemd. Naast deze configuratie is er ook een bestand met globale instellingen — ~/ .skaffold/config. Dit kan handmatig worden bewerkt of via de CLI — bijvoorbeeld zo:
skaffold config set --global local-cluster true Dit commando stelt de globale variabele local-cluster op de waarde van true, waarna Skaffold niet zal proberen om afbeeldingen naar een externe register te pushen. Als je lokaal ontwikkelt, kun je dit commando gebruiken om ook lokaal afbeeldingen op te slaan.
Laten we terugkeren naar skaffold.yaml:
- In de fase
buildgeven we aan dat de afbeelding lokaal moet worden opgebouwd en opgeslagen. Nadat de bouw voor het eerst is uitgevoerd, zullen we het volgende zien:// т.к. 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.1MBZoals te zien is, heeft Skaffold zelf de afbeeldingen getagd. Übrigens worden meerdere tagging-beleid ondersteund.
- Vervolgens staat in de configuratie
context: ./leeroy-app/, dat wil zeggen dat de context is gedefinieerd waarin de afbeelding wordt opgebouwd. - In de implementatiefase wordt bepaald dat we kubectl gaan gebruiken en een masker voor de benodigde manifesten.
-
PortForward: vergelijkbaar met hoe we normaal gesproken poorten doorgeven met behulp vankubectl port-forward, geven we instructies aan Skaffold om dit commando aan te roepen. In dit geval wordt lokale poort 9000 doorgestuurd naar 8080 in de Deployment met de naamleeroy-web.
Het is tijd om skaffold dev: het commando creëert een voortgaande 'feedbackloop', dat wil zeggen dat het niet alleen alles verzamelt en implementeert in het cluster, maar ook informatie geeft over de huidige status van de pods, de veranderingen volgt en de status van de pods update.
Hier is het resultaat van de uitvoering skaffold dev --port-forward bij een herbouw:

Ten eerste is te zien dat de cache wordt gebruikt. Vervolgens wordt de applicatie gebouwd, geïmplementeerd en worden de poorten doorgestuurd. Aangezien is opgegeven --port-forward, heeft Skaffold de poort doorgestuurd zoals gevraagd, maar hij heeft webde poort naar eigen inzicht doorgestuurd (de dichtstbijzijnde beschikbare gekozen). Daarna krijgen we de eerste logs van de applicaties. app Zullen we de functionaliteit controleren?
~/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!!!
Laten we het bestand leeroy-app/app.go aanpassen — na enkele seconden… en: ~/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!!!
Ondertussen heeft Skaffold hetzelfde in de console weergegeven als eerder, met uitzondering van één moment: hij heeft alleen , en niet alles in één keer. leeroy-appMeer praktijkervaring
Het is ook vermeldenswaard dat bij het maken van een nieuw project de configuraties voor Skaffold kunnen worden 'gebootstrap't met behulp van het commando
init , wat erg handig is. Bovendien kunnen meerdere configuraties worden geschreven: ontwikkelen op de standaardconfiguratie, en daarna implementeren met het commandorun (hetzelfde proces als dev , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie.Op katacoda is er
een handleiding met een nog eenvoudiger voorbeeld. Bovendien biedt het al een kant-en-klare sandbox met Kubernetes, een applicatie en Skaffold. Een uitstekende optie als je zelf de basisprincipes wilt uitproberen.
Een van de mogelijke toepassingen van Skaffold is ontwikkelen op een externe cluster. Niet iedereen vindt het handig om Minikube op eigen hardware te draaien, om vervolgens een applicatie uit te rollen en te wachten totdat deze goed functioneert... In dat geval lost Skaffold de gestelde taak uitstekend op, wat bijvoorbeeld ingenieurs van Reddit kunnen bevestigen, waar we al eerder op onze blog.
En bij Weaveworks kun je een voorbeeld vinden van het creëren van een pipeline voor productie.
Conclusie
Skaffold is een handig hulpmiddel voor het bouwen van pipelines voor het uitrollen van applicaties in Kubernetes, met een focus op ontwikkelbehoeften. Het is vrij eenvoudig om een 'korte' pipeline te creëren die aan de basisbehoeften van een ontwikkelaar voldoet, maar als je wilt, kun je ook grotere processen organiseren. Een van de duidelijke voorbeelden van het gebruik van Skaffold in CI/CD-processen zo'n met 10 microservices die gebruikmaken van de mogelijkheden van Kubernetes, gRPC, Istio en OpenCensus Tracing.
Skaffold heeft al bijna 8000+ sterren op GitHub, het wordt ontwikkeld door Google en maakt deel uit van — kortom, op dit moment zijn er alle redenen om aan te nemen dat het project zich langdurig en succesvol zal ontwikkelen.
P.S.
Lees ook op onze blog:
- «»;
- «»;
- «»;
- «».
Bron: habr.com
