
Prije petnaest mjeseci, 5. ožujka 2018., tvrtka Google je objavila prvu alfa verziju svog Open Source projekta za CI/CD pod nazivom , čija je svrha bila izrada "jednostavnog i ponovljivog razvoja pod Kubernetesom", kako bi se programeri mogli usredotočiti na razvoj, a ne na administraciju. Što čini Skaffold zanimljivim? Kao što se pokazalo, ima nekoliko aduta u rukavu koji ga mogu učiniti snažnim alatom za programere, a možda i za inženjere održavanja. Upoznajmo projekt i njegove mogućnosti.
NB: Usput, već smo ukratko pričali o Skaffoldu u našem općem , čiji je život povezan s Kubernetesom.
Teorija. Svrha i mogućnosti
Dakle, ako govorimo općenito, Skaffold rješava problem automatizacije CI/CD ciklusa (u fazama build, push, deploy), nudeći programeru brzu povratnu informaciju, tj. mogućnost brzog dobivanja rezultata posljednjih promjena u kodu — u obliku ažurirane aplikacije koja radi u Kubernetes klasteru. A to može raditi u različitim okruženjima (dev, stage, production…), za što Skaffold pomaže u opisivanju odgovarajućih pipeline-a za implementaciju.
Izvorni kod Skaffolda napisan je na jeziku Go, pod slobodnom licencom Apache License 2.0 (GitHub).
Pogledajmo glavne funkcije i karakteristike. Prve se mogu izdvojiti:
- Skaffold nudi alate za izradu CI/CD pipeline-a.
- Omogućuje u pozadini praćenje promjena u izvornoj šifri i pokretanje automatiziranog procesa izgradnje koda u slike kontejnera, objavljivanje tih slika u Docker Registry i njihovu implementaciju u Kubernetes klaster.
- Sinkronizira datoteke u repozitoriju s radnim direktorijem u kontejneru.
- Automatski testira pomoću container-structure-test.
- Prosljeđuje portove.
- Čita logove aplikacije pokrenute u kontejneru.
- Pomaže u debagiranju aplikacija napisanih u Javi, Node.js, Pythonu, Go.
Sada — o značajkama:
- Sama Skaffold nema komponente na strani klastera. To jest, nije potrebno dodatno konfigurirati Kubernetes za korištenje ove alate.
- Različiti pipeline-i za vašu aplikaciju. Trebate implementirati kod u lokalni Minikube dok razvijate, a zatim — na stage ili production? Za to su predviđeni i korisničke konfiguracije, varijable okruženja i zastavice koje omogućuju opisivanje različitih pipelineova za jednu aplikaciju.
- CLI. Samo konzolna alatka i konfiguracije u YAML formatu. Na mreži možete pronaći spominjanje pokušaja izrade , međutim, trenutno to više znači da je nekome potreban, ali ne previše.
- Modularnost. Skaffold nije samostalni kombajn, već teži korištenju zasebnih modula ili već postojećih rješenja za specifične zadatke.
Ilustracija posljednjeg:
- U fazi gradnje može se koristiti:
- docker build lokalno, u klasteru putem kaniko ili u Google Cloud Build;
- Bazel lokalno;
- Jib Maven i Jib Gradle lokalno ili u Google Cloud Build;
- prilagođene build-skripte koje se pokreću lokalno. Ako trebate pokrenuti drugo (fleksibilnije/poznatije/…) rješenje za gradnju, ono se opisuje u skripti kako bi Skaffold pokrenuo baš to (). To omogućava korištenje bilo kojeg graditelja koji se može pozvati pomoću skripte;
- U fazi testiranja podržava se već spomenuti ;
- Za deploy su predviđeni:
- Kubectl;
- Helm;
- kustomize.
Zahvaljujući tome, Skaffold se može nazvati svojevrsnim okvirom za CI/CD. Evo primjera radnog procesa pri njegovoj upotrebi (iz dokumentacije projekta):

Kako u osnovnim crtama izgleda rad Skaffolda?
- Alat prati promjene u direktoriju sa izvor kodom. Ako se u datoteke unesu izmjene, one se sinkroniziraju s podom aplikacije u Kubernetes klasteru. Ako je moguće — bez ponovnog sastavljanja slike. U suprotnom — sastavlja se nova slika.
- Sastavljena slika se provjerava pomoću container-structure-test, označava i šalje u Docker Registry.
- Nakon toga slika se deploya — postavlja u Kubernetes klaster.
- Ako je pokretanje inicirano pomoću naredbe
skaffold dev, tada počinjemo primati logove iz aplikacije, dok Skaffold čeka promjene kako bi ponovio sve radnje ispočetka.

Ilustracija osnovnih faza rada Skaffolda
Praksa. Isprobavamo Skaffold
Za demonstraciju korištenja Skaffolda uzet ću primjer iz . Usput, možete pronaći i mnoštvo drugih primjera, uzimajući u obzir različite specifikacije. Sve radnje ću izvoditi lokalno u Minikube. Instalacija je jednostavna i traje nekoliko minuta, a za početak rada potreban je kubectl.
Instalirajmo 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.1Kloniramo repozitorij Skaffold-a s potrebnim primjerima:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesOdabrao sam primjer s dva pod-a, svaki od njih sadrži malu aplikaciju napisana u Go-u. Jedna aplikacija je frontend (leeroy-web), koja prosljeđuje zahtjev drugoj aplikaciji – backendu (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 direktorija, 8 datotekaleeroy-app i leeroy-web sadrže Go kod te jednostavne Dockerfile-ove za lokalnu izradu tog 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 . Neću navoditi kod aplikacija — dovoljno je znati da leeroy-web prihvaća zahtjeve i prosljeđuje ih na leeroy-app. Stoga u datotekama Deployment.yaml postoji servis samo za app (za unutarnje usmjeravanje). Port pod-a web proslijedit ćemo za brz 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 koje su spomenute ranije. Osim ovog konfiguracijskog datoteka postoji i datoteka s globalnim postavkama — ~/ .skaffold/config. Može se uređivati ručno ili putem CLI-ja — na primjer, ovako:
skaffold config set --global local-cluster true Ova komanda će postaviti globalnu varijablu local-cluster na true, nakon čega Skaffold neće pokušavati 'push' slike na udaljeni registar. Ako radite lokalno, možete koristiti ovu komandu da pohranite slike lokalno.
Vratimo se na skaffold.yaml:
- U fazi
buildnavodimo da se slika treba izraditi i pohraniti lokalno. Nakon prvog pokretanja izrade, vidjet ćemo sljedeć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 vidjeti, Skaffold je sam označio slike. Usput, podržava se nekoliko politika označavanja.
- Dalje u konfiguraciji navedeno je
context: ./leeroy-app/, tj. definiran je kontekst unutar kojeg se slika izgrađuje. - U fazi implementacije se određuje da ćemo koristiti kubectl i masku za potrebne efemeride.
-
PortForward: slično onome kako obično preusmjeravamo portove pomoćukubectl port-forward, dajemo instrukcije Skaffoldu za izvođenje ove komande. U ovom slučaju — lokalni port 9000 se preusmjerava na 8080 u Deploymentu s imenomleeroy-web.
Vrijeme je da pokrenemo skaffold dev: komanda će stvoriti kontinuirani "ciklus povratne informacije", tj. ne samo da će sakupiti sve i implementirati u klaster, već će i obavijestiti o stanju podova u tom trenutku, pratiti promjene i ažurirati stanje podova.
Evo rezultata pokretanja skaffold dev --port-forward prilikom ponovne izgradnje:

Prvo, vidljivo je da se koristi cache. Nadalje — aplikacija se gradi, implementira, portovi se preusmjeravaju. Budući da je naznačeno --port-forward, Skaffold je preusmjerio port do web, kako mu je i rečeno, ali app je preusmjerio po vlastitom nahođenju (izabrao najbliži slobodni). Nakon toga dobijamo prve logove od aplikacija.
Provjerimo funkcionalnost?
~\/skaffold\/examples\/microservices # kubectl get po
IME SPREMAN STATUS PONOVNI STARTOVI STAROST
leeroy-app-6998dfcc95-2nxvf 1\/1 Radi 0 103s
leeroy-web-69f7d47c9d-5ff77 1\/1 Radi 0 103s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy aplikacija!!! Modificiramo datoteku leeroy-app\/app.go — prolazi nekoliko sekundi… i:
~\/skaffold\/examples\/microservices # kubectl get po
IME SPREMAN STATUS PONOVNI STARTOVI STAROST
leeroy-app-ffd79d986-l6nwp 1\/1 Radi 0 11s
leeroy-web-69f7d47c9d-5ff77 1\/1 Radi 0 4m59s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy Habr!!! Pri tom je sam Skaffold ispisao u konzolu isto ono što je ranije, osim jednog momenta: ispisao je samo leeroy-app, a ne sve odjednom.
Više prakse
Vrijedi spomenuti i to da se prilikom kreiranja novog projekta konfiguracije za Skaffold mogu ‘bootstrap’ izvršiti pomoću komande init, što je veoma zgodno. Također, moguće je napisati više konfiguracija: raditi na konfiguraciji po defaultu, nakon čega se može prebaciti na stage s komandom run (isti proces kao i dev, samo ne prati promjene), koristeći drugu konfiguraciju.
Na katacodi postoji s primjerom još jednostavnijim. Umjesto toga, tamo se nudi već gotova sandboxa s Kubernetesom, aplikacijom i Skaffoldom. Odlična opcija ako vas zanima samostalno isprobavanje najosnovnijeg.
Jedna od mogućnosti korištenja Skaffolda je razvoj na udaljenom klasteru. Nije svima zgodno pokretati Minikube na vlastitom hardveru, a zatim implementirati aplikaciju i čekati da ona ispravno funkcionira... U tom slučaju Skaffold odlično rješava postavljeni zadatak, što mogu potvrditi, na primjer, inženjeri Reddita, o čemu smo već pročitati na našem blogu.
A u iz Weaveworks možete pronaći primjer kreiranja pipeline-a za produkciju.
Zaključak
Skaffold je praktičan alat za izgradnju pipeline-a koji podrazumijevaju implementaciju aplikacija u Kubernetes i koji su prvenstveno usmjereni na potrebe razvoja. S njim je prilično lako stvoriti 'kratki' pipeline koji uzima u obzir osnovne potrebe programera, no ako želite, možete organizirati i opsežnije procese. Kao jedan od jasnih primjera primjene Skaffolda u CI/CD procesima takve od 10 mikroslužbi koje koriste mogućnosti Kubernetes, gRPC, Istio i OpenCensus Tracing.
Skaffold je već dobio gotovo 8000+ zvjezdica na GitHubu, razvija ga Google i dio je — Generalno, trenutno postoji mnogo razloga vjerovati da će se projekt razvijati dugo i uspješno.
P.S.
Pročitajte i na našem blogu:
- «»;
- «»;
- «»;
- «».
Izvor: habr.com
