Pregled Skaffold-a za razvoj pod Kubernetes-om

Pregled Skaffold-a za razvoj pod Kubernetes-om

Prije petnaest mjeseci, 5. ožujka 2018., tvrtka Google je objavila prvu alfa verziju svog Open Source projekta za CI/CD pod nazivom Skaffold, čija je svrha bila izrada "jednostavnog i ponovljivog razvoja pod Kubernetesom", kako bi se programeri mogli usredotočiti na razvoj, a ne na administraciju. Što čini Skaffold zanimljivim? Kao što se pokazalo, ima nekoliko aduta u rukavu koji ga mogu učiniti snažnim alatom za programere, a možda i za inženjere održavanja. Upoznajmo projekt i njegove mogućnosti.

NB: Usput, već smo ukratko pričali o Skaffoldu u našem općem pregledu alata za programere, čiji je život povezan s Kubernetesom.

Teorija. Svrha i mogućnosti

Dakle, ako govorimo općenito, Skaffold rješava problem automatizacije CI/CD ciklusa (u fazama build, push, deploy), nudeći programeru brzu povratnu informaciju, tj. mogućnost brzog dobivanja rezultata posljednjih promjena u kodu — u obliku ažurirane aplikacije koja radi u Kubernetes klasteru. A to može raditi u različitim okruženjima (dev, stage, production…), za što Skaffold pomaže u opisivanju odgovarajućih pipeline-a za implementaciju.

Izvorni kod Skaffolda napisan je na jeziku Go, distribuira se pod slobodnom licencom Apache License 2.0 (GitHub).

Pogledajmo glavne funkcije i karakteristike. Prve se mogu izdvojiti:

  • Skaffold nudi alate za izradu CI/CD pipeline-a.
  • Omogućuje u pozadini praćenje promjena u izvornoj šifri i pokretanje automatiziranog procesa izgradnje koda u slike kontejnera, objavljivanje tih slika u Docker Registry i njihovu implementaciju u Kubernetes klaster.
  • Sinkronizira datoteke u repozitoriju s radnim direktorijem u kontejneru.
  • Automatski testira pomoću container-structure-test.
  • Prosljeđuje portove.
  • Čita logove aplikacije pokrenute u kontejneru.
  • Pomaže u debagiranju aplikacija napisanih u Javi, Node.js, Pythonu, Go.

Sada — o značajkama:

  • Sama Skaffold nema komponente na strani klastera. To jest, nije potrebno dodatno konfigurirati Kubernetes za korištenje ove alate.
  • Različiti pipeline-i za vašu aplikaciju. Trebate implementirati kod u lokalni Minikube dok razvijate, a zatim — na stage ili production? Za to su predviđeni profili i korisničke konfiguracije, varijable okruženja i zastavice koje omogućuju opisivanje različitih pipelineova za jednu aplikaciju.
  • CLI. Samo konzolna alatka i konfiguracije u YAML formatu. Na mreži možete pronaći spominjanje pokušaja izrade eksperimentalnog GUI-a, međutim, trenutno to više znači da je nekome potreban, ali ne previše.
  • Modularnost. Skaffold nije samostalni kombajn, već teži korištenju zasebnih modula ili već postojećih rješenja za specifične zadatke.

Ilustracija posljednjeg:

  • U fazi gradnje može se koristiti:
    • docker build lokalno, u klasteru putem kaniko ili u Google Cloud Build;
    • Bazel lokalno;
    • Jib Maven i Jib Gradle lokalno ili u Google Cloud Build;
    • prilagođene build-skripte koje se pokreću lokalno. Ako trebate pokrenuti drugo (fleksibilnije/poznatije/…) rješenje za gradnju, ono se opisuje u skripti kako bi Skaffold pokrenuo baš to (primjer iz dokumentacije). To omogućava korištenje bilo kojeg graditelja koji se može pozvati pomoću skripte;
  • U fazi testiranja podržava se već spomenuti container-structure-test;
  • Za deploy su predviđeni:
    • Kubectl;
    • Helm;
    • kustomize.

Zahvaljujući tome, Skaffold se može nazvati svojevrsnim okvirom za CI/CD. Evo primjera radnog procesa pri njegovoj upotrebi (iz dokumentacije projekta):

Pregled Skaffold-a za razvoj pod Kubernetes-om

Kako u osnovnim crtama izgleda rad Skaffolda?

  1. Alat prati promjene u direktoriju sa izvor kodom. Ako se u datoteke unesu izmjene, one se sinkroniziraju s podom aplikacije u Kubernetes klasteru. Ako je moguće — bez ponovnog sastavljanja slike. U suprotnom — sastavlja se nova slika.
  2. Sastavljena slika se provjerava pomoću container-structure-test, označava i šalje u Docker Registry.
  3. Nakon toga slika se deploya — postavlja u Kubernetes klaster.
  4. Ako je pokretanje inicirano pomoću naredbe skaffold dev, tada počinjemo primati logove iz aplikacije, dok Skaffold čeka promjene kako bi ponovio sve radnje ispočetka.

Pregled Skaffold-a za razvoj pod Kubernetes-om
Ilustracija osnovnih faza rada Skaffolda

Praksa. Isprobavamo Skaffold

Za demonstraciju korištenja Skaffolda uzet ću primjer iz GitHub repozitorija projekta. Usput, tamo možete pronaći i mnoštvo drugih primjera, uzimajući u obzir različite specifikacije. Sve radnje ću izvoditi lokalno u Minikube. Instalacija je jednostavna i traje nekoliko minuta, a za početak rada potreban je kubectl.

Instalirajmo 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

Kloniramo repozitorij Skaffold-a s potrebnim primjerima:

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

Odabrao sam primjer s dva pod-a, svaki od njih sadrži malu aplikaciju napisana u Go-u. Jedna aplikacija je frontend (leeroy-web), koja prosljeđuje zahtjev drugoj aplikaciji – backendu (leeroy-app). Pogledajmo kako to izgleda:

~/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 direktorija, 8 datoteka

leeroy-app i leeroy-web sadrže Go kod te jednostavne Dockerfile-ove za lokalnu izradu tog kod:

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

Neću navoditi kod aplikacija — dovoljno je znati da leeroy-web prihvaća zahtjeve i prosljeđuje ih na leeroy-app. Stoga u datotekama Deployment.yaml postoji servis samo za app (za unutarnje usmjeravanje). Port pod-a web proslijedit ćemo za brz pristup aplikaciji.

Kako izgleda 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

Ovdje su opisane sve faze koje su spomenute ranije. Osim ovog konfiguracijskog datoteka postoji i datoteka s globalnim postavkama — ~/ .skaffold/config. Može se uređivati ručno ili putem CLI-ja — na primjer, ovako:

skaffold config set --global local-cluster true

Ova komanda će postaviti globalnu varijablu local-cluster na true, nakon čega Skaffold neće pokušavati 'push' slike na udaljeni registar. Ako radite lokalno, možete koristiti ovu komandu da pohranite slike lokalno.

Vratimo se na skaffold.yaml:

  • U fazi build navodimo da se slika treba izraditi i pohraniti lokalno. Nakon prvog pokretanja izrade, vidjet ćemo sljedeće:
    // т.к. 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

    Kao što se može vidjeti, Skaffold je sam označio slike. Usput, podržava se nekoliko politika označavanja.

  • Dalje u konfiguraciji navedeno je context: ./leeroy-app/, tj. definiran je kontekst unutar kojeg se slika izgrađuje.
  • U fazi implementacije se određuje da ćemo koristiti kubectl i masku za potrebne efemeride.
  • PortForward: slično onome kako obično preusmjeravamo portove pomoću kubectl port-forward, dajemo instrukcije Skaffoldu za izvođenje ove komande. U ovom slučaju — lokalni port 9000 se preusmjerava na 8080 u Deploymentu s imenom leeroy-web.

Vrijeme je da pokrenemo skaffold dev: komanda će stvoriti kontinuirani "ciklus povratne informacije", tj. ne samo da će sakupiti sve i implementirati u klaster, već će i obavijestiti o stanju podova u tom trenutku, pratiti promjene i ažurirati stanje podova.

Evo rezultata pokretanja skaffold dev --port-forward prilikom ponovne izgradnje:

Pregled Skaffold-a za razvoj pod Kubernetes-om

Prvo, vidljivo je da se koristi cache. Nadalje — aplikacija se gradi, implementira, portovi se preusmjeravaju. Budući da je naznačeno --port-forward, Skaffold je preusmjerio port do web, kako mu je i rečeno, ali app je preusmjerio po vlastitom nahođenju (izabrao najbliži slobodni). Nakon toga dobijamo prve logove od aplikacija.

Provjerimo funkcionalnost?

~\/skaffold\/examples\/microservices # kubectl get po
IME                           SPREMAN   STATUS    PONOVNI STARTOVI   STAROST
leeroy-app-6998dfcc95-2nxvf  1\/1     Radi     0          103s
leeroy-web-69f7d47c9d-5ff77  1\/1     Radi     0          103s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy aplikacija!!!

Modificiramo datoteku leeroy-app\/app.go — prolazi nekoliko sekundi… i:

~\/skaffold\/examples\/microservices # kubectl get po
IME                           SPREMAN   STATUS    PONOVNI STARTOVI   STAROST
leeroy-app-ffd79d986-l6nwp   1\/1     Radi     0          11s
leeroy-web-69f7d47c9d-5ff77  1\/1     Radi     0          4m59s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy Habr!!!

Pri tom je sam Skaffold ispisao u konzolu isto ono što je ranije, osim jednog momenta: ispisao je samo leeroy-app, a ne sve odjednom.

Više prakse

Vrijedi spomenuti i to da se prilikom kreiranja novog projekta konfiguracije za Skaffold mogu ‘bootstrap’ izvršiti pomoću komande init, što je veoma zgodno. Također, moguće je napisati više konfiguracija: raditi na konfiguraciji po defaultu, nakon čega se može prebaciti na stage s komandom run (isti proces kao i dev, samo ne prati promjene), koristeći drugu konfiguraciju.

Na katacodi postoji priručnik s primjerom još jednostavnijim. Umjesto toga, tamo se nudi već gotova sandboxa s Kubernetesom, aplikacijom i Skaffoldom. Odlična opcija ako vas zanima samostalno isprobavanje najosnovnijeg.

Jedna od mogućnosti korištenja Skaffolda je razvoj na udaljenom klasteru. Nije svima zgodno pokretati Minikube na vlastitom hardveru, a zatim implementirati aplikaciju i čekati da ona ispravno funkcionira... U tom slučaju Skaffold odlično rješava postavljeni zadatak, što mogu potvrditi, na primjer, inženjeri Reddita, o čemu smo već pisali pročitati na našem blogu.

A u ovoj publikaciji iz Weaveworks možete pronaći primjer kreiranja pipeline-a za produkciju.

Zaključak

Skaffold je praktičan alat za izgradnju pipeline-a koji podrazumijevaju implementaciju aplikacija u Kubernetes i koji su prvenstveno usmjereni na potrebe razvoja. S njim je prilično lako stvoriti 'kratki' pipeline koji uzima u obzir osnovne potrebe programera, no ako želite, možete organizirati i opsežnije procese. Kao jedan od jasnih primjera primjene Skaffolda u CI/CD procesima navodi se takve testni projekt od 10 mikroslužbi koje koriste mogućnosti Kubernetes, gRPC, Istio i OpenCensus Tracing.

Skaffold je već dobio gotovo 8000+ zvjezdica na GitHubu, razvija ga Google i dio je GoogleContainerTools — Generalno, trenutno postoji mnogo razloga vjerovati da će se projekt razvijati dugo i uspješno.

P.S.

Pročitajte i na našem blogu:

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster