Skaffoldi ülevaade Kubernetes'i arendamiseks

Skaffoldi ülevaade Kubernetes'i arendamiseks

Poolteist aastat tagasi, 5. märtsil 2018, tõi Google turule oma Open Source projekti CI/CD jaoks nimega Skaffold, mille eesmärk oli luua "lihtne ja uuendatav arendus Kubernetesel", et arendajad saaksid keskenduda tõeliselt arendusele, mitte haldamisele. Miks võiks Skaffold huvi pakkuda? Selgus, et sellel on mitmeid trumpe varrukas, mis aitavad tal saada tugevaks tööriistaks arendajale ning võib-olla ka süsteemiadministraatorile. Tutvume projekti ja selle võimalustega.

NB: Muide, oleme juba lühidalt rääkinud Skaffoldist meie üldises arendustööriistade ülevaates, mille elu on seotud Kubernetesega.

Teooria. Eesmärk ja võimalused

Nii et üldiselt öeldes, Skaffold lahendab CI/CD tsükli automatiseerimise ülesanne (build, push, deploy etappidel), pakkudes arendajale operatiivset tagasisidet, st võimalust kiiresti saada tulemusi järgmiste koodimuudatusete osas - värskendatud rakenduse näol, mis töötab Kubernetes klastris. Ja see võib töötada erinevates keskkondades (dev, stage, production...), mille jaoks Skaffold aitab kirjeldada sobivaid pipeline'e.

Skaffoldi allikakood on kirjutatud Go keeles, levitatakse vabade litsentsi Apache License 2.0 (GitHub) tingimustel.

Vaatame peamisi funktsioone ja omadusi. Esimeste hulka kuuluvad järgmised:

  • Skaffold pakub tööriistu CI/CD pipeline'ide loomiseks.
  • Lubab ajalises režiimis jälgida muutusi allikakoodis ja käivitada automatiseeritud koodi ehitamise protsessi konteineripiltide loomiseks, nende publitseerimiseks Docker Registry's ning nende juurutamiseks Kubernetes klastris.
  • Sünkroneerib failid repositsioonis konteineris töötava töökataloogiga.
  • Automaatne testimine container-structure-test abil.
  • Suunab porte.
  • Loeb konteineris töötava rakenduse logisid.
  • Aitab rakenduste tõrkeotsingul, mis on kirjutatud Java, Node.js, Python, Go.

Nüüd - omadustest:

  • Skaffoldil endal ei ole komponente klastripoolsel küljel. See tähendab, et Kubernetesit ei pea selle utiliidi kasutamiseks lisateenuse leiutamisega kohandama.
  • Erinevad pipeline'id teie rakendusele. Kas peate koodi väljitama kohalikku Minikube'i, samas kui te arendate, ja seejärel - stage või production? Selle jaoks on ette nähtud isoleerimise profiilid ja kasutajate konfiguratsioonid, keskkonnamuutujad ja lipud, mis võimaldavad kirjeldada erinevaid vooge ühe rakenduse jaoks.
  • cli-runtime'is ja kubectl'is. Ainult konsooli utiliit ja konfiguratsioonid YAML-is. Võrgus võib leida mainimisi katsetest luua katsetatud GUI, kuid praegu tähendab see pigem, et kellelegi on see vajalik, kuid mitte väga.
  • Modulaarsus. Skaffold ei ole iseseisev kombain, vaid püüab kasutada eraldi module või juba olemasolevaid lahendusi konkreetsete ülesannete jaoks.

Viimane näide:

  • Kogumise etapis võib kasutada:
    • docker build kohapeal, klastris kaniko abil või Google Cloud Buildis;
    • Bazel kohapeal;
    • Jib Maven ja Jib Gradle kohapeal või Google Cloud Buildis;
    • kohandatud build-skripte, mida käivitatakse kohapeal. Kui on vaja käivitada mõni muu (paindlikum / tuttavam /…) lahendus, on see kirjas skriptil, et Skaffold käivitaks just selle (CSIInlineVolume). See võimaldab kasutada tegelikult ükskõik millisest ehitajast, mida saab skripti abil kutsuda;
  • Testimise etapis toetatakse juba mainitud container-structure-test;
  • Deployimiseks on ette nähtud:
    • Kubectl;
    • Helm;
    • kustomize.

Selle tõttu saab Skaffoldi nimetada omamoodi CI/CD raamistiku. Siin on näide tööprotsessist selle kasutamisel (projekti dokumentatsioonist):

Skaffoldi ülevaade Kubernetes'i arendamiseks

Kuidas näeb Skaffoldi töö üldiselt välja?

  1. Utiliit jälgib lähtekoodikaustas toimuvaid muudatusi. Kui failidesse tehakse muudatusi, sünkroonitakse need rakenduse pod'iga Kuberneteses. Kui see on võimalik - ilma pildi ümberkogumiseta. Vastupidisel juhul koostatakse uus pilt.
  2. Koostatud pilti kontrollitakse container-structure-test'i abil, märgistatakse ja saadetakse Docker Registry'sse.
  3. Pärast seda pilt deployitakse - käivitatakse Kuberneteses.
  4. Kui käivitamine algatati käsu skaffold dev, hakkame saama rakenduse logisid, ja Skaffold ootab muudatusi, et korrata kõiki toiminguid uuesti.

Skaffoldi ülevaade Kubernetes'i arendamiseks
Skaffoldi töö põhietappide illustreerimine

Praktika. Proovime Skaffoldi

Skaffoldi kasutamise demonstreerimiseks võtan näite projekti GitHubi repolt. Ükskõik, seal samas saab leida ka palju teisi näiteid, mis arvestavad erinevat spetsifikatsiooni. Kõiki toiminguid teostan kohapeal Minikube'is. Installatsioon on lihtne ja võtab vaid paar minutit, ning töö alustamiseks on vajalik kubectl.

Installime Skaffoldi:

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

Kloonime endale Skaffold'i repositooriumi vajalike näidistega:

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

Valisin näite kahe pod'iga, millest kummaski on üks väike Go rakendus. Üks rakendus on frontend (leeroy-web), mis suunab päringud teise rakendusse — backend (leeroy-app). Vaadakem, kuidas see välja näeb:

~/.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 katalooge, 8 faili

leeroy-app ja leeroy-web sisaldavad Go koodi ja lihtsaid Dockerfile'e selle koodi kohalikuks ehitamiseks:

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

Rakenduste koodi tooma ei hakka — piisab teadas, et leeroy-web vastab päringutele ja suunab need edasi leeroy-app. Seetõttu on failides Deployment.yaml ainult teenus olemas app (sisekasutuseks marsruudistamiseks). Pod'i porti web suuname kiireks juurdepääsuks rakendusele.

Kuidas see välja näeb 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

Siin on kirjas kõik etapid, mida varem mainiti. Lisaks sellele konfiguratsioonile on olemas ka fail globaalsete seadistustega — ~/.skaffold/config. Seda saab redigeerida käsitsi või CLI kaudu — näiteks nii:

skaffold config set --global local-cluster true

See käsk seab globaalse muutuja local-cluster väärtuseks true, pärast mida Skaffold ei püüa pilte kaugarhi push’ida. Kui arendate kohapeal, võite selle käsu kasutada, et salvestada pilte samuti kohapeal.

Naaseme skaffold.yaml:

  • Etapis build meie puhul määratleme, et pilt tuleb koguda ja salvestada kohapeal. Pärast esmakordset ehituse käivitamist näeme järgmist:
    // т.к. 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

    Nagu näha, on Skaffold ise pildid sildistanud. Üksikasjana on toetatud mitmeid sildistamisstrateegiaid.

  • Jätkuks konfiguratsioonis on määratud context: ./leeroy-app/, st määratud kontekst, milles pilti ehitatakse.
  • Deployimise etapis määratakse, et kasutame kubectl'i ja sobivaid manifeste.
  • PortForward: sarnaselt sellele, kuidas tavaliselt suuname porte läbi kubectl port-forward, anname Skaffoldile juhised selle käsu käivitamiseks. Antud juhul suunatakse kohalik port 9000 8080-le määratud Deployment'is nimega leeroy-web.

On just õige aeg alustada skaffold dev: käsk loob pideva "tagasiside tsükli", st mitte ainult ei kogu kõike ja deplooi klastrisse, vaid ka teatab pod'ide hetkeseisust, jälgib muutusi ja uuendab pod'ide olekut.

Siin on käivitamise tulemus skaffold dev --port-forward uuesti buildides:

Skaffoldi ülevaade Kubernetes'i arendamiseks

Esiteks, on näha, et kasutatakse vahemälu. Edasi - rakendus kogutakse, deplooinitakse, portide suunamine toimub. Kuna on määratud --port-forward, Skaffold suunas portaadi nagu palutud, kuid webta suunas oma äranägemise järgi (valis lähima vaba). Pärast seda saame esimesed logid rakendustelt. app Kontrollime töökindlust?

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

Muudame faili

leeroy-app\/app.go — möödub paar sekundit… ja: ~\/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!!!

Skaffold kuvab konsoolis sama, mis enne, välja arvatud üks asi: ta näitas ainult

, mitte kõike korraga. leeroy-appRohkem praktikat

Tasub mainida, et uue projekti loomisel saab Skaffoldi config'e luua käsu abil

, mis on väga mugav. Samuti võib kirjutada mitu config'i: arendada vaikimisi config'i alusel ja seejärel luua staadiumis käsuga — algne ettevalmistus enne juurutamist, siin võib olla kõike: sõltuvuste allalaadimist, saladuste lahtipakkimist ja muud.(sama protsess, mis run , lihtsalt ei jälgi muutusi), kasutades teist config'i. devKatacoda's on

lihtsam näide. Seal on juba valmis liivakasti Kubernetes, rakendus ja Skaffold. Suurepärane variant, kui soovite iseseisvalt proovida põhiteadmisi. juhend on

Üks võimalik rakendus Skaffoldi kasutamiseks on arendamine kaugklastri peal. Mitte kõigile ei meeldi käivitada Minikube enda seadmetel, et seejärel rakendust välja panna ja oodata selle korrektset toimimist... Sellisel juhul lahendab Skaffold suurepäraselt seatud ülesande, mida võivad kinnitada näiteks Redditi insenerid, millest me juba me meie blogist.

Ja selle väljaande Weaveworksilt võib leida näite tootmisprotsessi torujuhtme loomisest.

Kokkuvõte

Skaffold on mugav tööriist torujuhtmete koostamiseks, mis hõlmavad rakenduste väljalaskmist Kuberneteses ja keskenduvad peamiselt arenduse vajadustele. Sellega on üsna lihtne luua "lühi" torujuhe, mis arvestab arendaja põhinõudmisi, kuid soovi korral saab korraldada ka suuremaid protsesse. Ühe näitlikuna Skaffoldi kasutamisest CI/CD protsessides toodud niisugust testprojekt 10 mikroteenusega, mis kasutavad Kubernetes, gRPC, Istio ja OpenCensus jälgimist.

Skaffold on juba saanud peaaegu 8000+ tähte GitHubis, seda arendab Google ja see kuulub GoogleContainerTools — üldiselt on hetkel kõik põhjused arvata, et projekt areneb kaua ja edukalt.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster