Pred rokom a pol, 5. marca 2018, Google vydal prvú alfa verziu svojho Open Source projektu pre CI/CD s názvom Skaffold, ktorej cieľom bolo vytvoriť „jednoduchý a opakovateľný vývoj Kubernetes“, aby sa vývojári mohli sústrediť skôr na vývoj ako na administratívu. Čo môže byť na Skaffold zaujímavé? Ako sa ukázalo, má v rukáve niekoľko trikov, ktoré z neho môžu urobiť silný nástroj pre vývojárov a možno aj prevádzkových inžinierov. Zoznámime sa s projektom a jeho možnosťami.
NB: Mimochodom, o Skaffolde sme už krátko hovorili v našej generálke prehľad nástrojov pre vývojárov, ktorých životy sú spojené s Kubernetes.
teória. Účel a schopnosti
Vo všeobecnosti teda Skaffold rieši problém automatizácie cyklu CI/CD (vo fázach zostavenia, nasadenia, nasadenia) a ponúka vývojárom rýchlu spätnú väzbu, t.j. možnosť rýchleho prijatia výsledku následných zmien kódu – vo forme aktualizovanej aplikácie spustenej v klastri Kubernetes. A môže fungovať v rôznych okruhoch (vývoj, javisko, produkcia...), pre ktoré Skaffold pomáha opísať zodpovedajúce potrubia na uvedenie do prevádzky.
Zdrojový kód Skaffoldu je napísaný v Go, distribuovaný pod bezplatnou licenciou Apache 2.0 (GitHub).
Pozrime sa na hlavné funkcie a vlastnosti. Prvý zahŕňa nasledujúce:
Skaffold ponúka nástroje na vytváranie CI/CD potrubí.
Umožňuje sledovať zmeny v zdrojovom kóde na pozadí a spustiť automatizovaný proces zostavovania kódu do obrázkov kontajnerov, publikovanie týchto obrázkov v registri Docker a ich nasadenie do klastra Kubernetes.
Synchronizuje súbory v úložisku s pracovným adresárom v kontajneri.
Automaticky testuje pomocou kontajnerového-štruktúrneho-testu.
Dopredné porty.
Číta denníky aplikácie spustenej v kontajneri.
Pomáha pri ladení aplikácií napísaných v jazyku Java, Node.js, Python, Go.
Teraz o vlastnostiach:
Samotný Skaffold nemá žiadne komponenty na strane klastra. To znamená, že na používanie tohto nástroja nie je potrebné ďalej konfigurovať Kubernetes.
Rôzne potrubia pre vašu aplikáciu. Potrebujete zaviesť kód do miestneho Minikube počas vývoja a potom na scénu alebo produkciu? Na tento účel existujú профили a používateľské konfigurácie, premenné prostredia a príznaky, ktoré vám umožňujú popísať rôzne kanály pre jednu aplikáciu.
CLI. Iba konzola a konfigurácie v YAML. Na internete nájdete odkazy na pokusy o vytvorenie experimentálne GUI, ale momentálne to s najväčšou pravdepodobnosťou znamená, že ho niekto potrebuje, ale nie v skutočnosti.
Modularita. Skaffold nie je samostatný harvestor, ale snaží sa využiť jednotlivé moduly alebo existujúce riešenia pre špecifické úlohy.
Ilustrácia toho posledného:
Vo fáze montáže môžete použiť:
docker zostaviť lokálne, v klastri pomocou kaniko alebo v Google Cloud Build;
Bazel lokálne;
Jib Maven a Jib Gradle lokálne alebo v službe Google Cloud Build;
vlastné zostavovacie skripty sa spúšťajú lokálne. Ak potrebujete spustiť iné (flexibilnejšie/známejšie/...) riešenie zostavovania, je to popísané v skripte, aby ho Skaffold spustil (príklad z dokumentácie). To vám umožňuje použiť ľubovoľný kolektor, ktorý možno zavolať pomocou skriptu;
Vďaka tomu možno Skaffold nazvať unikátom rámec pre budovanie CI/CD. Tu je príklad pracovného postupu pri jeho použití (z projektovej dokumentácie):
Ako vyzerá Skaffoldova tvorba vo všeobecnosti?
Pomocný program monitoruje zmeny v adresári zdrojového kódu. Ak sa v súboroch vykonajú úpravy, zosynchronizujú sa s aplikačným modulom v klastri Kubernetes. Ak je to možné, bez opätovného zostavenia obrazu. V opačnom prípade sa zostaví nový obrázok.
Zostavený obrázok sa skontroluje pomocou testu kontajnerovej štruktúry, označí sa a odošle do registra Docker.
Potom je obraz nasadený - nasadený v klastri Kubernetes.
Ak bolo spustenie inicializované pomocou príkazu skaffold dev, potom začneme dostávať protokoly z aplikácie a Skaffold čaká na zmeny, aby sa znova zopakovali všetky akcie.
Ilustrácia hlavných fáz prevádzky skaffoldu
Prax. Skúšam Skaffold
Na demonštráciu použitia Skaffoldu uvediem príklad z Projektové úložisko GitHub. Mimochodom, tam Môžete nájsť mnoho ďalších príkladov, ktoré zohľadňujú rôzne špecifiká. Všetky úkony vykonám lokálne v Minikube. Inštalácia je jednoduchá a trvá niekoľko minút a na spustenie budete potrebovať kubectl.
Poďme naklonovať úložisko Skaffold s potrebnými príkladmi:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Vybral som si príklad s dvoma modulmi, z ktorých každý obsahuje jednu malú aplikáciu Go. Jedna aplikácia je frontend (leeroy-web), ktorý presmeruje požiadavku na druhú aplikáciu – backend (leeroy-app). Pozrime sa, ako to vyzerá:
leeroy-app a leeroy-web obsahujú kód Go a jednoduché súbory Dockerfiles na vytvorenie tohto kódu lokálne:
~/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 .
Neposkytnem kód aplikácie - stačí to vedieť leeroy-web prijíma žiadosti a zastupuje ich leeroy-app. Preto v súboroch Deployment.yaml existuje služba len pre app (pre interné smerovanie). Pod port web prepošleme si ho pre rýchly prístup k aplikácii.
Všetky vyššie uvedené fázy sú popísané tu. Okrem tejto konfigurácie existuje aj súbor s globálnymi nastaveniami - ~/.skaffold/config. Dá sa upraviť ručne alebo cez CLI – napríklad takto:
skaffold config set --global local-cluster true
Tento príkaz nastaví globálnu premennú local-cluster do významu true, po ktorom sa Skaffold nebude pokúšať tlačiť obrázky do vzdialeného registra. Ak vyvíjate lokálne, môžete tento príkaz použiť na lokálne vytváranie obrazov.
Späť k skaffold.yaml:
Na pódiu build špecifikujeme, že musíte zhromaždiť a uložiť obrázok lokálne. Po prvom spustení zostavy uvidíme nasledovné:
// т.к. 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
Ako môžete vidieť, Skaffold označil obrázky sám. Mimochodom, je podporovaných niekoľko zásad označovania.
Ďalej v konfigurácii je to uvedené context: ./leeroy-app/, t.j. špecifikuje sa kontext, v ktorom je obrázok zhromaždený.
Vo fáze nasadenia je rozhodnuté, že na potrebné manifesty použijeme kubectl a masku.
PortForward: podobne ako zvyčajne posielame porty pomocou kubectl port-forward, dávame pokyny Skaffoldovi, aby zavolal tento príkaz. V tomto prípade je miestny port 9000 presmerovaný na 8080 v nasadení s názvom leeroy-web.
Je čas spustiť skaffold dev: Tím vytvorí priebežnú “spätnú väzbu”, t.j. nielenže všetko zhromaždí a nasadí do klastra, ale tiež vám povie o aktuálnom stave modulov, bude sledovať zmeny a aktualizovať stav modulov.
Tu je výsledok spustenia skaffold dev --port-forward pri opätovnej montáži:
Po prvé, môžete vidieť, že sa používa vyrovnávacia pamäť. Ďalej sa aplikácia zostaví, nasadí a porty sa preposielajú. Od zadania --port-forward, Skaffold preposlal port na web, ako sa ho pýtali, ale tu app hodil podľa vlastného uváženia (vybral si najbližšieho voľného). Potom dostaneme prvé protokoly z aplikácií.
Skontrolujeme, či to funguje?
~/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!!!
Úprava súboru leeroy-app/app.go - prejde pár sekúnd... a:
~/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!!!
Zároveň samotný Skaffold zobrazoval v konzole to isté ako predtým, s výnimkou jedného bodu: iba sa vyroloval leeroy-appa nie všetko naraz.
Viac praxe
Za zmienku tiež stojí, že pri vytváraní nového projektu je možné zaviesť konfigurácie pre Skaffold pomocou príkazu init, čo je veľmi pohodlné. Okrem toho môžete napísať niekoľko konfigurácií: vykonajte vývoj na predvolenej konfigurácii a potom prejdite do fázy pomocou príkazu run (rovnaký postup ako dev, jednoducho nesleduje zmeny) pomocou inej konfigurácie.
Na katacode je sprievodca S príkladom je to ešte jednoduchšie. Ponúka ale hotový sandbox s Kubernetes, aplikáciou a Skaffoldom. Skvelá možnosť, ak si chcete sami vyskúšať úplne základy.
Jedným z možných prípadov použitia pre Skaffold je vykonávanie vývoja na vzdialenom klastri. Nie každému vyhovuje spustiť Minikube na vlastnom hardvéri, následne spustiť aplikáciu a očakávať, že bude adekvátne fungovať... Skaffold v tomto prípade problém rieši perfektne, čo môžu potvrdiť napríklad inžinieri z Redditu, ako máme my už diskutované писали v našom blogu.
A v túto publikáciu od Weaveworks môžete nájsť príklad vytvorenia potrubia pre výrobu.
Záver
Skaffold je pohodlný nástroj na vytváranie potrubí, ktoré zahŕňajú zavádzanie aplikácií do Kubernetes a sú primárne zamerané na potreby vývoja. Je celkom jednoduché vytvoriť „krátky“ kanál, ktorý zohľadňuje základné potreby vývojára, ale ak chcete, môžete organizovať väčšie procesy. Ako jeden z jasných príkladov použitia Skaffold v CI/CD procesoch je dané taký skúšobný projekt 10 mikroslužieb využívajúcich možnosti Kubernetes, gRPC, Istio a OpenCensus Tracing.
Skaffold už má na GitHub takmer 8000+ hviezd, vyvíja ho Google a je súčasťou GoogleContainerTools — vo všeobecnosti v súčasnosti existujú všetky dôvody domnievať sa, že projekt sa bude šťastne rozvíjať až do smrti.