Recenzia Skaffold pre vývoj Kubernetes

Recenzia Skaffold pre vývoj Kubernetes

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 štádiu testovania už spomínané kontajner-konštrukcia-test;
  • Pre nasadenie sú k dispozícii nasledovné:
    • Kubectl;
    • Helma;
    • prispôsobiť.

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

Recenzia Skaffold pre vývoj Kubernetes

Ako vyzerá Skaffoldova tvorba vo všeobecnosti?

  1. 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.
  2. Zostavený obrázok sa skontroluje pomocou testu kontajnerovej štruktúry, označí sa a odošle do registra Docker.
  3. Potom je obraz nasadený - nasadený v klastri Kubernetes.
  4. 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.

Recenzia Skaffold pre vývoj Kubernetes
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.

Nainštalujte 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

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

~/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é 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.

Ako to vyzerá 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

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:

Recenzia Skaffold pre vývoj Kubernetes

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.

PS

Prečítajte si aj na našom blogu:

Zdroj: hab.com

Pridať komentár