
Před jeden a půl rokem, 5. března 2018, společnost Google vydala první alfa verzi svého Open Source projektu pro CI/CD nazvaného , jehož cílem bylo vytvořit "jednoduchý a reprodukovatelný vývoj pod Kubernetes", aby se vývojáři mohli soustředit na samotný vývoj a ne na administraci. Čím je Skaffold zajímavý? Jak se zdá, má několik trumfů v rukávu, díky nimž se může stát silným nástrojem pro vývojáře, a možná i pro provozního inženýra. Seznámíme se s projektem a jeho možnostmi.
NB: Mimochodem, již jsme stručně hovořili o Skaffold v našem obecném , jejichž životy souvisejí s Kubernetes.
Teorie. Účel a možnosti
Takže, pokud to shrneme, Skaffold řeší problém automatizace CI/CD cyklu (v fázích build, push, deploy), nabízející vývojáři okamžitou zpětnou vazbu, tj. možnost rychle získat výsledek posledních změn kódu - ve formě aktualizované aplikace běžící v Kubernetes clusteru. A může fungovat v různých prostředích (dev, stage, production…), pro které Skaffold pomáhá popsat odpovídající pipeline pro nasazení.
Zdrojový kód Skaffold je napsán v jazyce Go, na podmínkách svobodné licence Apache License 2.0 (GitHub).
Pojďme prozkoumat hlavní funkce a vlastnosti. Mezi první lze zařadit následující:
- Skaffold nabízí nástroje pro vytváření CI/CD pipeline.
- Umožňuje na pozadí sledovat změny v zdrojovém kódu a spouštět automatizovaný proces sestavování kódu do kontejnerových obrazů, publikace těchto obrazů do Docker Registry a jejich nasazení do Kubernetes clusteru.
- Synchronizuje soubory v repozitáři s pracovním adresářem v kontejneru.
- Automaticky testuje pomocí container-structure-test.
- Přenáší porty.
- Čte logy aplikace běžící v kontejneru.
- Pomáhá při ladění aplikací napsaných v Java, Node.js, Python, Go.
Nyní - o vlastnostech:
- Sám Skaffold nemá komponenty na straně clusteru. To znamená, že není třeba dodatečně konfigurovat Kubernetes pro použití tohoto nástroje.
- Různé pipeline pro vaši aplikaci. Musíte nasazovat kód do lokálního Minikube, zatímco vyvíjíte, a poté - na stage nebo production? Pro to jsou zde zajištěny a uživatelské konfigurace, proměnné prostředí a příznaky, které umožňují popisovat různé pipeline pro jednu aplikaci.
- CLI. Pouze konzolová utilita a konfigurace v YAML. V síti lze nalézt zmínky o pokusech o vytvoření , ale prozatím to spíše naznačuje, že je po něm poptávka, ale není to příliš reálné.
- Modularita. Skaffold není samostatný nástroj, ale snaží se používat jednotlivé moduly nebo již existující řešení pro konkrétní úkoly.
Ilustrace posledního:
- V fázi sestavení je možné použít:
- docker build lokálně, v clusteru pomocí kaniko nebo v Google Cloud Build;
- Bazel lokálně;
- Jib Maven a Jib Gradle lokálně nebo v Google Cloud Build;
- vlastní build skripty, spouštěné lokálně. Pokud potřebujete spouštět jiné (flexibilnější / známější /…) řešení pro sestavení, je popsáno ve skriptu, aby Skaffold spouštěl právě to (). To umožňuje používat v podstatě jakýkoli sestavovač, který lze vyvolat pomocí skriptu;
- V fázi testování je podporovaná již zmíněná ;
- Pro nasazení jsou k dispozici:
- Kubectl;
- Helm;
- kustomize.
Díky tomu lze Skaffold nazvat jakýmsi frameworkem pro CI/CD. Zde je příklad pracovního postupu při jeho používání (z dokumentace projektu):

Jak v obecnosti vypadá práce se Skaffoldem?
- Nástroj sleduje změny v adresáři se zdrojovým kódem. Pokud jsou provedeny úpravy v souborech, synchronizují se s pod'em aplikace v Kubernetes clusteru. Pokud je to možné — bez opětovného sestavení obrazu. Jinak se sestaví nový obraz.
- Sestavený obraz je ověřen pomocí container-structure-test, označen a odeslán do Docker Registry.
- Poté se obraz nasazuje — rozkládá v Kubernetes clusteru.
- Pokud byla akce inicializována pomocí příkazu
skaffold dev, začneme dostávat logy z aplikace a Skaffold očekává změny, aby opakoval všechny akce znovu.

Ilustrace hlavních etap práce s Skaffoldem
Praxe. Zkoušíme Skaffold
Pro demonstraci použití Skaffoldu vezmu příklad z . Mimochodem, můžete najít také mnoho dalších příkladů, které zohledňují různé specifikace. Všechny akce provedu lokálně v Minikube. Instalace je jednoduchá a zabere několik minut, a pro zahájení práce bude potřeba kubectl.
Nainstalujeme 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.1Zklonujeme si repozitář Skaffold s potřebnými příklady:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesVybral jsem si příklad se dvěma pody, z nichž každý obsahuje jednu malou aplikaci napsanou v Go. Jedna aplikace je frontend (leeroy-web), která přesměrovává požadavek na druhou aplikaci, což je backend (leeroy-app). Podívejme se, jak to vypadá:
~/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 adresáře, 8 souborůleeroy-app a leeroy-web obsahují kód napsaný v Go a jednoduché Dockerfiles pro lokální sestavení 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 . Kód aplikací zde uvádět nebudu — stačí vědět, že leeroy-web přijímá požadavky a přesměrovává je na leeroy-app. Proto v souborech Deployment.yaml existuje služba pouze pro app (pro vnitřní směrování). Port podu web budeme pro rychlý přístup k aplikaci směrovat.
Jak vypadá 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 Zde jsou popsány všechny fáze zmíněné výše. Kromě této konfigurace existuje také soubor s globálními nastaveními — ~/ .skaffold/config. Ten lze editovat ručně nebo pomocí CLI — například takto:
skaffold config set --global local-cluster true Tento příkaz nastaví globální proměnnou local-cluster na hodnotu true, po čemž Skaffold nebude mít snahu 'push' obrazů do vzdáleného registru. Pokud vyvíjíte lokálně, můžete použít tento příkaz k ukládání obrazů také lokálně.
Vrátíme se k skaffold.yaml:
- V fázi
builduvádíme, že máme sestavit a uložit obraz 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.1MBJak je vidět, Skaffold automaticky označil obrazy. Mimochodem, podporuje několik politik označování.
- Dále je v konfiguraci uvedeno
context: ./leeroy-app/, tedy je nastaven kontext, ve kterém bude obraz sestaven. - Ve fázi nasazení se určuje, že použijeme kubectl a filtr pro potřebné manifesty.
-
PortForward: podobně jako obvykle propouštíme porty pomocíkubectl port-forward, dáváme Skaffoldu pokyny pro volání tohoto příkazu. V tomto případě je místní port 9000 směrován na 8080 v Deploymentu s názvemleeroy-web.
Je čas spustit skaffold dev: příkaz vytvoří trvající "zpětnou vazbu", tj. nejen shromáždí vše a nasadí do clustera, ale také informuje o stavu podů v daném okamžiku, sleduje změny a aktualizuje stav podů.
Zde je výsledek spuštění skaffold dev --port-forward při opětovné kompilaci:

Za prvé, je vidět, že se používá cache. Dále se aplikace vytváří, nasazuje a porty se propouštějí. Protože je uvedeno --port-forward, Skaffold propustil port na web, jak bylo požadováno, ale app to propustil podle svého uvážení (vybral nejbližší volný). Po tom dostáváme první logy od aplikací.
Otestujeme funkčnost?
~\/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!!! Modifikujeme soubor leeroy-app\/app.go — uběhne několik 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!!! Přitom samotný Skaffold vypsal do konzole to samé, co dříve, s výjimkou jedné věci: vypsal pouze leeroy-app, a ne vše najednou.
Více praxe
Je třeba zmínit, že při vytváření nového projektu lze konfigurace pro Skaffold "bootstrap" pomocí příkazu init, což je velmi pohodlné. Kromě toho lze napsat několik konfigurací: vyvíjet na výchozí konfiguraci a poté se přepnout na stage příkazem run (stejný proces jako dev, jen nesleduje změny), využívající jinou konfiguraci.
Na katacoda je s příkladem ještě jednodušším. Nabízí hotový pískoviště s Kubernetes, aplikací a Skaffold. Skvělá volba, pokud chcete vyzkoušet základy samostatně.
Jednou z možných variant použití Skaffold je vývoj na vzdáleném clusteru. Ne každému vyhovuje spouštět Minikube na vlastním hardwaru, poté nasazovat aplikaci a čekat, až začne fungovat korektně… V takovém případě Skaffold skvěle řeší daný úkol, což mohou potvrdit například inženýři z Redditu, o čemž jsme již najít na našem blogu.
A v od Weaveworks můžete nalézt příklad vytvoření pipeline pro produkci.
Závěr
Skaffold je užitečný nástroj pro budování pipeline, které zahrnují nasazení aplikací do Kubernetes a jsou primárně zaměřené na potřeby vývoje. S ním je poměrně snadné vytvořit "krátkou" pipeline, která zohledňuje základní potřeby vývojáře, ale pokud si to přejete, můžete organizovat i rozsáhlejší procesy. Jako jeden z názorných příkladů použití Skaffold v CI/CD procesech takový s 10 mikroslužbami, které využívají možnosti Kubernetes, gRPC, Istio a OpenCensus Tracing.
Skaffold již získal téměř 8000+ hvězdiček na GitHubu, je vyvíjen Googlem a je součástí — celkově, v tuto chvíli existují všechny důvody věřit, že projekt se bude rozvíjet dlouho a šťastně.
P.S.
Přečtěte si také náš blog:
- «»;
- «»;
- «»;
- «».
Zdroj: habr.com
