Recenzia Skaffold pentru dezvoltare sub Kubernetes

Recenzia Skaffold pentru dezvoltare sub Kubernetes

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 Skaffold, 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 recenzia noastră generală asupra instrumentelor pentru dezvoltatori, 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, se răspândește 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. profiluri ș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 un GUI experimental, 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 (exemplu din documentație). Aceasta permite utilizarea oricărui build-er care poate fi apelat printr-un script;
  • În etapa de testare este suportat deja menționat container-structure-test;
  • 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):

Recenzia Skaffold pentru dezvoltare sub Kubernetes

Cum arată, în linii mari, funcționarea Skaffold?

  1. 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.
  2. Imaginea construită este verificată cu ajutorul container-structure-test, etichetată și trimisă în Docker Registry.
  3. După aceea, imaginea este deploy-uită — desfășurată în clusterul Kubernetes.
  4. 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.

Recenzia Skaffold pentru dezvoltare sub Kubernetes
Ilustrarea etapelor principale de lucru ale Skaffold

Practică. Încercăm Skaffold

Pentru a demonstra utilizarea Skaffold, voi lua un exemplu din repozitoriul GitHub al proiectului. Apropo, la fel 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.1

Vom să clonăm repository-ul Skaffold cu exemplele necesare:

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

Am 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șiere

leeroy-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 build specifică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.1MB

    Cum 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 folosind kubectl 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 numele leeroy-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:

Recenzia Skaffold pentru dezvoltare sub Kubernetes

Î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ă ghid 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 scriau în blogul nostru.

Iar în din blog. 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 se prezintă un astfel de un proiect de test 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 GoogleContainerTools — î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

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster