Recenze Skaffold pro vývoj Kubernetes

Recenze Skaffold pro vývoj Kubernetes

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;
  • Ve fázi testování již zmíněné kontejner-struktura-test;
  • Pro nasazení jsou k dispozici následující:
    • Kubectl;
    • Kormidlo;
    • přizpůsobit.

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):

Recenze Skaffold pro vývoj Kubernetes

Jak obecně vypadá Skaffoldova tvorba?

  1. 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.
  2. Sestavený obraz je zkontrolován pomocí testu kontejnerové struktury, označen a odeslán do registru Docker.
  3. Poté je image nasazena – nasazena v clusteru Kubernetes.
  4. 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.

Recenze Skaffold pro vývoj Kubernetes
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.

Nainstalujte 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.1

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á:

~/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 directories, 8 files

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.

Vypadá to 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 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:

Recenze Skaffold pro vývoj Kubernetes

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.

PS

Přečtěte si také na našem blogu:

Zdroj: www.habr.com

Přidat komentář