
Poolteist aastat tagasi, 5. märtsil 2018, tõi Google turule oma Open Source projekti CI/CD jaoks nimega , 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 , 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, 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 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 , 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 (). See võimaldab kasutada tegelikult ükskõik millisest ehitajast, mida saab skripti abil kutsuda;
- Testimise etapis toetatakse juba mainitud ;
- 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):

Kuidas näeb Skaffoldi töö üldiselt välja?
- 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.
- Koostatud pilti kontrollitakse container-structure-test'i abil, märgistatakse ja saadetakse Docker Registry'sse.
- Pärast seda pilt deployitakse - käivitatakse Kuberneteses.
- Kui käivitamine algatati käsu
skaffold dev, hakkame saama rakenduse logisid, ja Skaffold ootab muudatusi, et korrata kõiki toiminguid uuesti.

Skaffoldi töö põhietappide illustreerimine
Praktika. Proovime Skaffoldi
Skaffoldi kasutamise demonstreerimiseks võtan näite . Ükskõik, 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.1Kloonime endale Skaffold'i repositooriumi vajalike näidistega:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesValisin 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 failileeroy-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
buildmeie 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.1MBNagu 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äbikubectl port-forward, anname Skaffoldile juhised selle käsu käivitamiseks. Antud juhul suunatakse kohalik port 9000 8080-le määratud Deployment'is nimegaleeroy-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:

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. 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 meie blogist.
Ja 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 niisugust 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 — üldiselt on hetkel kõik põhjused arvata, et projekt areneb kaua ja edukalt.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
