Rishikimi i Skaffold për zhvillimin e Kubernetes

Rishikimi i Skaffold për zhvillimin e Kubernetes

Një vit e gjysmë më parë, më 5 mars 2018, Google publikoi versionin e parë alfa të projektit të tij me burim të hapur për CI/CD të quajtur Skeli, qëllimi i të cilit ishte të krijonte "zhvillim të thjeshtë dhe të përsëritshëm Kubernetes" në mënyrë që zhvilluesit të mund të fokusoheshin në zhvillim dhe jo në administrim. Çfarë mund të jetë interesante për Skaffold? Siç rezulton, ai ka disa truke në mëngë që mund ta bëjnë atë një mjet të fuqishëm për zhvilluesin, dhe ndoshta edhe inxhinierin e operacioneve. Le të njihemi me projektin dhe aftësitë e tij.

NB: Nga rruga, ne kemi folur tashmë shkurtimisht për Skaffold në gjeneralin tonë rishikimi i mjeteve të zhvilluesit, jeta e të cilit është e lidhur me Kubernetes.

Teoria. Qëllimi dhe aftësitë

Pra, në përgjithësi, Skaffold zgjidh problemin e automatizimit të ciklit CI/CD (në fazat e ndërtimit, shtytjes, vendosjes), duke i ofruar zhvilluesit reagime të menjëhershme, d.m.th. aftësia për të marrë shpejt rezultatin e ndryshimeve të mëvonshme të kodit - në formën e një aplikacioni të përditësuar që funksionon në grupin Kubernetes. Dhe mund të funksionojë në qarqe të ndryshme (dev, skena, prodhimi...), për të cilat Skaffold ndihmon në përshkrimin e tubacioneve përkatëse për shpërndarje.

Kodi burimor i Skaffold është shkruar në Go, shperndare nga nën licencën falas Apache 2.0 (GitHub).

Le të shohim funksionet dhe veçoritë kryesore. Të parat përfshijnë sa vijon:

  • Skaffold ofron mjete për krijimin e tubacioneve CI/CD.
  • Ju lejon të monitoroni ndryshimet në kodin burimor në sfond dhe të ekzekutoni një proces të automatizuar të grumbullimit të kodit në imazhet e kontejnerëve, duke i publikuar këto imazhe në Regjistrin Docker dhe duke i vendosur ato në grupin Kubernetes.
  • Sinkronizon skedarët në depo me drejtorinë e punës në kontejner.
  • Teston automatikisht duke përdorur testin e strukturës së kontejnerit.
  • Portet përpara.
  • Lexon regjistrat e një aplikacioni që ekzekutohet në një kontejner.
  • Ndihmon në korrigjimin e aplikacioneve të shkruara në Java, Node.js, Python, Go.

Tani për veçoritë:

  • Skaffold në vetvete nuk ka komponentë nga ana e grupit. Kjo do të thotë, nuk ka nevojë të konfiguroni më tej Kubernetes për të përdorur këtë mjet.
  • Tubacione të ndryshme për aplikimin tuaj. A ju duhet të hapni kodin në Minikube lokale ndërsa jeni duke u zhvilluar, dhe më pas në skenë ose produksion? Për këtë qëllim ekzistojnë profilet dhe konfigurimet e përdoruesve, variablat e mjedisit dhe flamujt, të cilët ju lejojnë të përshkruani tubacione të ndryshme për një aplikacion.
  • CLI. Vetëm mjetet dhe konfigurimet e konsolës në YAML. Në internet mund të gjeni referenca për përpjekjet për të krijuar GUI eksperimentale, megjithatë, për momentin kjo ka shumë të ngjarë të thotë se dikush ka nevojë për të, por jo në të vërtetë.
  • Modulariteti. Skaffold nuk është një korrës i pavarur, por synon të përdorë module individuale ose zgjidhje ekzistuese për detyra specifike.

Ilustrimi i kësaj të fundit:

  • Në fazën e montimit mund të përdorni:
    • docker build në nivel lokal, në një grup duke përdorur kaniko ose në Google Cloud Build;
    • Bazel në vend;
    • Jib Maven dhe Jib Gradle në nivel lokal ose në Google Cloud Build;
    • skriptet e ndërtuara me porosi ekzekutohen në nivel lokal. Nëse keni nevojë të ekzekutoni një zgjidhje tjetër ndërtimi (më fleksibël/të njohur/...), ajo përshkruhet në skenar në mënyrë që Skaffold ta lëshojë atë (shembull nga dokumentacioni). Kjo ju lejon të përdorni çdo koleksionist që mund të thirret duke përdorur një skript;
  • Në fazën e testimit, të përmendura tashmë kontejner-strukturë-provë;
  • Për vendosjen janë dhënë si më poshtë:
    • Kubectl;
    • Helm;
    • personalizoj.

Falë kësaj, Skaffold mund të quhet një unik kornizë për ndërtimin e CI/CD. Këtu është një shembull i rrjedhës së punës kur e përdorni (nga dokumentacioni i projektit):

Rishikimi i Skaffold për zhvillimin e Kubernetes

Si duket vepra e Skaffold në terma të përgjithshëm?

  1. Programi monitoron ndryshimet në drejtorinë e kodit burimor. Nëse bëhen modifikime në skedarë, ato sinkronizohen me podin e aplikacionit në grupin Kubernetes. Nëse është e mundur, pa rimontuar imazhin. Përndryshe, një imazh i ri është mbledhur.
  2. Imazhi i montuar kontrollohet duke përdorur testin e strukturës së kontejnerit, etiketohet dhe dërgohet në Regjistrin Docker.
  3. Pas kësaj, imazhi vendoset - vendoset në grupin Kubernetes.
  4. Nëse nisja është inicializuar duke përdorur komandën skaffold dev, pastaj fillojmë të marrim regjistrat nga aplikacioni dhe Skaffold pret ndryshimet për të përsëritur të gjitha veprimet përsëri.

Rishikimi i Skaffold për zhvillimin e Kubernetes
Ilustrimi i fazave kryesore të funksionimit të Skaffold

Praktikoni. Duke provuar Skaffold

Për të demonstruar përdorimin e Skaffold, do të marr një shembull nga Depoja e projektit GitHub... Meqe ra fjala, atje Mund të gjeni shumë shembuj të tjerë që marrin parasysh specifika të ndryshme. Do t'i kryej të gjitha veprimet në nivel lokal në Minikube. Instalimi është i thjeshtë dhe zgjat disa minuta dhe do t'ju duhet kubectl për të filluar.

Instaloni 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

Le të klonojmë depon e Skaffold me shembujt e nevojshëm:

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

Zgjodha një shembull me dy grupe, secila përmban një aplikacion të vogël Go. Një aplikacion është frontend (leeroy-web), i cili e ridrejton kërkesën në aplikacionin e dytë - backend (leeroy-app). Le të shohim se si duket:

~/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 dhe leeroy-web përmbajnë kodin Go dhe Dockerfiles të thjeshtë për ndërtimin e këtij kodi në vend:

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

Unë nuk do të jap kodin e aplikimit - mjafton ta dish këtë leeroy-web pranon kërkesat dhe ua përcjell ato leeroy-app. Prandaj në dosje Deployment.yaml ka një shërbim vetëm për app (për rrugëtim të brendshëm). Pod port web do t'ia përcjellim vetes për qasje të shpejtë në aplikacion.

Çfarë duket 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

Të gjitha fazat e përmendura më sipër janë përshkruar këtu. Përveç këtij konfigurimi, ekziston gjithashtu një skedar me cilësime globale - ~/.skaffold/config. Mund të modifikohet manualisht ose nëpërmjet CLI - për shembull, si kjo:

skaffold config set --global local-cluster true

Kjo komandë do të vendosë variablin global local-cluster në kuptim true, pas së cilës Skaffold nuk do të përpiqet të shtyjë imazhet në regjistrin në distancë. Nëse po zhvilloni në nivel lokal, mund ta përdorni këtë komandë për të ndërtuar imazhe në nivel lokal.

Kthehu tek skaffold.yaml:

  • Ne skene build ne specifikojmë që ju duhet të mbledhni dhe ruani imazhin në vend. Pasi ndërtimi të funksionojë për herë të parë, do të shohim sa vijon:
    // т.к. 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

    Siç mund ta shihni, Skaffold i ka etiketuar vetë imazhet. Nga rruga, mbështeten disa politika etiketimi.

  • Më tej në konfigurim tregohet context: ./leeroy-app/, d.m.th. specifikohet konteksti në të cilin është mbledhur imazhi.
  • Në fazën e vendosjes, përcaktohet se do të përdorim kubectl dhe një maskë për manifestimet e nevojshme.
  • PortForward: ngjashëm me mënyrën se si ne zakonisht i përcjellim portet duke përdorur kubectl port-forward, i japim udhëzime Skaffold për të thirrur këtë komandë. Në këtë rast, porti lokal 9000 përcillet te 8080 në Deployment me emrin leeroy-web.

Është koha për të nisur skaffold dev: Ekipi do të krijojë një "qark reagimi" të vazhdueshëm, d.m.th. jo vetëm që do të mbledhë gjithçka dhe do ta vendosë atë në grup, por gjithashtu do t'ju tregojë për gjendjen e pods në këtë moment, do të monitorojë ndryshimet dhe do të përditësojë gjendjen e pods.

Këtu është rezultati i nisjes skaffold dev --port-forward kur rimontoni:

Rishikimi i Skaffold për zhvillimin e Kubernetes

Së pari, mund të shihni se cache po përdoret. Më pas, aplikacioni mblidhet, vendoset dhe portet përcillen. Meqenëse është specifikuar --port-forward, Skaffold e përcolli portin në web, siç u pyet, por app ai hodhi sipas gjykimit të tij (zgjodhi të lirën më të afërt). Pas kësaj, marrim regjistrat e parë nga aplikacionet.

Le të kontrollojmë nëse funksionon?

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

Modifikimi i skedarit leeroy-app/app.go - kalojnë disa sekonda... dhe:

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

Në të njëjtën kohë, vetë Skaffold shfaqi të njëjtën gjë në tastierë si më parë, me përjashtim të një pike: doli vetëm leeroy-app, dhe jo të gjitha përnjëherë.

Më shumë praktikë

Vlen gjithashtu të përmendet se kur krijoni një projekt të ri, konfigurimet për Skaffold mund të bootstrapped duke përdorur komandën init, i cili është shumë i përshtatshëm. Përveç kësaj, mund të shkruani disa konfigurime: kryeni zhvillimin në konfigurimin e paracaktuar dhe më pas kaloni në skenë me komandën run (i njëjti proces si dev, thjesht nuk monitoron ndryshimet), duke përdorur një konfigurim tjetër.

Në katakoda ka udhëheqja Është edhe më e lehtë me një shembull. Por ofron një sandbox të gatshëm me Kubernetes, një aplikacion dhe Skaffold. Një opsion i shkëlqyeshëm nëse jeni të interesuar të provoni vetë bazat.

Një rast i mundshëm përdorimi për Skaffold është kryerja e zhvillimit në një grupim të largët. Jo të gjithë janë të kënaqur të përdorin Minikube në harduerin e tyre, pastaj të hapin aplikacionin dhe presin që ai të funksionojë në mënyrë adekuate... Në këtë rast, Skaffold e zgjidh problemin në mënyrë të përsosur, gjë që mund të konfirmohet, për shembull, nga inxhinierët e Reddit, siç kemi diskutuar tashmë писали në blogun tonë.

Dhe në këtë botim nga Weaveworks mund të gjeni një shembull të krijimit të një tubacioni për prodhim.

Përfundim

Skaffold është një mjet i përshtatshëm për ndërtimin e tubacioneve që përfshijnë lëshimin e aplikacioneve në Kubernetes dhe janë të fokusuara kryesisht në nevojat e zhvillimit. E bën mjaft të lehtë krijimin e një tubacioni "të shkurtër" që merr parasysh nevojat themelore të zhvilluesit, por nëse dëshironi, mund të organizoni procese më të mëdha. Si një nga shembujt e qartë të përdorimit të Skaffold në proceset CI/CD është dhënë i tillë projekt provë prej 10 mikroshërbimesh duke përdorur aftësitë e Kubernetes, gRPC, Istio dhe OpenCensus Tracing.

Skaffold tashmë ka pothuajse 8000+ yje në GitHub, është zhvilluar nga Google dhe është pjesë e GoogleContainerTools — në përgjithësi, për momentin ka çdo arsye për të besuar se projekti do të zhvillohet përgjithmonë.

PS

Lexoni edhe në blogun tonë:

Burimi: www.habr.com

Shto një koment