
Predkonec 5. marca 2018 je podjetje Google izdalo prvo alfa različico svojega odprtokodnega projekta za CI/CD z imenom , katere cilj je ustvariti "enostavno in ponovljivo razvojno okolje za Kubernetes", da se lahko razvijalci osredotočijo na razvoj, namesto na upravljanje. Kaj lahko Skaffold ponudi? Kot se je izkazalo, ima več adutov, zaradi katerih je lahko močno orodje tako za razvijalce kot za inženirje za upravljanje. Spoznajmo projekt in njegove zmožnosti.
NB: Mimogrede, že smo na kratko spregovorili o Skaffoldu v našem splošnem , katerih življenje je povezano s Kubernetesom.
Teorija. Namen in možnosti
Torej, na splošno lahko rečemo, da Skaffold rešuje nalogo avtomatizacije CI/CD cikla (v fazah build, push, deploy), saj razvijalcu ponuja hitro povratno informacijo, to je sposobnost hitrega pridobivanja rezultatov sprememb kode — v obliki posodobljene aplikacije, ki deluje v Kubernetes klasterju. Deluje lahko v različnih okoljih (dev, stage, production…), za kar Skaffold pomaga opisati ustrezne poti za izvedbo.
Izvorna koda Skaffolda je napisana v jeziku Go, pod pogoji proste licence Apache License 2.0 (GitHub).
Oglejmo si glavne funkcije in lastnosti. Med prvimi lahko omenimo naslednje:
- Skaffold ponuja orodja za ustvarjanje CI/CD poti.
- Omogoča spremljanje sprememb v izvorni kodi v ozadju in zagon avtomatiziranega procesa sestavljanja kode v slike kontejnerjev, objavo teh slik v Docker Registry in njihovo uvedbo v Kubernetes klaster.
- Sinhronizira datoteke v repozitoriju z delovnim imenikom v kontejnerju.
- Samodejno testira z uporabo container-structure-test.
- Preusmerja vrata.
- Beri dnevnike aplikacije, zagnane v kontejnerju.
- Pomaga pri odpravljanju napak v aplikacijah, napisanih v Java, Node.js, Python, Go.
Zdaj o posebnostih:
- Sama Skaffold nima komponent na strani klasterja. To pomeni, da dodatne nastavitve Kubernetes za uporabo tega orodja niso potrebne.
- Različne poti za vašo aplikacijo. Morate izdati kodo v lokalni Minikube, medtem ko razvijate, nato pa na stage ali production? Za to so predvideni in user configurations, environment variables, and flags that allow describing different pipelines for a single application.
- CLI. Only a console utility and configurations in YAML. Online, you can find mentions of attempts to create , however, at the moment this mostly means that someone needs it, but not very much.
- Modularity. Skaffold is not a standalone tool; it aims to use individual modules or existing solutions for specific tasks.
An illustration of the latter:
- At the build stage, you can use:
- docker build locally, in a cluster using kaniko, or in Google Cloud Build;
- Bazel locally;
- Jib Maven and Jib Gradle locally or in Google Cloud Build;
- custom build scripts running locally. If you need to run another (more flexible/customary/…) build solution, it is described in the script for Skaffold to specifically run that one (). This allows using any build tool that can be invoked through a script;
- At the testing stage, the previously mentioned ;
- For deployment, the following are provided:
- Kubectl;
- Helm;
- kustomize.
Thanks to this, Skaffold can be described as a kind of framework for building CI/CD. Here’s an example of the workflow when using it (from the project documentation):

What does the overall work of Skaffold look like?
- The utility monitors changes in the source code directory. If modifications are made to the files, they are synchronized with the app's pod in the Kubernetes cluster. If possible — without rebuilding the image. Otherwise — a new image is built.
- The built image is validated using container-structure-test, tagged, and sent to Docker Registry.
- After that, the image is deployed — launched in the Kubernetes cluster.
- If the launch was initiated with the command
skaffold dev, we begin receiving logs from the application while Skaffold waits for changes to repeat all actions again.

An illustration of the main stages of Skaffold's operation
Practice. Let's try Skaffold
To demonstrate the use of Skaffold, I'll take an example from . By the way, you can also find many other examples considering various specifics. All actions will be performed locally in Minikube. The installation is simple and will take a few minutes, and you'll need kubectl to get started.
Let's install 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.1Kloniće repo sa primerima za Skaffold:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesIzabrao sam primer sa dva pod-a, od kojih svaki sadrži po jednu malu aplikaciju napisanu u Go. Jedna aplikacija je frontend (leeroy-web), koja preusmerava zahteve na drugu aplikaciju — backend (leeroy-app). Pogledajmo kako to izgleda:
~/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 direktorijuma, 8 datotekaleeroy-app i leeroy-web sadrže kod na Go i jednostavne Dockerfile-ove za lokalnu izgradnju tog koda:
~/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 . Neću prikazivati kod aplikacija — dovoljno je znati da leeroy-web prihvata zahteve i proksira ih ka leeroy-app. Zato u datotekama Deployment.yaml postoji Service samo za app (za internu rutiranje). Port pod-a web proširićemo za brzi pristup aplikaciji.
Kako izgleda 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 Ovdje su opisane sve faze pomenute ranije. Pored ove konfiguracije postoji i datoteka sa globalnim podešavanjima — ~/ .skaffold/config. Može se uređivati ručno ili putem CLI-ja — na primer, ovako:
skaffold config set --global local-cluster true Ova komanda postavlja globalnu promenljivu local-cluster na vrednost true, nakon čega Skaffold neće pokušavati da 'push'-uje slike u udaljeni registar. Ako radite lokalno, možete koristiti ovu komandu da skladištite slike lokalno.
Vratimo se na skaffold.yaml:
- U fazi
buildnavodimo da treba napraviti i sačuvati sliku lokalno. Nakon što se prvi put pokrene izgradnja, videćemo sledeće:// т.к. 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.1MBKao što se može videti, Skaffold je samostalno označio slike. Usput, podržava se nekoliko politika označavanja.
- Dalje, u konfiguraciji je navedeno
context: ./leeroy-app/, tj. postavljen je kontekst u kojem se slika gradi. - Na fazi implementacije utvrđuje se da ćemo koristiti kubectl i masku za potrebne manifeste.
-
PortForward: slično onome kako obično preusmjeravamo portove pomoćukubectl port-forward, dajemo instrukcije Skaffoldu za pozivanje ove komande. U ovom slučaju — lokalni port 9000 se preusmjerava na 8080 u Deployment-u nazvanomleeroy-web.
Sada je vreme da pokrenemo skaffold dev: komanda će stvoriti neprekidnu 'povratnu petlju', tj. ne samo da će skupiti sve i implementirati u klaster, već će i izvesti stanje podova u tom trenutku, pratiti promene i ažurirati stanje podova.
Evo rezultata pokretanja skaffold dev --port-forward prilikom ponovne izrade:

Prvo, vidimo da se koristi keš. Zatim — aplikacija se pravi, implementira, portovi se preusmjeravaju. Budući da je navedeno --port-forward, Skaffold je preusmjerio port do web, kao što je i traženo, dok je app preusmjerio po sopstvenoj proceni (izabrao najbliži slobodni). Posle ovoga dobijamo prve logove od aplikacija.
Da proverimo funkcionalnost?
~\/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!!! Modifikujemo datoteku leeroy-app\/app.go — prođe nekoliko sekundi… i:
~\/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!!! U tom trenutku sam Skaffold isporučio u konzolu isto što i ranije, osim jednog momenta: izveo je samo leeroy-app, a ne sve odjednom.
Više prakse
Vrijedi pomenuti i to da prilikom kreiranja novog projekta, konfiguracije za Skaffold se mogu za 'bootstrap' pomoću komande init, što je veoma praktično. Pored toga, moguće je napisati nekoliko konfiguracija: raditi na konfiguraciji po defaultu, a zatim preći na stage komandom run (isti proces kao i dev, samo ne prati promene), koristeći drugu konfiguraciju.
Na katacodi postoji s primerom još jednostavnijim. Umesto toga, tamo se nudi već gotova sandbox sa Kubernetes-om, aplikacijom i Skaffold-om. Odlična opcija, ako vam je zanimljivo da samostalno isprobate osnove.
Ena od možnosti uporabe Skaffolda je razvoj na oddaljenem klastru. Ni vsakomur udobno zagnati Minikube na svoji strojni opremi, nato pa implementirati aplikacijo in čakati na njeno ustrezno delovanje… V tem primeru Skaffold odlično rešuje postavljeno nalogo, kar lahko potrdijo inženirji Reddit, o čemer smo že v našem blogu.
In od Weaveworks lahko najdete primer ustvarjanja pipelines za produkcijo.
Zaključek
Skaffold je priročno orodje za gradnjo pipelines, ki vključujejo implementacijo aplikacij v Kubernetes in so usmerjena predvsem na potrebe razvoja. Z njim je precej enostavno ustvariti 'kratko' pipeline, ki upošteva osnovne potrebe razvijalca, vendar pa je mogoče organizirati tudi bolj obsežne procese. Kot en od jasnih primerov uporabe Skaffolda v CI/CD procesih takšen s 10 mikrostoritvami, ki izkoriščajo možnosti Kubernetes, gRPC, Istio in OpenCensus Tracing.
Skaffold je že prejel skoraj 8000+ zvezd na GitHubu, razvija ga Google in je del — na splošno, za pravočasno menimo, da se bo projekt razvijal dolgo in srečno.
P.S.
Preberite tudi na našem blogu:
- «»;
- «»;
- «»;
- «».
Izvor: habr.com
