Prije godinu i pol dana, 5. ožujka 2018., Google je objavio prvu alpha verziju svog Open Source projekta za CI/CD tzv. skela, čiji je cilj bio stvoriti “jednostavan i ponovljiv Kubernetes razvoj” kako bi se programeri mogli usredotočiti na razvoj, a ne na administraciju. Što bi moglo biti zanimljivo o Skaffoldu? Kako se ispostavilo, ima nekoliko trikova u rukavu koji ga mogu učiniti moćnim alatom za programera, a možda čak i operativnog inženjera. Upoznajmo se s projektom i njegovim mogućnostima.
NB: Usput, već smo ukratko govorili o Skaffoldu u našoj generalici pregled razvojnih alata, čiji su životi povezani s Kubernetesom.
Teorija. Namjena i mogućnosti
Dakle, općenito govoreći, Skaffold rješava problem automatizacije CI/CD ciklusa (u fazama izgradnje, guranja, postavljanja), nudeći razvojnom programeru brzu povratnu informaciju, tj. mogućnost brzog primanja rezultata naknadnih promjena koda – u obliku ažurirane aplikacije koja se izvodi u Kubernetes klasteru. I može raditi u različitim krugovima (dev, stage, production...), za koje Skaffold pomaže opisati odgovarajuće cjevovode za uvođenje.
Skaffoldov izvorni kod napisan je u Go, distribuira pod besplatnom licencom Apache 2.0 (GitHub).
Pogledajmo glavne funkcije i značajke. Prvi uključuju sljedeće:
Skaffold nudi alate za stvaranje CI/CD cjevovoda.
Omogućuje praćenje promjena u izvornom kodu u pozadini i pokretanje automatiziranog procesa sastavljanja koda u slike spremnika, objavljivanje tih slika u Docker registru i njihovu implementaciju u Kubernetes klaster.
Sinkronizira datoteke u repozitoriju s radnim direktorijem u spremniku.
Automatski testira pomoću testa strukture spremnika.
Portovi prema naprijed.
Čita zapisnike aplikacije koja se izvodi u spremniku.
Pomaže u otklanjanju pogrešaka u aplikacijama napisanim u Javi, Node.js, Python, Go.
Sada o značajkama:
Sam Skaffold nema komponente na strani klastera. Odnosno, nema potrebe dodatno konfigurirati Kubernetes za korištenje ovog uslužnog programa.
Različiti cjevovodi za vašu aplikaciju. Trebate li razviti kod na lokalnu Minikube dok razvijate, a zatim na pozornicu ili produkciju? U tu svrhu postoje профили i korisničke konfiguracije, varijable okruženja i oznake, koje vam omogućuju da opišete različite cjevovode za jednu aplikaciju.
CLI. Samo uslužni program konzole i konfiguracije u YAML-u. Na internetu možete pronaći reference na pokušaje stvaranja eksperimentalni GUI, međutim, to trenutno najvjerojatnije samo znači da ga netko treba, ali ne baš.
Modularnost. Skaffold nije samostalni kombajn, već nastoji koristiti pojedinačne module ili postojeća rješenja za specifične zadatke.
Ilustracija potonjeg:
U fazi montaže možete koristiti:
docker izgraditi lokalno, u klasteru koristeći kaniko ili u Google Cloud Buildu;
Bazel lokalno;
Jib Maven i Jib Gradle lokalno ili u Google Cloud Buildu;
prilagođene skripte za izgradnju izvode se lokalno. Ako trebate pokrenuti drugo (fleksibilnije/poznatije/...) rješenje za izgradnju, to je opisano u skripti tako da ga Skaffold pokreće (primjer iz dokumentacije). To vam omogućuje korištenje bilo kojeg kolektora koji se može pozvati pomoću skripte;
Zahvaljujući tome, Skaffold se može nazvati jedinstvenim okvir za izgradnju CI/CD. Evo primjera tijeka rada kada ga koristite (iz projektne dokumentacije):
Kako općenito izgleda Skaffoldov rad?
Uslužni program prati promjene u direktoriju izvornog koda. Ako se izmjene izvrše na datotekama, one se sinkroniziraju s podom aplikacije u Kubernetes klasteru. Ako je moguće, bez ponovnog sastavljanja slike. Inače se sastavlja nova slika.
Sastavljena slika se provjerava pomoću testa strukture spremnika, označava i šalje u Docker registar.
Nakon toga, slika se postavlja - postavlja u Kubernetes klaster.
Ako je pokretanje inicijalizirano pomoću naredbe skaffold dev, tada počinjemo primati zapise iz aplikacije, a Skaffold čeka promjene kako bi ponovno ponovio sve radnje.
Ilustracija glavnih faza rada Skaffolda
Praksa. Isprobavanje Skaffolda
Da bih pokazao korištenje Skaffolda, uzet ću primjer iz GitHub repozitorij projekta... Usput, tamo Možete pronaći mnoge druge primjere koji uzimaju u obzir razne specifičnosti. Sve radnje obavljat ću lokalno u Minikubeu. Instalacija je jednostavna i traje nekoliko minuta, a za početak će vam trebati kubectl.
Klonirajmo Skaffoldovo spremište s potrebnim primjerima:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Odabrao sam primjer s dvije mahune, od kojih svaka sadrži jednu malu Go aplikaciju. Jedna aplikacija je frontend (leeroy-web), koji preusmjerava zahtjev na drugu aplikaciju - backend (leeroy-app). Pogledajmo kako to izgleda:
leeroy-app i leeroy-web sadrže Go kod i jednostavne Docker datoteke za lokalnu izradu ovog 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 dati šifru aplikacije - dovoljno je to znati leeroy-web prihvaća zahtjeve i prosljeđuje ih na leeroy-app. Stoga u spisima Deployment.yaml postoji usluga samo za app (za interno usmjeravanje). Pod luka web proslijedit ćemo ga sebi za brzi pristup aplikaciji.
Ovdje su opisane sve gore navedene faze. Osim ove konfiguracije, postoji i datoteka s globalnim postavkama - ~/.skaffold/config. Može se uređivati ručno ili putem CLI-a - na primjer, ovako:
skaffold config set --global local-cluster true
Ova naredba će postaviti globalnu varijablu local-cluster u vrijednosti true, nakon čega Skaffold neće pokušavati gurnuti slike u udaljeni registar. Ako razvijate lokalno, možete koristiti ovu naredbu za lokalno stvaranje slika.
Natrag na skaffold.yaml:
Na pozornici build navodimo da sliku trebate prikupiti i spremiti lokalno. Nakon prvog pokretanja izgradnje, 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.1MB
Kao što vidite, Skaffold je sam označio slike. Usput, podržano je nekoliko pravila označavanja.
Dalje u konfiguraciji je naznačeno context: ./leeroy-app/, tj. određen je kontekst u kojem je slika prikupljena.
U fazi implementacije određeno je da ćemo koristiti kubectl i masku za potrebne manifeste.
PortForward: slično načinu na koji obično prosljeđujemo portove koristeći kubectl port-forward, dajemo upute Skaffoldu da pozove ovu naredbu. U ovom slučaju, lokalni port 9000 prosljeđuje se na 8080 u implementaciji s nazivom leeroy-web.
Vrijeme je za lansiranje skaffold dev: Tim će stvoriti stalnu "petlju povratne informacije", tj. ne samo da će prikupiti sve i rasporediti u klaster, nego će vam također reći o trenutnom stanju podova, pratiti promjene i ažurirati stanje podova.
Evo rezultata lansiranja skaffold dev --port-forward prilikom ponovnog sastavljanja:
Prvo, možete vidjeti da se predmemorija koristi. Zatim se aplikacija sastavlja, postavlja i portovi se prosljeđuju. Budući da je navedeno --port-forward, Skaffold je proslijedio port na web, kako su ga pitali, ali ovdje app bacao je po vlastitom nahođenju (izabrao najbližu slobodnu). Nakon toga dobivamo prve zapisnike iz aplikacija.
Provjerimo radi li?
~/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!!!
Izmjena datoteke 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 isto vrijeme, sam Skaffold je prikazao istu stvar u konzoli kao i prije, s izuzetkom jedne točke: samo se izvukao leeroy-app, a ne sve odjednom.
Više prakse
Također je vrijedno spomenuti da se prilikom kreiranja novog projekta konfiguracije za Skaffold mogu pokrenuti pomoću naredbe init, što je vrlo povoljno. Osim toga, možete napisati nekoliko konfiguracija: izvršiti razvoj na zadanoj konfiguraciji, a zatim je pokrenuti na pozornici s naredbom run (isti postupak kao dev, jednostavno ne prati promjene), koristeći drugu konfiguraciju.
Na katacoda ima rukovodstvo S primjerom je još lakše. Ali nudi gotov sandbox s Kubernetesom, aplikacijom i Skaffoldom. Izvrsna opcija ako želite sami isprobati same osnove.
Jedan mogući slučaj upotrebe za Skaffold je provođenje razvoja na udaljenom klasteru. Nije svima ugodno pokrenuti Minikube na vlastitom hardveru, zatim izbaciti aplikaciju i očekivati da će ispravno funkcionirati... U ovom slučaju Skaffold savršeno rješava problem, što mogu potvrditi, primjerice, inženjeri Reddita, kao što imamo već raspravljano писали u našem blogu.
I u ova publikacija iz Weaveworksa možete pronaći primjer stvaranja cjevovoda za proizvodnju.
Zaključak
Skaffold je prikladan alat za izgradnju cjevovoda koji uključuju uvođenje aplikacija u Kubernetes i prvenstveno su usmjereni na razvojne potrebe. To olakšava stvaranje "kratkog" cjevovoda koji uzima u obzir osnovne potrebe programera, ali ako želite, možete organizirati veće procese. Kao jedan od jasnih primjera korištenja Skaffolda u CI/CD procesima je dano takav ispitni projekt od 10 mikroservisa koji koriste mogućnosti Kubernetes, gRPC, Istio i OpenCensus Tracing.
Skaffold već ima gotovo 8000+ zvjezdica na GitHubu, razvio ga je Google i dio je Google ContainerTools — općenito, u ovom trenutku postoje svi razlozi za vjerovanje da će se projekt razvijati sretno do kraja života.