Rishikimi i Skaffold për zhvillimin nën Kubernetes

Rishikimi i Skaffold për zhvillimin nën Kubernetes

NjĂ« e gjysmĂ« vjetĂ« mĂ« parĂ«, mĂ« 5 mars 2018, kompania Google publikoi versionin e parĂ« alfa tĂ« projektit tĂ« saj Open Source pĂ«r CI/CD tĂ« quajtur Skaffold, me qĂ«llimin pĂ«r tĂ« krijuar njĂ« "zhvillim tĂ« lehtĂ« dhe tĂ« riprodhueshĂ«m nĂ«n Kubernetes", nĂ« mĂ«nyrĂ« qĂ« zhvilluesit tĂ« mund tĂ« pĂ«rqendrohen nĂ« zhvillim dhe jo nĂ« administrim. ÇfarĂ« e bĂ«n Skaffold interesante? Siç doli, ai ka disa as nĂ« mĂ«ngĂ«, duke e bĂ«rĂ« atĂ« njĂ« mjet tĂ« fortĂ« pĂ«r zhvilluesin, dhe ndoshta edhe pĂ«r inxhinierin e operacioneve. Le tĂ« njihemi me projektin dhe mundĂ«sitĂ« e tij.

NB: Për fat të mirë, ne përmendëm shkurtimisht Skaffold në pikëpamjen tonë mbi mjetet për zhvilluesit, jetët e të cilëve janë të lidhura me Kubernetes.

Teoria. Qëllimi dhe mundësitë

Pra ndaj, nĂ«se flasim nĂ« pĂ«rgjithĂ«si, Skaffold zgjidh problemin e automatizimit tĂ« ciklit CI/CD (nĂ« fazat build, push, deploy), duke ofruar reagim tĂ« shpejtĂ« pĂ«r zhvilluesin, domethĂ«nĂ« mundĂ«sinĂ« pĂ«r tĂ« marrĂ« shpejt rezultatin e ndryshimeve tĂ« fundit nĂ« kod — nĂ« formĂ«n e njĂ« aplikacioni tĂ« pĂ«rditĂ«suar, qĂ« funksionon nĂ« klasterin Kubernetes. Ajo mund tĂ« funksionojĂ« nĂ« ambiente tĂ« ndryshme (dev, stage, production
), pĂ«r tĂ« cilat Skaffold ndihmon nĂ« pĂ«rshkrimin e pipeline-ve pĂ«r publikimin.

Kodi burimor i Skaffold është shkruar në gjuhën Go, distribuohet nën kushte të licencës së lirë Apache License 2.0 (GitHub).

Të shqyrtojmë funksionet dhe veçoritë kryesore. Midis tyre, mund të përmendim këto:

  • Skaffold ofron mjete pĂ«r krijimin e pipeline-ve CI/CD.
  • Lejon tĂ« ndjekĂ« nĂ« sfond ndryshimet nĂ« kodin burimor dhe tĂ« aktivizojĂ« procesin automatizues tĂ« ndĂ«rtimit tĂ« kodit nĂ« imazhe kontejnerĂ«sh, publikimin e kĂ«tyre imazheve nĂ« Docker Registry dhe vendosjen e tyre nĂ« klasterin Kubernetes.
  • Sinkronizon skedarĂ«t nĂ« repositor me katalogun e punĂ«s nĂ« kontejner.
  • Automatikisht teston duke pĂ«rdorur container-structure-test.
  • Ruan portet.
  • Lexon log-et e aplikacionit, qĂ« funksionon nĂ« kontejner.
  • Ndihmon nĂ« debugin e aplikacioneve tĂ« shkruara nĂ« Java, Node.js, Python, Go.

Tani — mbi veçoritĂ«:

  • Skaffold nuk ka komponente anĂ«sore nĂ« klaster. Pra, nuk Ă«shtĂ« e nevojshme tĂ« konfiguroni Kubernetes pĂ«r tĂ« pĂ«rdorur kĂ«tĂ« utilitare.
  • Pipa tĂ« ndryshme pĂ«r aplikacionin tuaj. Duhet tĂ« lĂ«shoni kodin nĂ« Minikube lokal, ndĂ«rsa jeni nĂ« zhvillim, dhe mĂ« pas — nĂ« stage ose production? PĂ«r kĂ«tĂ« janĂ« parashikuar profillet dhe konfigurime tĂ« pĂ«rdoruesve, variabla ambienti dhe flamuj, qĂ« lejojnĂ« pĂ«rshkrimin e pipa tĂ« ndryshme pĂ«r njĂ« aplikacion.
  • CLI. VetĂ«m utilitare konsolash dhe konfigurime nĂ« YAML. NĂ« rrjet mund tĂ« gjeni pĂ«rmendje tĂ« pĂ«rpjekjeve pĂ«r tĂ« krijuar njĂ« GUI eksperimentale, megjithatĂ«, pĂ«r momentin kjo mĂ« tepĂ«r tregon se dikujt i nevojitet, por jo shumĂ«.
  • Modulariteti. Skaffold nuk Ă«shtĂ« njĂ« kombajn autonom, por synon tĂ« pĂ«rdorĂ« modulet tĂ« veçanta ose zgjidhje ekzistuese pĂ«r detyra tĂ« caktuara.

Illustrimi i fundit:

  • NĂ« fazĂ«n e ndĂ«rtimit mund tĂ« pĂ«rdorni:
    • docker build lokal, nĂ« klaster me kaniko ose nĂ« Google Cloud Build;
    • Bazel lokal;
    • Jib Maven dhe Jib Gradle lokal ose nĂ« Google Cloud Build;
    • skripte ndĂ«rtimi tĂ« personalizuara, tĂ« ekzekutuara lokal. NĂ«se ju nevojitet tĂ« ekzekutoni njĂ« zgjidhje tjetĂ«r (mĂ« fleksibĂ«l/tĂ« njohur/
) pĂ«r ndĂ«rtim, ajo pĂ«rshkruhet nĂ« skript, nĂ« mĂ«nyrĂ« qĂ« Skaffold tĂ« ekzekutojĂ« pikĂ«risht atĂ« (shembulli nga dokumenti). Kjo lejon pĂ«rdorimin e çdo ndĂ«rtuesi qĂ« mund tĂ« thirret pĂ«rmes skriptit;
  • NĂ« fazĂ«n e testimit, mbĂ«shtetet tashmĂ« e pĂ«rmendura container-structure-test;
  • PĂ«r deploy parashikohen:
    • Kubectl;
    • Helm;
    • kustomize.

Për këtë arsye, Skaffold mund të quhet një lloj framework për ndërtimin CI/CD. Ja një shembull i njëworkflow gjatë përdorimit të tij (nga dokumentacioni i projektit):

Rishikimi i Skaffold për zhvillimin nën Kubernetes

Si duket në mënyrë të përgjithshme puna e Skaffold?

  1. Utilita monitoron ndryshimet nĂ« drejtorinĂ« e kodit burimor. NĂ«se modifikohen skedarĂ«t, ato sinkronizohen me pod-in e aplikacionit nĂ« klusterin Kubernetes. NĂ«se Ă«shtĂ« e mundur — pa e rindĂ«rtuar imazhin. NĂ« rastin tjetĂ«r — ndĂ«rtohet njĂ« imazh i ri.
  2. Imazhi i ndërtuar kontrollohet me container-structure-test, etiketzohet dhe dërgohet në Docker Registry.
  3. Pas kĂ«saj, imazhi Ă«shtĂ« deployed — dislokuar nĂ« klusterin Kubernetes.
  4. Nëse ekzekutimi është inicializuar me komandën skaffold dev, atëherë fillojmë të marrim log-et nga aplikacioni, dhe Skaffold pret ndryshime për të rikthyer të gjitha veprimet nga e para.

Rishikimi i Skaffold për zhvillimin nën Kubernetes
Ilustrimi i fazave kryesore të punës së Skaffold

Praktika. Provojmë Skaffold

PĂ«r tĂ« demonstruar pĂ«rdorimin e Skaffold, do tĂ« marr njĂ« shembull nga repozitari GitHub i projektit. PĂ«r fat tĂ« mirĂ«, aty aty mund tĂ« gjeni edhe shumĂ« shembuj tĂ« tjerĂ«, tĂ« cilat marrin parasysh specifika tĂ« ndryshme. TĂ« gjitha veprimet do t’i kryej lokalisht nĂ« Minikube. Instalimi Ă«shtĂ« i thjeshtĂ« dhe do tĂ« marrĂ« disa minuta, dhe pĂ«r tĂ« filluar punĂ«n do tĂ« nevojitet kubectl.

Le të instalojmë 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

Do ta klonojmë repo-n e Skaffold me shembujt e nevojshëm:

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

Kam zgjedhur njĂ« shembull me dy pod-e, secili prej tĂ« cilĂ«ve pĂ«rmban njĂ« aplikacion tĂ« vogĂ«l nĂ« Go. NjĂ« aplikacion Ă«shtĂ« fronti (leeroy-web), qĂ« redakton kĂ«rkesat pĂ«r nĂ« aplikacionin e dytĂ« — prapaskenĂ« (leeroy-app). Le tĂ« shohim 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ë kod në Go dhe Dockerfile të thjeshtë për ndërtimin lokal të këtij kodi:

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

Nuk do tĂ« sjell kodin e aplikacioneve — mjafton tĂ« dini se leeroy-web pranon kĂ«rkesa dhe i proxyn ato nĂ« leeroy-app. Prandaj, nĂ« skedaret Deployment.yaml ekziston njĂ« ShĂ«rbim vetĂ«m pĂ«r app (pĂ«r ruterin e brendshĂ«m). Porta e pod-it web ne do ta kalojmĂ« vetes pĂ«r qasje tĂ« shpejtĂ« nĂ« aplikacion.

Si 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

KĂ«tu pĂ«rshkruhen tĂ« gjitha fazat e pĂ«rmendura mĂ« sipĂ«r. PĂ«rveç kĂ«tij konfigurimi Ă«shtĂ« edhe njĂ« skedar me cilĂ«sime globale — ~/.skaffold/config. Mund tĂ« redaktohet manualisht ose pĂ«rmes CLI — pĂ«r shembull, kĂ«shtu:

skaffold config set --global local-cluster true

Ky komandĂ« do tĂ« vendosĂ« njĂ« variabĂ«l globale local-cluster nĂ« vlerĂ« e vĂ«rtetĂ«, pas sĂ« cilĂ«s Skaffold nuk do tĂ« pĂ«rpiqet tĂ« ‘push’ imazhet nĂ« njĂ« regjistĂ«r tĂ« largĂ«t. NĂ«se po zhvilloni lokal, mund tĂ« pĂ«rdorni kĂ«tĂ« komandĂ« pĂ«r tĂ« ruajtur imazhet gjithashtu lokal.

TĂ« kthehemi te skaffold.yaml:

  • NĂ« etapĂ«n ndĂ«rto ne tregojmĂ« se imazhi duhet tĂ« ndĂ«rtohet dhe ruhet lokal. Pas herĂ«s sĂ« parĂ« qĂ« do tĂ« fillojĂ« ndĂ«rtimi, do tĂ« shohim si 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 të shihet, Skaffold automatikisht ka etiketuar imazhet. Përndryshe, mbështeten disa politika etiketimi.

  • MĂ« tej nĂ« konfigurim Ă«shtĂ« e specifikuar context: ./leeroy-app/, dmth. Ă«shtĂ« caktuar konteksti nĂ« tĂ« cilin ndĂ«rtohet imazhi.
  • NĂ« fazĂ«n e deploy-it pĂ«rcaktohet se do tĂ« pĂ«rdorim kubectl dhe maskĂ«n pĂ«r manifestet e nevojshme.
  • PortForward: nĂ« mĂ«nyrĂ« tĂ« ngjashme me atĂ« si zakonisht ne kalojmĂ« portet me anĂ« tĂ« kubectl port-forward, i japim udhĂ«zime Skaffold pĂ«r tĂ« thirrur kĂ«tĂ« komandĂ«. NĂ« kĂ«tĂ« rast — porta lokale 9000 kalon nĂ« 8080 nĂ« Deployment me emrin leeroy-web.

ËshtĂ« koha tĂ« fillojmĂ« skaffold dev: ekipi do tĂ« krijojĂ« njĂ« «cikĂ«l mbrapsht» vazhdues, dmth jo vetĂ«m se do tĂ« mbledhĂ« gjithçka dhe do ta deplojojĂ« nĂ« klaster, por gjithashtu do tĂ« raportojĂ« pĂ«r gjendjen e pod-Ă«ve nĂ« atĂ« moment, do tĂ« monitorojĂ« ndryshimet dhe do tĂ« pĂ«rditĂ«sojĂ« gjendjen e pod-Ă«ve.

Ja rezultati i ekzekutimit skaffold dev --port-forward gjatë rbuild-it të dytë:

Rishikimi i Skaffold për zhvillimin nën Kubernetes

SĂ« pari, duket se po pĂ«rdoret cache. MĂ« pas — aplikacioni ndĂ«rtohet, deplohet, portet kalohen. Duke qenĂ« se Ă«shtĂ« specifikuar --port-forward, Skaffold kaloi portin deri web, siç u kĂ«rkua, ndĂ«rsa app e kaloi sipas dĂ«shirĂ«s sĂ« tij (zgjodhi portin mĂ« tĂ« afĂ«rt tĂ« lirĂ«). Pas kĂ«saj, marrim log-et e para nga aplikacionet.

A do ta kontrollojmë funksionalitetin?

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

ModifikojmĂ« skedarin 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!!!

Megjithatë, Skaffold nxori në konsol të njëjtin informacion si më parë, përveç një detaji: ai e nxori vetëm leeroy-app, dhe jo të gjitha menjëherë.

Më shumë praktikë

ËshtĂ« e rĂ«ndĂ«sishme tĂ« pĂ«rmendim se kur krijoni njĂ« projekt tĂ« ri, konfigurimet pĂ«r Skaffold mund tĂ« ‘bootstrap’-ohen pĂ«rmes komandĂ«s procesi, qĂ« Ă«shtĂ« shumĂ« e pĂ«rshtatshme. Po ashtu, Ă«shtĂ« e mundur tĂ« shkruani disa konfigurime: tĂ« zhvilloni mbi konfigurimin standard, dhe mĂ« pas ta publikoni nĂ« stage me komandĂ«n run (i njĂ«jti proces si dhe dev, vetĂ«m se nuk bie nĂ«n vĂ«zhgim ndryshimet), duke pĂ«rdorur njĂ« konfigurim tjetĂ«r.

Në katacoda ka një udhëzues një shembull edhe më të thjeshtë. Atje ofrohet një tërësi e gatshme me Kubernetes, një aplikacion dhe Skaffold. Një opsion i shkëlqyer, nëse ju intereson të provoni vetë themelore.

NjĂ« nga mundĂ«sitĂ« e mundshme tĂ« pĂ«rdorimit tĂ« Skaffold Ă«shtĂ« zhvillimi nĂ« njĂ« klashtĂ«r tĂ« largĂ«t. Nuk Ă«shtĂ« komod pĂ«r tĂ« gjithĂ« qĂ« tĂ« startojnĂ« Minikube nĂ« harduerin e vet, pas sĂ« cilĂ«s publikojnĂ« aplikacionin dhe presin qĂ« ai tĂ« funksionojĂ« siç duhet
 NĂ« kĂ«tĂ« rast, Skaffold zgjidh shkĂ«lqyer problemin, çfarĂ« mund tĂ« konfirmojnĂ«, pĂ«r shembull, inxhinierĂ«t e Reddit, pĂ«r tĂ« cilin ne tashmĂ« shkruam nĂ« blogun tonĂ«.

Dhe në këtë publikim nga Weaveworks mund të gjeni një shembull të krijimit të një pipeline për production.

Përfundimi

Skaffold — njĂ« mjet i pĂ«rshtatshĂ«m pĂ«r ndĂ«rtimin e pipeline-Ă«ve qĂ« pĂ«rfshijnĂ« lançimin e aplikacioneve nĂ« Kubernetes dhe qĂ« janĂ« kryesisht tĂ« orientuara drejt nevojave tĂ« zhvillimit. Me tĂ«, Ă«shtĂ« mjaft e lehtĂ« tĂ« krijosh njĂ« pipeline "tĂ« shkurtĂ«r", qĂ« merr parasysh nevojat kryesore tĂ« zhvilluesit, por nĂ«se dĂ«shirohet, mund tĂ« organizohen edhe procese mĂ« tĂ« mĂ«dha. NjĂ« nga shembujt e dukshĂ«m tĂ« pĂ«rdorimit tĂ« Skaffold nĂ« proceset CI/CD jepet tĂ« tillĂ« projekti testues i pĂ«rbĂ«rĂ« nga 10 mikroshĂ«rbime, qĂ« pĂ«rdorin mundĂ«sitĂ« e Kubernetes, gRPC, Istio dhe OpenCensus Tracing.

Skaffold ka marrĂ« tashmĂ« pothuajse 8000+ yje nĂ« GitHub, zhvillohet nga Google dhe Ă«shtĂ« pjesĂ« e GoogleContainerTools — nĂ« pĂ«rgjithĂ«si, pĂ«r momentin ka tĂ« gjithĂ« arsyet pĂ«r tĂ« besuar se projekti do tĂ« vazhdojĂ« tĂ« zhvillohet pĂ«r njĂ« kohĂ« tĂ« gjatĂ« dhe me sukses.

P.S.

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster