Gennemgang af Skaffold til Kubernetes udvikling

Gennemgang af Skaffold til Kubernetes udvikling

For halvandet år siden, den 5. marts 2018, udgav Google den første alfaversion af sit Open Source-projekt til CI/CD kaldet Skaffold, hvis mål var at skabe "simpel og gentagelig Kubernetes-udvikling", så udviklere kunne fokusere på udvikling frem for administration. Hvad kunne være interessant ved Skaffold? Som det viser sig, har den et par tricks i ærmet, der kan gøre det til et stærkt værktøj for udvikleren og måske endda driftsingeniøren. Lad os stifte bekendtskab med projektet og dets muligheder.

NB: Vi har i øvrigt allerede kort talt om Skaffold i vor alm gennemgang af udviklerværktøjer, hvis liv er forbundet med Kubernetes.

Teori. Formål og muligheder

Så generelt løser Skaffold problemet med at automatisere CI/CD-cyklussen (i opbygnings-, push-, deploy-stadierne), og tilbyder udvikleren hurtig feedback, dvs. muligheden for hurtigt at modtage resultatet af efterfølgende kodeændringer - i form af en opdateret applikation, der kører i Kubernetes-klyngen. Og det kan fungere i forskellige kredsløb (dev, stage, produktion...), hvortil Skaffold hjælper med at beskrive de tilsvarende pipelines til udrulning.

Skaffolds kildekode er skrevet i Go, distribueret af under den gratis Apache License 2.0 (GitHub).

Lad os se på de vigtigste funktioner og funktioner. Den første omfatter følgende:

  • Skaffold tilbyder værktøjer til at skabe CI/CD pipelines.
  • Giver dig mulighed for at overvåge ændringer i kildekoden i baggrunden og køre en automatiseret proces med at samle kode til containerbilleder, udgive disse billeder i Docker Registry og implementere dem til Kubernetes-klyngen.
  • Synkroniserer filer i lageret med arbejdsmappen i containeren.
  • Tester automatisk ved hjælp af container-structure-test.
  • Forwarder havne.
  • Læser logfilerne for en applikation, der kører i en container.
  • Hjælper med at fejlfinde applikationer skrevet i Java, Node.js, Python, Go.

Nu om funktionerne:

  • Skaffold selv har ingen klyngesidekomponenter. Det vil sige, at der ikke er behov for yderligere at konfigurere Kubernetes til at bruge dette værktøj.
  • Forskellige rørledninger til din applikation. Skal du rulle koden ud til lokale Minikube, mens du udvikler, og derefter til scenen eller produktionen? Til dette formål er der profiler og brugerkonfigurationer, miljøvariabler og flag, som giver dig mulighed for at beskrive forskellige pipelines for en applikation.
  • CLI. Kun konsolværktøj og konfigurationer i YAML. På internettet kan du finde referencer til forsøg på at skabe eksperimentel GUIMen i øjeblikket betyder dette højst sandsynligt bare, at nogen har brug for ham, men ikke rigtig.
  • Modularitet. Skaffold er ikke en selvstændig høstmaskine, men bestræber sig på at bruge individuelle moduler eller eksisterende løsninger til specifikke opgaver.

Illustration af sidstnævnte:

  • På monteringsstadiet kan du bruge:
    • docker build lokalt, i en klynge ved hjælp af kaniko eller i Google Cloud Build;
    • Bazel lokalt;
    • Jib Maven og Jib Gradle lokalt eller i Google Cloud Build;
    • brugerdefinerede build-scripts kører lokalt. Hvis du skal køre en anden (mere fleksibel/kendt/...) build-løsning, er den beskrevet i scriptet, så Skaffold starter den (eksempel fra dokumentation). Dette giver dig mulighed for at bruge enhver samler, der kan kaldes ved hjælp af et script;
  • På teststadiet, den allerede nævnte container-struktur-test;
  • Til udrulning leveres følgende:
    • Kubectl;
    • Ror;
    • tilpasse.

Takket være dette kan Skaffold kaldes en unik rammer for opbygning af CI/CD. Her er et eksempel på en arbejdsgang, når du bruger det (fra projektdokumentationen):

Gennemgang af Skaffold til Kubernetes udvikling

Hvordan ser Skaffolds arbejde ud generelt set?

  1. Hjælpeprogrammet overvåger ændringer i kildekodebiblioteket. Hvis der foretages ændringer af filerne, synkroniseres de med applikations-poden i Kubernetes-klyngen. Hvis det er muligt, uden at samle billedet igen. Ellers samles et nyt billede.
  2. Det samlede billede kontrolleres ved hjælp af container-structure-test, tagges og sendes til Docker Registry.
  3. Herefter implementeres billedet - implementeret i Kubernetes-klyngen.
  4. Hvis lanceringen blev initialiseret ved hjælp af kommandoen skaffold dev, så begynder vi at modtage logfiler fra applikationen, og Skaffold venter på ændringer for at gentage alle handlingerne igen.

Gennemgang af Skaffold til Kubernetes udvikling
Illustration af de vigtigste stadier af Skaffold-driften

Øve sig. Prøver Skaffold

For at demonstrere brugen af ​​Skaffold vil jeg tage et eksempel fra GitHub-projektopbevaring. I øvrigt, der Du kan finde mange andre eksempler, der tager højde for forskellige detaljer. Jeg vil udføre alle handlinger lokalt i Minikube. Installationen er enkel og tager et par minutter, og du skal bruge kubectl for at komme i gang.

Installer 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

Lad os klone Skaffolds depot med de nødvendige eksempler:

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

Jeg valgte et eksempel med to pods, der hver indeholder en lille Go-applikation. En applikation er frontend (leeroy-web), som omdirigerer anmodningen til den anden applikation - backend (leeroy-app). Lad os se, hvordan det ser ud:

~/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 og leeroy-web indeholder Go-kode og simple Dockerfiler til at bygge denne kode lokalt:

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

Jeg vil ikke give ansøgningskoden - det er nok at vide det leeroy-web accepterer anmodninger og fuldmagter dem til leeroy-app. Derfor i filerne Deployment.yaml der er kun en Service for app (til intern routing). Pod port web vi videresender det til os selv for hurtig adgang til applikationen.

Det ligner 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

Alle de ovenfor nævnte stadier er beskrevet her. Ud over denne konfiguration er der også en fil med globale indstillinger - ~/.skaffold/config. Det kan redigeres manuelt eller via CLI - for eksempel sådan her:

skaffold config set --global local-cluster true

Denne kommando indstiller den globale variabel local-cluster i betydning true, hvorefter Skaffold ikke vil forsøge at skubbe billeder til fjernregistret. Hvis du udvikler lokalt, kan du bruge denne kommando til at bygge billeder lokalt.

Tilbage til skaffold.yaml:

  • På scenen build vi angiver, at du skal indsamle og gemme billedet lokalt. Når bygningen kører for første gang, vil vi se følgende:
    // т.к. 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

    Som du kan se, har Skaffold selv tagget billederne. I øvrigt understøttes flere tagging-politikker.

  • Længere i konfigurationen er det angivet context: ./leeroy-app/, dvs. den kontekst, som billedet er indsamlet i, er angivet.
  • På implementeringsstadiet er det bestemt, at vi vil bruge kubectl og en maske til de nødvendige manifester.
  • PortForward: svarende til, hvordan vi normalt videresender porte ved hjælp af kubectl port-forward, giver vi instruktioner til Skaffold om at kalde denne kommando. I dette tilfælde videresendes lokal port 9000 til 8080 i Deployment med navnet leeroy-web.

Det er tid til at lancere skaffold dev: Holdet vil oprette en løbende "feedback loop", dvs. ikke kun vil den samle alt og implementere det til klyngen, men vil også fortælle dig om pods tilstand i øjeblikket, overvåge ændringer og opdatere pods tilstand.

Her er lanceringsresultatet skaffold dev --port-forward ved genmontering:

Gennemgang af Skaffold til Kubernetes udvikling

Først kan du se, at cachen bliver brugt. Derefter samles applikationen, implementeres og porte videresendes. Siden specificeret --port-forward, fremsendte Skaffold havnen til web, som han blev spurgt, men her app han kastede efter eget skøn (valgte den nærmeste frie). Herefter modtager vi de første logfiler fra ansøgningerne.

Lad os se om det virker?

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

Ændring af filen leeroy-app/app.go - der går et par sekunder... og:

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

Samtidig viste Skaffold selv det samme i konsollen som før, med undtagelse af et punkt: den rullede kun ud leeroy-appog ikke alt på én gang.

Mere øvelse

Det er også værd at nævne, at når du opretter et nyt projekt, kan konfigurationer til Skaffold bootstrappes ved hjælp af kommandoen init, hvilket er meget praktisk. Derudover kan du skrive flere konfigurationer: Udfør udvikling på standardkonfigurationen, og rul derefter ud til scenen med kommandoen run (samme proces som dev, overvåger bare ikke ændringer), ved hjælp af en anden konfiguration.

På katacoda er der lederskab Det er endnu nemmere med et eksempel. Men den byder på en færdiglavet sandkasse med Kubernetes, en applikation og Skaffold. En god mulighed, hvis du er interesseret i at prøve det helt basale selv.

En mulig use case for Skaffold er at udføre udvikling på en fjernklynge. Ikke alle er trygge ved at køre Minikube på deres egen hardware, for derefter at rulle applikationen ud og forvente, at den fungerer tilstrækkeligt... I dette tilfælde løser Skaffold problemet perfekt, hvilket f.eks. kan bekræftes af Reddit-ingeniører, som vi har allerede diskuteret skrev i vores blog.

Og i denne udgivelse fra Weaveworks kan du finde et eksempel på oprettelse af en pipeline til produktion.

Konklusion

Skaffold er et praktisk værktøj til at bygge pipelines, der involverer udrulning af applikationer til Kubernetes og primært fokuseret på udviklingsbehov. Det gør det ret nemt at skabe en "kort" pipeline, der tager højde for udviklerens basale behov, men hvis det ønskes, kan du organisere større processer. Som et af de klare eksempler på brug af Skaffold i CI/CD processer er givet sådan testprojekt af 10 mikrotjenester, der bruger funktionerne i Kubernetes, gRPC, Istio og OpenCensus Tracing.

Skaffold har allerede næsten 8000+ stjerner på GitHub, er udviklet af Google og er en del af GoogleContainerTools — generelt er der i øjeblikket al mulig grund til at tro, at projektet vil udvikle sig lykkeligt til deres dages ende.

PS

Læs også på vores blog:

Kilde: www.habr.com

Tilføj en kommentar