Përmbledhje e Skaffold për zhvillimin nën Kubernetes

Përmbledhje e Skaffold për zhvillimin nën Kubernetes

Para njĂ« vit e gjysmĂ«, mĂ« 5 mars 2018, kompania Google publikoi versionin e parĂ« alfa tĂ« projektit tĂ« saj Open Source pĂ«r CI/CD tĂ« quajtur Skaffold, e cila kishte si qĂ«llim krijimin e njĂ« zhvillimi "tĂ« thjeshtĂ« dhe tĂ« riprodhueshĂ«m nĂ«n Kubernetes", nĂ« mĂ«nyrĂ« qĂ« zhvilluesit tĂ« pĂ«rqendrohen nĂ« zhvillim, e jo nĂ« administrim. ÇfarĂ« e bĂ«n Skaffold interesant? Siç duket, ai ka disa aspekte tĂ« favorshme nĂ« tĂ« cilat mund tĂ« bĂ«het njĂ« mjet i fortĂ« pĂ«r zhvilluesin, madje dhe pĂ«r inxhinierin e operacioneve. Le tĂ« njihemi me projektin dhe mundĂ«sitĂ« e tij.

NB: Për rastin, ne kemi folur shkurtimisht për Skaffold në përmbledhjen tonë të mjeteve për zhvilluesit, jetët e të cilëve lidhen me Kubernetes.

Teoria. Qëllimi dhe mundësitë

Pra, nëse flasim përgjithësisht, Skaffold zgjidh problemin e automatizimit të ciklit CI/CD (në fazat e build, push, deploy), duke ofruar zhvilluesit reagim të shpejtë, dmth. mundësinë për të marrë shpejt rezultate të ndryshimeve të kodit - në formën e aplikacioneve të përditësuara, që funksionojnë në klasterin Kubernetes. Po ashtu, ai mund të funksionojë në konture të ndryshme (dev, stage, production...), për të cilat Skaffold ndihmon në përshkrimin e pipelines për publikim.

Kodi burimor i Skaffold është shkruar në gjuhën Go, shpërndahet në kushtet e licencës së lirë Apache License 2.0 (GitHub).

Le të shqyrtojmë funksionet dhe karakteristikat kryesore. Të parat përfshijnë:

  • Skaffold ofron mjete pĂ«r krijimin e pipelines CI/CD.
  • Lejon qĂ« nĂ« sfond tĂ« monitorojĂ« ndryshimet nĂ« kodin burimor dhe tĂ« nisin 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Ă« repozitor me katalogun punues nĂ« kontejner.
  • Automatikisht teston me ndihmĂ«n e container-structure-test.
  • Rreth portet.
  • Lexon log-et e aplikacionit tĂ« nisur nĂ« kontejner.
  • Ndihmon nĂ« depurimin e aplikacioneve tĂ« shkruara nĂ« Java, Node.js, Python, Go.

Tani - për karakteristikat:

  • Skaffold nuk ka komponente nĂ« anĂ«n e klasterit. Pra, nuk Ă«shtĂ« e nevojshme tĂ« konfiguroni pĂ«r mĂ« shumĂ« Kubernetes pĂ«r tĂ« pĂ«rdorur kĂ«tĂ« utilitet.
  • Different pipelines pĂ«r aplikacionin tuaj. Duhet tĂ« publikoni kodin nĂ« Minikube lokal, ndĂ«rsa jeni duke zhvilluar, dhe mĂ« pas - nĂ« stage ose production? PĂ«r kĂ«tĂ« janĂ« parashikuar profile dhe konfigurimet e pĂ«rdoruesve, variablat e mjedisit dhe flamujt, qĂ« lejojnĂ« pĂ«rshkrimin e pipeline-ve tĂ« ndryshme pĂ«r njĂ« aplikacion tĂ« vetĂ«m.
  • CLI. VetĂ«m utilitar konsolĂ« dhe konfigurime nĂ« YAML. NĂ« internet mund tĂ« gjeni pĂ«rmendje tĂ« pĂ«rpjekjeve pĂ«r tĂ« krijuar njĂ« GUI eksperimental, megjithatĂ«, aktualisht kjo do tĂ« thotĂ« se dikush e ka nevojĂ« pĂ«r atĂ«, por jo shumĂ«.
  • Modulariteti. Skaffold nuk Ă«shtĂ« njĂ« kombinator i pavarur, por synon tĂ« pĂ«rdorĂ« module tĂ« veçanta ose zgjidhje ekzistuese pĂ«r detyra specifike.

Ilustrimi i fundit:

  • NĂ« fazĂ«n e ndĂ«rtimit mund tĂ« pĂ«rdoren:
    • 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Ă« cilat ekzekutohen lokal. NĂ«se ju nevojitet tĂ« ekzekutoni njĂ« zgjidhje tjetĂ«r (mĂ« fleksibĂ«l / tĂ« njohur / 
) pĂ«r ndĂ«rtim, ajo pĂ«rshkruhet nĂ« skriptin qĂ« Skaffold e ekzekuton atĂ« (shembuj nga dokumentacioni). Kjo lejon pĂ«rdorimin e çdo ndĂ«rtuesi qĂ« mund tĂ« thirret me anĂ« tĂ« skriptit;
  • NĂ« fazĂ«n e testimit pĂ«rkrahĂ«t testi i pĂ«rmendur mĂ« parĂ« container-structure-test;
  • PĂ«r deploy janĂ« parashikuar:
    • Kubectl;
    • Helm;
    • kustomize.

Falë kësaj, Skaffold mund të quhet një lloj kornizë për ndërtimin e CI / CD. Ja një shembull i një procesi të punës gjatë përdorimit të tij (nga dokumentacioni i projektit):

Përmbledhje e Skaffold për zhvillimin nën Kubernetes

Si duken në përgjithësi veprimet e Skaffold?

  1. Utilitarja monitoron ndryshimet nĂ« direktorinĂ« e kodit burimor. NĂ«se ndodhin modifikime nĂ« skedarĂ«, ato sinkronizohen me pod-in e aplikacionit nĂ« klasterin Kubernetes. NĂ«se Ă«shtĂ« e mundur — pa ndĂ«rtuar njĂ« imazh tĂ« ri. NĂ« tĂ« kundĂ«rt, njĂ« imazh i ri ndalohet.
  2. Imagini i ndërtuar kontrollohet me container-structure-test, etiketizohet dhe dërgohet në Docker Registry.
  3. Pas kĂ«saj, imazhi niset — zbatohet nĂ« klasterin Kubernetes.
  4. Nëse nisja është iniciuar me komandën skaffold dev, atëherë fillojmë të marrim log-et nga aplikacioni, ndërsa Skaffold pret ndryshime për të përsëritur të gjitha veprimet nga fillimi.

Përmbledhje e 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 i projektit në GitHub. Për më tepër, atje gjithashtu mund të gjeni edhe shumë shembuj të tjerë, duke marrë parasysh specifikën e ndryshme. Të gjitha veprimet do t'i kryej lokal në Minikube. Instalimi është i thjeshtë dhe do të zgjasë disa minuta, dhe për të filluar 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 të klonojmë repositorin e Skaffold-së me shembujt e nevojshëm:

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

Kam zgjedhur një shembull me dy podë, secili prej të cilëve përmban një aplikacion të vogël në Go. Një aplikacion është frontend (leeroy-web), që redirekton kërkesat në aplikacionin tjetër - backend (leeroy-app). Le të shohim se si duket kjo:

~/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 në Go dhe Dockerfile të thjeshta për mbledhjen lokale 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 - është e mjaftueshme të dinë se leeroy-web pranon kërkesa dhe i proksionon ato në leeroy-app. Prandaj, në skedarët Deployment.yaml ekziston një Shërbim vetëm për app (për rutimin e brendshëm). Porta e pod-it web do ta kalojmë 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ësaj konfig , ka edhe një skedar me cilësime globale - ~/ .skaffold/config. Mund ta redaktoni 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ën true, pas së cilës Skaffold nuk do të përpiqet të 'dërgojë' imazhet në një regjistër të largët. Nëse jeni duke zhvilluar lokal, mund të përdorni këtë komandë për të ruajtur imazhet gjithashtu lokal.

Le të kthehemi te skaffold.yaml:

  • NĂ« fazĂ«n build ne tregojmĂ« se tĂ« ndĂ«rtojmĂ« dhe ruajmĂ« imazhin duhet tĂ« jetĂ« lokal. Pas herĂ«s sĂ« parĂ« qĂ« do tĂ« fillojĂ« ndĂ«rtimi, do tĂ« shohim ndodhi tĂ« mĂ«poshtme:
    // т.Đș. 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 duket, Skaffold ka etiketuar imazhet vetë. Për më tepër, mbështeten disa politika etiketimi.

  • MĂ« pas, nĂ« konfigurim Ă«shtĂ« e specifikuar context: .\/leeroy-app\/, pra Ă«shtĂ« caktuar konteksti nĂ« tĂ« cilin ndĂ«rtohet imazhi.
  • NĂ« fazĂ«n e shpĂ«rndarjes, pĂ«rcaktohet se do tĂ« pĂ«rdorim kubectl dhe masĂ«n pĂ«r manifestet e nevojshme.
  • PortForward: nĂ« mĂ«nyrĂ« tĂ« ngjashme me atĂ« siç zakonisht kalojmĂ« portet pĂ«rmes 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Ă« Deploymentin me emrin leeroy-web.

ËshtĂ« koha tĂ« fillojmĂ« skaffold dev: komanda do tĂ« krijojĂ« njĂ« "cikĂ«l tĂ« vazhdueshĂ«m feedback-u", pra jo vetĂ«m qĂ« do tĂ« ndĂ«rtojĂ« gjithçka dhe do ta shpĂ«rndajĂ« nĂ« klaster, por gjithashtu do tĂ« raportojĂ« pĂ«r gjendjen e podĂ«ve nĂ« kĂ«tĂ« moment, do tĂ« monitorojĂ« ndryshimet dhe do tĂ« azhurnojĂ« gjendjen e podĂ«ve.

Këtu është rezultati i lançimit skaffold dev --port-forward në ndërtim të përsëritur:

Përmbledhje e Skaffold për zhvillimin nën Kubernetes

Së pari, duket qartë se po përdoret memoria cache. Më pas, aplikacioni ndërtohet, shpërndahet, portet kalohen. Duke qenë se është e specifikuar --port-forward, Skaffold kaloi portin siç ia kërkuam, dhe ja webai e kaloi sipas dëshirës së vet (zgjodhi më të afërtin të lirë). Pas kësaj, marrim logët e para nga aplikacionet. app Të kontrollojmë funksionalitetin?

~\/skaffold\/examples\/microservices # kubectl get po\nNAME READY STATUS RESTARTS AGE\nleeroy-app-6998dfcc95-2nxvf 1\/1 Running 0 103s\nleeroy-web-69f7d47c9d-5ff77 1\/1 Running 0 103s\n~\/skaffold\/examples\/microservices # curl localhost:9000\nleeroooooy app!!!

Modifikojmë skedarin

leeroy-app\/app.go — kalojnĂ« disa sekonda
 dhe: ~\/skaffold\/examples\/microservices # kubectl get po\nNAME READY STATUS RESTARTS AGE\nleeroy-app-ffd79d986-l6nwp 1\/1 Running 0 11s\nleeroy-web-69f7d47c9d-5ff77 1\/1 Running 0 4m59s\n~\/skaffold\/examples\/microservices # curl localhost:9000\nleeroooooy Habr!!!

Në të njëjtën kohë, vetë Skaffold printoi në konsolën e njëjtën gjë si më parë, përveç një momenti: ai nxori vetëm

, e jo gjithçka menjëherë. leeroy-appMë shumë praktikë

Duhet të përmendet gjithashtu se kur krijoni një projekt të ri, konfigurimet për Skaffold mund të bootstrapped me komandën

, që është shumë e përshtatshme. Për më tepër, mund të shkruani disa konfigurime: të zhvilloni në konfigurimin e paracaktuar, pas së cilës të kaloni në stage me komandën init(të njëjtin proces, që dhe run (po e njëjta procedurë, vetëm që nuk monitoron ndryshimet), duke përdorur një konfigurim tjetër. devNë katacoda ka

udhëzime manual me shumë thjeshtë. Por atje ofrohet një sandbox i gatshëm me Kubernetes, një aplikacion dhe Skaffold. Një opsion i shkëlqyer nëse jeni të interesuar të provoni vetë bazat.

NjĂ« nga mundĂ«sitĂ« pĂ«r tĂ« pĂ«rdorur Skaffold Ă«shtĂ« zhvillimi nĂ« njĂ« klasĂ«r tĂ« largĂ«t. Nuk Ă«shtĂ« e lehtĂ« pĂ«r tĂ« gjithĂ«ve tĂ« nisin Minikube nĂ« harduerin e tyre dhe mĂ« pas tĂ« nxjerrin aplikacionin duke pritur funksionimin e tij tĂ« duhur
 NĂ« kĂ«tĂ« rast, Skaffold zgjidh shkĂ«lqyeshĂ«m detyrĂ«n e paraqitur, siç mund tĂ« konfirmojnĂ«, pĂ«r shembull, inxhinierĂ«t e Reddit, pĂ«r tĂ« cilĂ«t ne tashmĂ« kemi shkruar nĂ« blogun tonĂ«.

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

Përfundim

Skaffold është një mjet i përshtatshëm për ndërtimin e pipeline-ve, që nënkupton nxjerrjen e aplikacioneve në Kubernetes dhe është kryesisht i orientuar drejt nevojave të zhvillimit. Me të, është mjaft e lehtë të krijoni një pipeline "të shkurtër", që merr parasysh nevojat bazë të zhvilluesit, por nëse dëshironi, mund të organizoni edhe procese më të mëdha. Si një nga shembujt e dukshëm të përdorimit të Skaffold në proceset CI/CD shkruhet një projekt prove me 10 mikroshërbime, që përdorin mundësitë e Kubernetes, gRPC, Istio dhe OpenCensus Tracing.

Skaffold ka marrë tashmë mbi 8000 yje në GitHub, zhvillohet nga Google dhe është pjesë e GoogleContainerTools - në përgjithësi, në këtë moment ka të gjitha arsyet për të besuar se projekti do të zhvillohet gjatë dhe me sukses.

P.S.

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Bleni hostin e besueshĂ«m pĂ«r faqet me mbrojtje nga DDoS, VPS VDS servera đŸ”„ Bli hostin e besueshĂ«m pĂ«r faqet me mbrojtje nga DDoS, VPS VDS servera | ProHoster