Pregled Skaffolda za razvoj Kubernetesa

Pregled Skaffolda za razvoj Kubernetesa

Prije godinu i pol dana, 5. ožujka 2018., Google je objavio prvu alpha verziju svog Open Source projekta za CI/CD tzv. skela, čiji je cilj bio stvoriti “jednostavan i ponovljiv Kubernetes razvoj” kako bi se programeri mogli usredotočiti na razvoj, a ne na administraciju. Što bi moglo biti zanimljivo o Skaffoldu? Kako se ispostavilo, ima nekoliko trikova u rukavu koji ga mogu učiniti moćnim alatom za programera, a možda čak i operativnog inženjera. Upoznajmo se s projektom i njegovim mogućnostima.

NB: Usput, već smo ukratko govorili o Skaffoldu u našoj generalici pregled razvojnih alata, čiji su životi povezani s Kubernetesom.

Teorija. Namjena i mogućnosti

Dakle, općenito govoreći, Skaffold rješava problem automatizacije CI/CD ciklusa (u fazama izgradnje, guranja, postavljanja), nudeći razvojnom programeru brzu povratnu informaciju, tj. mogućnost brzog primanja rezultata naknadnih promjena koda – u obliku ažurirane aplikacije koja se izvodi u Kubernetes klasteru. I može raditi u različitim krugovima (dev, stage, production...), za koje Skaffold pomaže opisati odgovarajuće cjevovode za uvođenje.

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

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

  • Skaffold nudi alate za stvaranje CI/CD cjevovoda.
  • Omogućuje praćenje promjena u izvornom kodu u pozadini i pokretanje automatiziranog procesa sastavljanja koda u slike spremnika, objavljivanje tih slika u Docker registru i njihovu implementaciju u Kubernetes klaster.
  • Sinkronizira datoteke u repozitoriju s radnim direktorijem u spremniku.
  • Automatski testira pomoću testa strukture spremnika.
  • Portovi prema naprijed.
  • Čita zapisnike aplikacije koja se izvodi u spremniku.
  • Pomaže u otklanjanju pogrešaka u aplikacijama napisanim u Javi, Node.js, Python, Go.

Sada o značajkama:

  • Sam Skaffold nema komponente na strani klastera. Odnosno, nema potrebe dodatno konfigurirati Kubernetes za korištenje ovog uslužnog programa.
  • Različiti cjevovodi za vašu aplikaciju. Trebate li razviti kod na lokalnu Minikube dok razvijate, a zatim na pozornicu ili produkciju? U tu svrhu postoje профили i korisničke konfiguracije, varijable okruženja i oznake, koje vam omogućuju da opišete različite cjevovode za jednu aplikaciju.
  • CLI. Samo uslužni program konzole i konfiguracije u YAML-u. Na internetu možete pronaći reference na pokušaje stvaranja eksperimentalni GUI, međutim, to trenutno najvjerojatnije samo znači da ga netko treba, ali ne baš.
  • Modularnost. Skaffold nije samostalni kombajn, već nastoji koristiti pojedinačne module ili postojeća rješenja za specifične zadatke.

Ilustracija potonjeg:

  • U fazi montaže možete koristiti:
    • docker izgraditi lokalno, u klasteru koristeći kaniko ili u Google Cloud Buildu;
    • Bazel lokalno;
    • Jib Maven i Jib Gradle lokalno ili u Google Cloud Buildu;
    • prilagođene skripte za izgradnju izvode se lokalno. Ako trebate pokrenuti drugo (fleksibilnije/poznatije/...) rješenje za izgradnju, to je opisano u skripti tako da ga Skaffold pokreće (primjer iz dokumentacije). To vam omogućuje korištenje bilo kojeg kolektora koji se može pozvati pomoću skripte;
  • U fazi testiranja, već spomenuto ispitivanje strukture kontejnera;
  • Za implementaciju je predviđeno sljedeće:
    • Kubectl;
    • Kormilariti;
    • prilagoditi.

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

Pregled Skaffolda za razvoj Kubernetesa

Kako općenito izgleda Skaffoldov rad?

  1. Uslužni program prati promjene u direktoriju izvornog koda. Ako se izmjene izvrše na datotekama, one se sinkroniziraju s podom aplikacije u Kubernetes klasteru. Ako je moguće, bez ponovnog sastavljanja slike. Inače se sastavlja nova slika.
  2. Sastavljena slika se provjerava pomoću testa strukture spremnika, označava i šalje u Docker registar.
  3. Nakon toga, slika se postavlja - postavlja u Kubernetes klaster.
  4. Ako je pokretanje inicijalizirano pomoću naredbe skaffold dev, tada počinjemo primati zapise iz aplikacije, a Skaffold čeka promjene kako bi ponovno ponovio sve radnje.

Pregled Skaffolda za razvoj Kubernetesa
Ilustracija glavnih faza rada Skaffolda

Praksa. Isprobavanje Skaffolda

Da bih pokazao korištenje Skaffolda, uzet ću primjer iz GitHub repozitorij projekta... Usput, tamo Možete pronaći mnoge druge primjere koji uzimaju u obzir razne specifičnosti. Sve radnje obavljat ću 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 s dvije mahune, od kojih svaka 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 Docker datoteke za lokalnu izradu 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 dati šifru aplikacije - dovoljno je to znati leeroy-web prihvaća zahtjeve i prosljeđuje ih na leeroy-app. Stoga u spisima Deployment.yaml postoji usluga samo za app (za interno usmjeravanje). Pod luka web proslijedit ćemo ga sebi za brzi pristup aplikaciji.

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. Osim ove konfiguracije, postoji i datoteka s 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 naredba će postaviti globalnu varijablu local-cluster u vrijednosti true, nakon čega Skaffold neće pokušavati gurnuti slike u udaljeni registar. Ako razvijate lokalno, možete koristiti ovu naredbu za lokalno stvaranje slika.

Natrag na skaffold.yaml:

  • Na pozornici build navodimo da sliku trebate prikupiti i spremiti lokalno. Nakon prvog pokretanja izgradnje, 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 označavanja.

  • Dalje u konfiguraciji je naznačeno context: ./leeroy-app/, tj. određen je kontekst u kojem je slika prikupljena.
  • 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 koristeći kubectl port-forward, dajemo upute Skaffoldu da pozove ovu naredbu. U ovom slučaju, lokalni port 9000 prosljeđuje se na 8080 u implementaciji s nazivom leeroy-web.

Vrijeme je za lansiranje skaffold dev: Tim će stvoriti stalnu "petlju povratne informacije", tj. ne samo da će prikupiti sve i rasporediti u klaster, nego će vam također reć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 predmemorija koristi. Zatim se aplikacija sastavlja, postavlja i portovi se prosljeđuju. Budući da je navedeno --port-forward, Skaffold je proslijedio port na web, kako su ga pitali, ali ovdje app bacao je po vlastitom nahođenju (izabrao najbližu slobodnu). Nakon toga dobivamo prve zapisnike iz aplikacija.

Provjerimo radi li?

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

U isto vrijeme, sam Skaffold je prikazao istu stvar u konzoli kao i prije, s izuzetkom jedne točke: samo se izvukao 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 vrlo povoljno. Osim toga, možete napisati nekoliko konfiguracija: izvršiti razvoj na zadanoj konfiguraciji, a zatim je pokrenuti na pozornici s naredbom run (isti postupak kao dev, jednostavno ne prati promjene), koristeći drugu konfiguraciju.

Na katacoda ima rukovodstvo S primjerom je još lakše. Ali nudi gotov sandbox s Kubernetesom, aplikacijom i Skaffoldom. Izvrsna opcija ako želite sami isprobati same osnove.

Jedan mogući slučaj upotrebe za Skaffold je provođenje razvoja na udaljenom klasteru. Nije svima ugodno pokrenuti Minikube na vlastitom hardveru, zatim izbaciti aplikaciju i očekivati ​​da će ispravno funkcionirati... U ovom slučaju Skaffold savršeno rješava problem, što mogu potvrditi, primjerice, inženjeri Reddita, kao što imamo već raspravljano писали u našem blogu.

I u ova publikacija iz Weaveworksa možete pronaći primjer stvaranja cjevovoda za proizvodnju.

Zaključak

Skaffold je prikladan alat za izgradnju cjevovoda koji uključuju uvođenje aplikacija u Kubernetes i prvenstveno su usmjereni na razvojne potrebe. To olakšava stvaranje "kratkog" cjevovoda 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 dano takav ispitni projekt od 10 mikroservisa koji koriste mogućnosti Kubernetes, gRPC, Istio i OpenCensus Tracing.

Skaffold već ima gotovo 8000+ zvjezdica na GitHubu, razvio ga je Google i dio je Google ContainerTools — općenito, u ovom trenutku postoje svi razlozi za vjerovanje da će se projekt razvijati sretno do kraja života.

PS

Pročitajte i na našem blogu:

Izvor: www.habr.com

Dodajte komentar