
Aproape un an și jumătate în urmă, pe 5 martie 2018, compania Google a lansat prima versiune alpha a proiectului său Open Source pentru CI/CD numit , cu scopul de a crea „dezvoltare simplă și reproducescibilă pe Kubernetes”, astfel încât dezvoltatorii să se poată concentra asupra dezvoltării, nu asupra administrării. Ce poate fi interesant la Skaffold? Se pare că are câteva atuuri în mânecă, datorită cărora poate deveni un instrument puternic atât pentru dezvoltatori, cât și pentru inginerii de operare. Să ne familiarizăm cu proiectul și capacitățile sale.
NB: Apropo, am discutat pe scurt despre Skaffold în , ale căror vieți sunt legate de Kubernetes.
Teorie. Scop și capacități
Așadar, vorbind în general, Skaffold rezolvă problema automatizării ciclului CI/CD (în etapele build, push, deploy), oferind dezvoltatorului feedback rapid, adică posibilitatea de a primi repede rezultatul modificărilor de cod – sub forma unei aplicații actualizate, care funcționează în clusterul Kubernetes. Și aceasta poate funcționa în diferite medii (dev, stage, production…), pentru care Skaffold ajută la descrierea pipeline-urilor corespunzătoare pentru livrare.
Codul sursă Skaffold este scris în limbajul Go, sub licența gratuită Apache License 2.0 (GitHub).
Să analizăm funcțiile și caracteristicile principale. La primele se pot adăuga următoarele:
- Skaffold oferă unelte pentru crearea de pipeline-uri CI/CD.
- Permite monitorizarea în fundal a modificărilor din codul sursă și inițierea unui proces automatizat de compilare a codului în imagini de containere, publicarea acestor imagini în Docker Registry și desfășurarea lor în clusterul Kubernetes.
- Sincronizează fișierele din repository cu directorul de lucru din container.
- Testează automat cu ajutorul container-structure-test.
- Redirecționează porturile.
- Citește logurile aplicației care rulează în container.
- Ajută la depanarea aplicațiilor scrise în Java, Node.js, Python, Go.
Acum – despre particularități:
- Skaffold în sine nu are componente pe partea cluster-ului. Adică nu este necesară configurarea suplimentară a Kubernetes pentru a folosi acest utilitar.
- Diverse pipeline-uri pentru aplicația ta. Este nevoie să desfășori codul în Minikube local în timpul dezvoltării, iar ulterior – pe stage sau production? Acest lucru este prevăzut. și configurațiile utilizatorului, variabilele de mediu și flag-urile care permit descrierea diferitelor pipeline-uri pentru o aplicație.
- CLI. Numai utilitarul de linie de comandă și configurațiile în YAML. Pe internet se pot găsi mențiuni despre încercările de a crea , dar, în prezent, aceasta înseamnă mai degrabă că este necesar pentru cineva, dar nu foarte.
- Modularitate. Skaffold nu este un combine autonom, ci tinde să folosească module separate sau soluții deja existente pentru sarcini specifice.
Ilustrarea ultimei:
- În etapa de construcție se poate folosi:
- docker build local, în cluster cu kaniko sau în Google Cloud Build;
- Bazel local;
- Jib Maven și Jib Gradle local sau în Google Cloud Build;
- scripturi de build personalizate, rulate local. Dacă trebuie să rulați o altă soluție (mai flexibilă / obișnuită /…) pentru construcție, aceasta este descrisă în script, astfel încât Skaffold să o ruleze anume pe aceasta (). Aceasta permite utilizarea oricărui build-er care poate fi apelat printr-un script;
- În etapa de testare este suportat deja menționat ;
- Pentru deployment sunt prevăzute:
- Kubectl;
- Helm;
- kustomize.
Datorită acestui lucru, Skaffold poate fi numit un fel de framework pentru construcția CI/CD. Iată un exemplu de flux de lucru când este utilizat (din documentația proiectului):

Cum arată, în linii mari, funcționarea Skaffold?
- Utilitarul monitorizează modificările din directorul cu codul sursă. Dacă fișierele sunt modificate, acestea sunt sincronizate cu pod-ul aplicației în clusterul Kubernetes. Dacă este posibil — fără a reconstrui imaginea. În caz contrar — se construiește o nouă imagine.
- Imaginea construită este verificată cu ajutorul container-structure-test, etichetată și trimisă în Docker Registry.
- După aceea, imaginea este deploy-uită — desfășurată în clusterul Kubernetes.
- Dacă execuția a fost inițiată prin comanda
skaffold dev, atunci începem să primim jurnalele de la aplicație, iar Skaffold așteaptă modificări pentru a repeta toate acțiunile din nou.

Ilustrarea etapelor principale de lucru ale Skaffold
Practică. Încercăm Skaffold
Pentru a demonstra utilizarea Skaffold, voi lua un exemplu din . Apropo, se pot găsi și multe alte exemple, care iau în considerare diverse specificități. Toate acțiunile le voi efectua local în Minikube. Instalarea este simplă și durează câteva minute, iar pentru a începe, va fi necesar kubectl.
Să instalăm 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.1Vom să clonăm repository-ul Skaffold cu exemplele necesare:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesAm ales exemplul cu două poduri, fiecare având câte o aplicație mică scrisă în Go. O aplicație este frontend (leeroy-web), care redirecționează cererile către a doua aplicație, backend (leeroy-app). Să vedem cum arată:
~/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 directorii, 8 fișiereleeroy-app și leeroy-web conțin cod scris în Go și Dockerfile-uri simple pentru a construi local acest cod:
~/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 . Nu voi prezenta codul aplicațiilor — este suficient să știți că leeroy-web primi cereri și le va procesa la leeroy-app. Așadar, în fișierele Deployment.yaml există un Service doar pentru app (pentru rutare internă). Portul pod-ului web îl vom expune pentru acces rapid la aplicație.
Cum arată 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 Aici sunt descrise toate etapele menționate mai sus. În afară de acest config, există și un fișier cu setări globale — ~/ .skaffold/config. Acesta poate fi editat manual sau prin CLI — de exemplu, astfel:
skaffold config set --global local-cluster true Această comandă va seta o variabilă globală local-cluster to the value true, după care Skaffold nu va mai încerca să push-uiască imaginile în registry-ul remote. Dacă dezvoltați local, puteți folosi această comandă pentru a stoca imaginile și local.
Să ne întoarcem la skaffold.yaml:
- La etapa
buildspecificăm că trebuie să construim și să stocăm imaginea local. După prima rulare a construcției, vom vedea următoarele:// т.к. 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.1MBCum se poate observa, Skaffold a etichetat automat imaginile. Apropo, mai multe politici de etichetare sunt suportate.
- Mai departe, în config este specificat
context: ./leeroy-app/, adică a fost setat contextul în care imaginea este construită. - În etapa de desfășurare, se stabilește că vom folosi kubectl și un șablon pentru manifeștele necesare.
-
PortForward: similar cu modul în care de obicei extindem porturile folosindkubectl port-forward, oferim instrucțiuni lui Skaffold pentru a executa această comandă. În acest caz, portul local 9000 este redirecționat către 8080 în Deployment-ul cu numeleleeroy-web.
Este timpul să lansăm skaffold dev: comanda va crea un „ciclul de feedback” continuu, adică nu doar va construi și desfășura in cluster, dar va raporta și starea pod-urilor în acest moment, va monitoriza schimbările și va actualiza starea pod-urilor.
Iată rezultatul lansării skaffold dev --port-forward la o reconstrucție:

În primul rând, se poate observa că este folosit cache-ul. Apoi, aplicația este construită, desfășurată, și porturile sunt redirecționate. Deoarece este specificat --port-forward, Skaffold a redirecționat portul la web, așa cum a fost solicitat, dar app a redirecționat după bunul său plac (a ales cel mai apropiat port liber). După aceasta, obținem primele jurnale de la aplicații.
Să verificăm funcționalitatea?
~ /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!!! Modificăm fișierul leeroy-app /app.go — trec câteva secunde… și:
~ /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 același timp, Skaffold a afișat în consolă același lucru ca și înainte, cu excepția unui moment: a afișat doar leeroy-app, nu totul simultan.
Mai multă practică
Merită menționat și faptul că, atunci când se creează un nou proiect, configurațiile pentru Skaffold pot fi 'bootstrap'-uite cu ajutorul comenzii init, ceea ce este foarte convenabil. De asemenea, se pot scrie mai multe configurații: se poate dezvolta pe configurația implicită, după care se poate desfășura pe stage cu comanda run (același proces ca și dev, doar că nu monitorizează modificările), folosind o altă configurație.
Pe katacoda există un exemplu și mai simplu. În schimb, acolo este oferit un mediu de lucru gata făcut cu Kubernetes, o aplicație și Skaffold. O opțiune excelentă dacă ești interesat să încerci singur cele mai elementare concepte.
Una dintre posibilitățile de utilizare a Skaffold este dezvoltarea pe un cluster la distanță. Nu tuturor le convine să ruleze Minikube pe propriul hardware, apoi să implementeze aplicația și să aștepte un funcționament adecvat... În acest caz, Skaffold rezolvă excelent problema, ceea ce poate fi confirmat, de exemplu, de inginerii Reddit, despre care am discutat deja în blogul nostru.
Iar în de la Weaveworks poate găsi un exemplu de creare a unui pipeline pentru producție.
Concluzie
Skaffold este un instrument convenabil pentru construirea pipeline-urilor, care implică implementarea aplicațiilor în Kubernetes și se concentrează în primul rând pe nevoile de dezvoltare. Este destul de simplu să creezi un «pipeline scurt», care să țină cont de nevoile de bază ale dezvoltatorului, dar, dacă este dorit, pot fi organizate și procese mai extinse. Ca unul dintre exemplele clare de aplicare a Skaffold în procesele CI/CD un astfel de din 10 microservicii, care utilizează capacitățile Kubernetes, gRPC, Istio și OpenCensus Tracing.
Skaffold a obținut deja aproape 8000+ de stele pe GitHub, este dezvoltat de Google și face parte din — în general, în prezent există toate motivele să credem că proiectul va continua să se dezvolte mult și bine.
P.S.
Citiți și în blogul nostru:
- «»;
- «»;
- «»;
- «».
Sursa: habr.com
