Přehled Skaffold pro vývoj pod Kubernetes

Přehled Skaffold pro vývoj pod Kubernetes

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 Skaffold, 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 přehledu nástrojů pro vývojáře, 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, distribuováno 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 profily 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í experimentálního GUI, 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 (Když je pořadí vyhodnocení důležité, lze ho určit pomocí konstrukce). 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á container-structure-test;
  • 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):

Přehled Skaffold pro vývoj pod Kubernetes

Jak v obecnosti vypadá práce se Skaffoldem?

  1. 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.
  2. Sestavený obraz je ověřen pomocí container-structure-test, označen a odeslán do Docker Registry.
  3. Poté se obraz nasazuje — rozkládá v Kubernetes clusteru.
  4. 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.

Přehled Skaffold pro vývoj pod Kubernetes
Ilustrace hlavních etap práce s Skaffoldem

Praxe. Zkoušíme Skaffold

Pro demonstraci použití Skaffoldu vezmu příklad z GitHub repozitáře projektu. Mimochodem, tamtéž 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.1

Zklonujeme si repozitář Skaffold s potřebnými příklady:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Vybral 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 build uvá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.1MB

    Jak 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ázvem leeroy-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:

Přehled Skaffold pro vývoj pod Kubernetes

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 průvodce 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ž psali najít na našem blogu.

A v tento příspěvek 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 se uvádí takový testovací projekt 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í GoogleContainerTools — 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster