Před rokem a půl, 5. března 2018, Google vydal první alfa verzi svého Open Source projektu pro CI/CD s názvem Skaffold, jejímž cílem bylo vytvořit „jednoduchý a opakovatelný vývoj Kubernetes“, aby se vývojáři mohli soustředit spíše na vývoj než na administraci. Co může být na Skaffold zajímavé? Jak se ukázalo, má v rukávu několik triků, které z něj mohou udělat silný nástroj pro vývojáře a možná i provozního inženýra. Pojďme se seznámit s projektem a jeho možnostmi.
NB: Mimochodem, o Skaffoldu jsme již krátce mluvili v naší generálce recenze vývojářských nástrojů, jehož životy jsou spjaty s Kubernetes.
Teorie. Účel a schopnosti
Takže obecně řečeno, Skaffold řeší problém automatizace cyklu CI/CD (ve fázi build, push, deploy) a nabízí vývojářům okamžitou zpětnou vazbu, tzn. možnost rychle získat výsledek následných změn kódu – v podobě aktualizované aplikace běžící v clusteru Kubernetes. A může fungovat v různých okruzích (vývoj, scéna, produkce...), pro které Skaffold pomáhá popsat odpovídající pipelines pro rollout.
Zdrojový kód Skaffoldu je napsán v Go, distribuovány pod bezplatnou licencí Apache 2.0 (GitHub).
Podívejme se na hlavní funkce a vlastnosti. Mezi první patří následující:
Skaffold nabízí nástroje pro vytváření CI/CD potrubí.
Umožňuje sledovat změny ve zdrojovém kódu na pozadí a spustit automatizovaný proces sestavování kódu do bitových kopií kontejnerů, publikování těchto obrázků v registru Docker a jejich nasazení do clusteru Kubernetes.
Synchronizuje soubory v úložišti s pracovním adresářem v kontejneru.
Automaticky testuje pomocí kontejner-struktura-test.
Dopředné porty.
Čte protokoly aplikace spuštěné v kontejneru.
Pomáhá při ladění aplikací napsaných v Javě, Node.js, Pythonu, Go.
Nyní o funkcích:
Skaffold sám o sobě nemá žádné komponenty na straně clusteru. To znamená, že není potřeba dále konfigurovat Kubernetes pro použití tohoto nástroje.
Různé potrubí pro vaši aplikaci. Potřebujete zavést kód do místního Minikube během vývoje a poté do fáze nebo produkce? Pro tento účel existují Profily a uživatelské konfigurace, proměnné prostředí a příznaky, které umožňují popisovat různé kanály pro jednu aplikaci.
CLI. Pouze konzolový nástroj a konfigurace v YAML. Na internetu můžete najít odkazy na pokusy o vytvoření experimentální GUI, ale v tuto chvíli to nejspíš znamená jen to, že ho někdo potřebuje, ale ne ve skutečnosti.
Modularita. Skaffold není samostatný harvestor, ale snaží se využívat jednotlivé moduly nebo stávající řešení pro konkrétní úkoly.
Ilustrace posledně jmenovaného:
Ve fázi montáže můžete použít:
sestavení dockeru lokálně, v clusteru pomocí kaniko nebo v Google Cloud Build;
Bazel místně;
Jib Maven a Jib Gradle lokálně nebo ve službě Google Cloud Build;
vlastní skripty sestavení běží lokálně. Pokud potřebujete spustit jiné (flexibilnější/známější/...) řešení sestavování, je popsáno ve skriptu, aby ho Skaffold spustil (příklad z dokumentace). To vám umožňuje používat jakýkoli kolektor, který lze volat pomocí skriptu;
Díky tomu lze Skaffold označit za unikát framework pro vytváření CI/CD. Zde je příklad pracovního postupu při jeho použití (z projektové dokumentace):
Jak obecně vypadá Skaffoldova tvorba?
Obslužný program sleduje změny v adresáři zdrojového kódu. Pokud jsou v souborech provedeny úpravy, synchronizují se s aplikačním modulem v clusteru Kubernetes. Pokud možno bez opětovného skládání obrazu. V opačném případě se sestaví nový obrázek.
Sestavený obraz je zkontrolován pomocí testu kontejnerové struktury, označen a odeslán do registru Docker.
Poté je image nasazena – nasazena v clusteru Kubernetes.
Pokud bylo spuštění inicializováno pomocí příkazu skaffold dev, poté začneme přijímat protokoly z aplikace a Skaffold čeká na změny, aby se všechny akce znovu opakovaly.
Ilustrace hlavních fází provozu skaffoldu
Praxe. Zkouším Skaffold
Abych demonstroval použití Skaffoldu, vezmu si příklad z Úložiště projektu GitHub... Mimochodem, na stejném místě Můžete najít mnoho dalších příkladů, které zohledňují různá specifika. Všechny akce provedu lokálně v Minikube. Instalace je jednoduchá a zabere pár minut a pro začátek budete potřebovat kubectl.
Pojďme naklonovat úložiště Skaffold s nezbytnými příklady:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices
Vybral jsem příklad se dvěma moduly, z nichž každý obsahuje jednu malou aplikaci Go. Jedna aplikace je frontend (leeroy-web), který přesměruje požadavek na druhou aplikaci – backend (leeroy-app). Podívejme se, jak to vypadá:
leeroy-app a leeroy-web obsahují kód Go a jednoduché soubory Dockerfiles pro místní vytvoření tohoto kódu:
~/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 .
Neposkytnu kód aplikace - stačí to vědět leeroy-web přijímá žádosti a zastupuje je leeroy-app. Proto v souborech Deployment.yaml existuje služba pouze pro app (pro vnitřní směrování). Pod port web přepošleme si jej pro rychlý přístup k aplikaci.
Zde jsou popsány všechny výše uvedené fáze. Kromě této konfigurace existuje také soubor s globálním nastavením - ~/.skaffold/config. Lze jej upravit ručně nebo přes CLI – například takto:
skaffold config set --global local-cluster true
Tento příkaz nastaví globální proměnnou local-cluster do smyslu true, po kterém se Skaffold nebude pokoušet poslat obrázky do vzdáleného registru. Pokud vyvíjíte lokálně, můžete tento příkaz použít k vytvoření obrázků lokálně.
Zpět k skaffold.yaml:
Na pódiu build specifikujeme, že musíte shromáždit a uložit obrázek lokálně. Po prvním spuštění sestavení uvidíme následující:
// т.к. 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
Jak můžete vidět, Skaffold obrázky označil sám. Mimochodem, je podporováno několik zásad označování.
Dále v konfiguraci je to uvedeno context: ./leeroy-app/, tj. je specifikován kontext, ve kterém je obrázek shromažďován.
Ve fázi nasazení je rozhodnuto, že pro potřebné manifesty použijeme kubectl a masku.
PortForward: podobně jako obvykle přesměrováváme porty pomocí kubectl port-forward, dáváme Skaffoldovi instrukce, aby zavolal tento příkaz. V tomto případě je místní port 9000 přesměrován na 8080 v Deployment s názvem leeroy-web.
Je čas spustit skaffold dev: Tým vytvoří průběžnou „smyčku zpětné vazby“, tzn. nejen že vše shromáždí a nasadí do clusteru, ale také vám řekne o aktuálním stavu modulů, bude sledovat změny a aktualizovat stav modulů.
Zde je výsledek spuštění skaffold dev --port-forward při opětovné montáži:
Nejprve můžete vidět, že se cache používá. Dále je aplikace sestavena, nasazena a porty jsou předány. Od zadané --port-forwardSkafold přeposlal port na web, jak byl požádán, ale zde app hodil podle vlastního uvážení (zvol si nejbližší volnou). Poté obdržíme první protokoly z aplikací.
Zkontrolujeme, jestli 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 souboru leeroy-app/app.go - uplyne pár sekund... 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!!!
Samotný Skaffold přitom v konzoli zobrazoval to samé jako předtím, s výjimkou jednoho bodu: pouze se vyroloval leeroy-appa ne všechny najednou.
Více praxe
Za zmínku také stojí, že při vytváření nového projektu lze konfigurace pro Skaffold zavést pomocí příkazu init, což je velmi pohodlné. Kromě toho můžete napsat několik konfigurací: proveďte vývoj na výchozí konfiguraci a poté přejděte do fáze pomocí příkazu run (stejný postup jako dev, prostě nesleduje změny), pomocí jiné konfigurace.
Na katacodě je průvodce S příkladem je to ještě jednodušší. Nabízí ale hotový sandbox s Kubernetes, aplikací a Skaffoldem. Skvělá volba, pokud si chcete sami vyzkoušet samé základy.
Jedním z možných případů použití pro Skaffold je provádění vývoje na vzdáleném clusteru. Ne každému vyhovuje provozovat Minikube na vlastním hardwaru, poté aplikaci rozjet a očekávat, že bude adekvátně fungovat... V tomto případě Skaffold problém řeší perfektně, což mohou potvrdit například inženýři z Redditu, jak máme my již projednáno писали v našem blogu.
A v této publikace od Weaveworks můžete najít příklad vytvoření potrubí pro výrobu.
Závěr
Skaffold je pohodlný nástroj pro vytváření kanálů, které zahrnují zavádění aplikací do Kubernetes a jsou primárně zaměřeny na potřeby vývoje. Umožňuje poměrně snadno vytvořit „krátký“ kanál, který zohledňuje základní potřeby vývojáře, ale v případě potřeby můžete organizovat větší procesy. Jako jeden z jasných příkladů použití Skaffold v procesech CI/CD je dáno takový zkušební projekt 10 mikroslužeb využívajících možnosti Kubernetes, gRPC, Istio a OpenCensus Tracing.
Skaffold již má na GitHubu téměř 8000+ hvězdiček, je vyvinut společností Google a je součástí GoogleContainerTools — obecně lze v tuto chvíli věřit, že se projekt bude šťastně vyvíjet až do smrti.