Pregled Skaffolda za razvoj Kubernetesa

Pregled Skaffolda za razvoj Kubernetesa

Prije godinu i po dana, 5. marta 2018., Google je objavio prvu alfa verziju svog Open Source projekta za CI/CD pod nazivom Skaffold, čiji je cilj bio kreiranje „jednostavnog i ponovljivog razvoja Kubernetesa“ kako bi se programeri mogli fokusirati na razvoj, a ne na administraciju. Šta bi moglo biti zanimljivo kod Skaffolda? Kako se ispostavilo, ima nekoliko trikova u rukavu koji ga mogu učiniti moćnim alatom za programere, a možda čak i za operativnog inženjera. Hajde da se upoznamo sa projektom i njegovim mogućnostima.

NB: Inače, o Skaffoldu smo već ukratko govorili u našem generalu pregled razvojnih alata, čiji su životi povezani sa Kubernetesom.

Teorija. Svrha i mogućnosti

Dakle, generalno govoreći, Skaffold rješava problem automatizacije CI/CD ciklusa (u fazama build, push, deploy), nudeći programeru brzu povratnu informaciju, tj. mogućnost brzog primanja rezultata naknadnih promjena koda - u obliku ažurirane aplikacije koja radi u Kubernetes klasteru. I može raditi u različitim krugovima (dev, stage, production...), za koje Skaffold pomaže da opiše odgovarajuće cjevovode za uvođenje.

Skaffoldov izvorni kod je napisan u Go, distribuira pod besplatnom Apache licencom 2.0 (GitHub).

Pogledajmo glavne funkcije i karakteristike. Prvi uključuju sljedeće:

  • Skaffold nudi alate za kreiranje CI/CD cjevovoda.
  • Omogućava vam da pratite promjene u izvornom kodu u pozadini i pokrenete automatizirani proces sastavljanja koda u slike kontejnera, objavljujući ove slike u Docker Registry i postavljajući ih u Kubernetes klaster.
  • Sinhronizira datoteke u spremištu sa radnim direktorijumom u kontejneru.
  • Automatski testira pomoću testa strukture kontejnera.
  • Prosljeđuje portove.
  • Čita dnevnike aplikacije koja radi u kontejneru.
  • Pomaže u otklanjanju grešaka u aplikacijama napisanim u Javi, Node.js, Python, Go.

Sada o karakteristikama:

  • Sam Skaffold nema komponente na strani klastera. To jest, nema potrebe dalje konfigurirati Kubernetes za korištenje ovog uslužnog programa.
  • Različiti cjevovodi za vašu aplikaciju. Da li treba da uvedete kod na lokalni Minikube dok razvijate, a zatim da ga postavite na pozornicu ili produkciju? U tu svrhu postoje profile i korisničke konfiguracije, varijable okruženja i zastavice, koje vam omogućavaju da opišete različite cjevovode za jednu aplikaciju.
  • CLI. Samo konzolni uslužni program i konfiguracije u YAML-u. Na internetu možete pronaći reference na pokušaje stvaranja eksperimentalni GUI, međutim, u ovom trenutku to najvjerovatnije samo znači da je nekome potreban, ali ne baš.
  • Modularnost. Skaffold nije samostalni kombajn, već ima za cilj korištenje pojedinačnih modula ili postojećih rješenja za specifične zadatke.

Ilustracija potonjeg:

  • U fazi montaže možete koristiti:
    • docker build lokalno, u klasteru koji koristi kaniko ili u Google Cloud Build-u;
    • Bazel lokalno;
    • Jib Maven i Jib Gradle lokalno ili u Google Cloud Build-u;
    • prilagođene skripte za izgradnju pokreću se lokalno. Ako trebate pokrenuti neko drugo (fleksibilnije/poznatije/...) rješenje za izgradnju, ono je opisano u skripti tako da ga Skaffold pokreće (primjer iz dokumentacije). Ovo vam omogućava da koristite bilo koji kolektor koji se može pozvati pomoću skripte;
  • U fazi testiranja, već pomenuto kontejner-struktura-test;
  • Za implementaciju je predviđeno sljedeće:
    • Kubectl;
    • Helm;
    • prilagoditi.

Zahvaljujući tome, Skaffold se može nazvati jedinstvenim okvir za izgradnju CI/CD. Evo primjera toka rada kada ga koristite (iz projektne dokumentacije):

Pregled Skaffolda za razvoj Kubernetesa

Kako generalno izgleda Skaffoldov rad?

  1. Uslužni program prati promjene u direktoriju izvornog koda. Ako se izvrše izmjene na datotekama, one se sinkroniziraju s modulom aplikacije u Kubernetes klasteru. Ako je moguće, bez ponovnog sastavljanja slike. U suprotnom se sklapa nova slika.
  2. Sastavljena slika se provjerava korištenjem testa strukture kontejnera, označava se i šalje u Docker Registry.
  3. Nakon toga, slika se postavlja - raspoređuje u Kubernetes klaster.
  4. Ako je pokretanje inicijalizirano pomoću naredbe skaffold dev, tada počinjemo primati zapisnike iz aplikacije, a Skaffold čeka promjene da bi ponovo ponovio sve radnje.

Pregled Skaffolda za razvoj Kubernetesa
Ilustracija glavnih faza rada Skaffolda

Vježbajte. Pokušavam sa Skaffoldom

Da demonstriram upotrebu Skaffolda, uzet ću primjer iz GitHub projektno spremište... Između ostalog, na istom mestu Možete pronaći mnogo drugih primjera koji uzimaju u obzir različite specifičnosti. Sve radnje ću izvoditi lokalno u Minikubeu. Instalacija je jednostavna i traje nekoliko minuta, a za početak će vam trebati kubectl.

Instalirajte 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

Klonirajmo Skaffoldovo spremište s potrebnim primjerima:

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

Odabrao sam primjer sa dva pod-a, od kojih svaki sadrži jednu malu Go aplikaciju. Jedna aplikacija je frontend (leeroy-web), koji preusmjerava zahtjev na drugu aplikaciju - backend (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 directories, 8 files

leeroy-app i leeroy-web sadrže Go kod i jednostavne Dockerfiles za lokalnu izgradnju ovog koda:

~/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 davati šifru aplikacije - dovoljno je to znati leeroy-web prihvata zahtjeve i ovlašćuje ih leeroy-app. Stoga u fajlovima Deployment.yaml postoji usluga samo za app (za interno rutiranje). Pod port web mi ćemo ga proslijediti sebi za brzi pristup aplikaciji.

Kako to 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 gore navedene faze. Pored ove konfiguracije, postoji i fajl sa globalnim postavkama - ~/.skaffold/config. Može se uređivati ​​ručno ili putem CLI-a - na primjer, ovako:

skaffold config set --global local-cluster true

Ova komanda će postaviti globalnu varijablu local-cluster u značenje true, nakon čega Skaffold neće pokušati gurnuti slike u udaljeni registar. Ako razvijate lokalno, ovu naredbu možete koristiti za lokalnu izgradnju slika.

Natrag na skaffold.yaml:

  • Na sceni build navodimo da sliku trebate prikupiti i spremiti lokalno. Nakon što se izgradnja pokrene po prvi put, 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 vidite, Skaffold je sam označio slike. Usput, podržano je nekoliko pravila za označavanje.

  • Dalje u konfiguraciji je naznačeno context: ./leeroy-app/, tj. određen je kontekst u kojem se slika prikuplja.
  • U fazi implementacije, određeno je da ćemo koristiti kubectl i masku za potrebne manifeste.
  • PortForward: slično načinu na koji obično prosljeđujemo portove kubectl port-forward, dajemo instrukcije Skaffoldu da pozove ovu komandu. U ovom slučaju, lokalni port 9000 se prosljeđuje na 8080 u Deploymentu s imenom leeroy-web.

Vrijeme je za lansiranje skaffold dev: Tim će kreirati stalnu „petlju povratnih informacija“, tj. ne samo da će sve prikupiti i rasporediti u klaster, već će vam reći i o trenutnom stanju podova, pratiti promjene i ažurirati stanje podova.

Evo rezultata lansiranja skaffold dev --port-forward prilikom ponovnog sastavljanja:

Pregled Skaffolda za razvoj Kubernetesa

Prvo, možete vidjeti da se keš koristi. Zatim se aplikacija sastavlja, raspoređuje i portovi se prosljeđuju. Pošto je navedeno --port-forward, Skaffold je proslijedio luku na web, kako su ga pitali, ali app bacio je po vlastitom nahođenju (izabrao najbližu slobodnu). Nakon toga, primamo prve logove iz aplikacija.

Hajde da proverimo da li radi?

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

Izmjena datoteke leeroy-app/app.go - prođe nekoliko sekundi... i:

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

Istovremeno, sam Skaffold je prikazao istu stvar na konzoli kao i prije, s izuzetkom jedne tačke: samo se pojavio leeroy-app, a ne sve odjednom.

Više prakse

Također je vrijedno spomenuti da se prilikom kreiranja novog projekta konfiguracije za Skaffold mogu pokrenuti pomoću naredbe init, što je veoma zgodno. Osim toga, možete napisati nekoliko konfiguracija: izvršite razvoj na zadanoj konfiguraciji, a zatim pređete u fazu pomoću naredbe run (isti proces kao dev, jednostavno ne prati promjene), koristeći drugu konfiguraciju.

Na katacodi postoji vodič Uz primjer je još lakše. Ali nudi gotov sandbox sa Kubernetesom, aplikacijom i Skaffoldom. Odlična opcija ako ste zainteresirani da sami isprobate same osnove.

Jedan mogući slučaj upotrebe za Skaffold je izvođenje razvoja na udaljenom klasteru. Nije svima ugodno pokrenuti Minikube na svom hardveru, a zatim pokrenuti aplikaciju i očekivati ​​da će ona adekvatno funkcionirati... U ovom slučaju, Skaffold savršeno rješava problem, što mogu potvrditi, na primjer, Reddit inženjeri, kao što imamo već diskutovano napisao je u našem blogu.

I unutra ovu publikaciju iz Weaveworksa možete pronaći primjer kreiranja cjevovoda za proizvodnju.

zaključak

Skaffold je zgodan alat za izgradnju cjevovoda koji uključuju uvođenje aplikacija u Kubernetes i prvenstveno su fokusirani na razvojne potrebe. Olakšava kreiranje „kratkog“ cevovoda koji uzima u obzir osnovne potrebe programera, ali ako želite, možete organizirati veće procese. Kao jedan od jasnih primjera korištenja Skaffolda u CI/CD procesima je dato takav test projekat od 10 mikroservisa koji koriste mogućnosti Kubernetes, gRPC, Istio i OpenCensus Tracing.

Skaffold već ima skoro 8000+ zvijezda na GitHubu, razvio ga je Google i dio je GoogleContainerTools — generalno, u ovom trenutku postoje svi razlozi za vjerovanje da će se projekt uspješno razvijati do kraja života.

PS

Pročitajte i na našem blogu:

izvor: www.habr.com

Dodajte komentar