Granskning av Skaffold för Kubernetes utveckling

Granskning av Skaffold för Kubernetes utveckling

För ett och ett halvt år sedan, den 5 mars 2018, släppte Google den första alfaversionen av sitt Open Source CI/CD-projekt som heter Skaffold, vars mål var att skapa "enkel och repeterbar Kubernetes-utveckling" så att utvecklare kunde fokusera på utveckling snarare än administration. Vad kan vara intressant med Skaffold? Som det visar sig har den några knep i rockärmen som kan göra den till ett kraftfullt verktyg för utvecklaren, och kanske till och med driftingenjören. Låt oss bekanta oss med projektet och dess kapacitet.

NB: Vi har förresten redan kort talat om Skaffold i vår general granskning av utvecklarverktyg, vars liv är kopplade till Kubernetes.

Teori. Syfte och förmågor

Så generellt sett löser Skaffold problemet med att automatisera CI/CD-cykeln (vid bygg-, push-, distributionsstadierna), och erbjuder utvecklaren snabb feedback, dvs. möjligheten att snabbt ta emot resultatet av efterföljande kodändringar - i form av en uppdaterad applikation som körs i Kubernetes-klustret. Och det kan fungera i olika kretsar (dev, stadium, produktion...), för vilka Skaffold hjälper till att beskriva motsvarande pipelines för utrullning.

Skaffolds källkod är skriven i Go, levererad av under villkoren för den kostnadsfria Apache-licensen 2.0 (GitHub).

Låt oss titta på huvudfunktionerna och funktionerna. De första inkluderar följande:

  • Skaffold erbjuder verktyg för att skapa CI/CD-pipelines.
  • Låter dig övervaka ändringar i källkoden i bakgrunden och köra en automatiserad process för att sätta ihop kod till containerbilder, publicera dessa bilder i Docker-registret och distribuera dem till Kubernetes-klustret.
  • Synkroniserar filer i arkivet med arbetskatalogen i behållaren.
  • Testar automatiskt med container-structure-test.
  • Forwards hamnar.
  • Läser loggarna för ett program som körs i en behållare.
  • Hjälper till att felsöka applikationer skrivna i Java, Node.js, Python, Go.

Nu om funktionerna:

  • Skaffold själv har inga komponenter på klustersidan. Det vill säga, det finns inget behov av att ytterligare konfigurera Kubernetes för att använda det här verktyget.
  • Olika pipelines för din applikation. Behöver du rulla ut koden till lokala Minikube medan du utvecklar, och sedan till scen eller produktion? För detta ändamål finns det профили och användarkonfigurationer, miljövariabler och flaggor, som låter dig beskriva olika pipelines för en applikation.
  • CLI. Endast konsolverktyg och konfigurationer i YAML. På Internet kan du hitta referenser till försök att skapa experimentellt GUIMen för tillfället betyder detta troligen bara att någon behöver honom, men inte riktigt.
  • Modularitet. Skaffold är inte en fristående skördare utan strävar efter att använda enskilda moduler eller befintliga lösningar för specifika uppgifter.

Illustration av det senare:

  • I monteringsstadiet kan du använda:
    • docker bygga lokalt, i ett kluster med kaniko eller i Google Cloud Build;
    • Bazel lokalt;
    • Jib Maven och Jib Gradle lokalt eller i Google Cloud Build;
    • anpassade byggskript körs lokalt. Om du behöver köra en annan (mer flexibel/bekant/...) bygglösning så beskrivs den i skriptet så att Skaffold startar den (exempel från dokumentation). Detta gör att du kan använda vilken samlare som helst som kan kallas med hjälp av ett skript;
  • På teststadiet, den redan nämnda container-struktur-test;
  • För distribution tillhandahålls följande:
    • Kubectl;
    • Roder;
    • anpassa.

Tack vare detta kan Skaffold kallas en unik ramverk för att bygga CI/CD. Här är ett exempel på ett arbetsflöde när du använder det (från projektdokumentationen):

Granskning av Skaffold för Kubernetes utveckling

Hur ser Skaffolds verk ut i allmänna termer?

  1. Verktyget övervakar ändringar i källkodskatalogen. Om ändringar görs i filerna synkroniseras de med programpodden i Kubernetes-klustret. Om möjligt, utan att återmontera bilden. Annars sätts en ny bild ihop.
  2. Den sammansatta bilden kontrolleras med container-structure-test, taggas och skickas till Docker Registry.
  3. Efter detta distribueras bilden - distribueras i Kubernetes-klustret.
  4. Om lanseringen initierades med kommandot skaffold dev, sedan börjar vi ta emot loggar från applikationen och Skaffold väntar på ändringar för att upprepa alla åtgärder igen.

Granskning av Skaffold för Kubernetes utveckling
Illustration av huvudstadierna i Skaffold-driften

Öva. Försöker Skaffold

För att demonstrera användningen av Skaffold ska jag ta ett exempel från GitHub-projektförråd. Förresten, där Du kan hitta många andra exempel som tar hänsyn till olika detaljer. Jag kommer att utföra alla åtgärder lokalt i Minikube. Installationen är enkel och tar några minuter, och du behöver kubectl för att komma igång.

Installera 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

Låt oss klona Skaffolds förråd med de nödvändiga exemplen:

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

Jag valde ett exempel med två kapslar, som var och en innehåller en liten Go-applikation. En applikation är frontend (leeroy-web), som omdirigerar begäran till den andra applikationen - backend (leeroy-app). Låt oss se hur det ser ut:

~/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 och leeroy-web innehåller Go-kod och enkla Dockerfiler för att bygga denna kod 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 .

Jag kommer inte att ge applikationskoden - det räcker att veta det leeroy-web accepterar förfrågningar och fullmakter dem till leeroy-app. Därför i filerna Deployment.yaml det finns en tjänst endast för app (för intern routing). Podport web vi kommer att vidarebefordra den till oss själva för snabb åtkomst till applikationen.

Ser ut som 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

Alla steg som nämns ovan beskrivs här. Utöver denna konfiguration finns det också en fil med globala inställningar - ~/.skaffold/config. Det kan redigeras manuellt eller via CLI - till exempel så här:

skaffold config set --global local-cluster true

Detta kommando kommer att ställa in den globala variabeln local-cluster till mening true, varefter Skaffold inte kommer att försöka skicka bilder till fjärrregistret. Om du utvecklar lokalt kan du använda det här kommandot för att bygga bilder lokalt.

Tillbaka till skaffold.yaml:

  • På scenen build vi anger att du behöver samla in och spara bilden lokalt. När bygget körs för första gången kommer vi att se följande:
    // т.к. 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 ni ser så taggade Skaffold bilderna själv. Förresten, flera taggningspolicyer stöds.

  • Längre in i konfigurationen indikeras det context: ./leeroy-app/, dvs. i vilket sammanhang bilden är insamlad anges.
  • Vid implementeringsstadiet är det bestämt att vi kommer att använda kubectl och en mask för de nödvändiga manifesten.
  • PortForward: liknande hur vi vanligtvis vidarebefordrar portar med hjälp av kubectl port-forward, ger vi instruktioner till Skaffold att anropa detta kommando. I det här fallet vidarebefordras lokal port 9000 till 8080 i Deployment med namnet leeroy-web.

Det är dags att lansera skaffold dev: Teamet kommer att skapa en pågående "feedback loop", d.v.s. inte bara kommer den att samla in allt och distribuera det till klustret, utan kommer också att berätta om tillståndet för poddarna för tillfället, övervaka förändringar och uppdatera tillståndet för podarna.

Här är lanseringsresultatet skaffold dev --port-forward vid återmontering:

Granskning av Skaffold för Kubernetes utveckling

Först kan du se att cachen används. Därefter sätts applikationen ihop, distribueras och portar vidarebefordras. Sedan specificerat --port-forward, vidarebefordrade Skaffold hamnen till web, som han blev tillfrågad, men app han kastade efter eget gottfinnande (valde närmaste fria). Efter detta får vi de första loggarna från ansökningarna.

Låt oss kolla om det fungerar?

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

Ändra filen leeroy-app/app.go - några sekunder går... och:

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

Samtidigt visade Skaffold själv samma sak i konsolen som tidigare, med undantag för en punkt: den rullade bara ut leeroy-appoch inte allt på en gång.

Mer övning

Det är också värt att nämna att när du skapar ett nytt projekt kan konfigurationer för Skaffold bootstrappas med kommandot init, vilket är väldigt bekvämt. Dessutom kan du skriva flera konfigurationer: utför utveckling på standardkonfigurationen och rulla sedan ut till scenen med kommandot run (samma process som dev, övervakar bara inte ändringar), med en annan konfiguration.

På katacoda finns det ledning Det är ännu enklare med ett exempel. Men den erbjuder en färdig sandlåda med Kubernetes, en applikation och Skaffold. Ett bra alternativ om du är intresserad av att prova det allra grundläggande själv.

Ett möjligt användningsfall för Skaffold är att bedriva utveckling på ett avlägset kluster. Alla är inte bekväma med att köra Minikube på sin egen hårdvara, sedan rulla ut applikationen och förvänta sig att den ska fungera adekvat... I det här fallet löser Skaffold problemet perfekt, vilket till exempel kan bekräftas av Reddits ingenjörer, som vi har redan diskuterat писали i vår blogg.

Och i denna publikation från Weaveworks kan du hitta ett exempel på att skapa en pipeline för produktion.

Slutsats

Skaffold är ett bekvämt verktyg för att bygga pipelines som involverar utrullning av applikationer till Kubernetes och som främst är inriktade på utvecklingsbehov. Det gör det ganska enkelt att skapa en "kort" pipeline som tar hänsyn till utvecklarens grundläggande behov, men om så önskas kan du organisera större processer. Som ett av de tydliga exemplen på att använda Skaffold i CI/CD-processer är given sådan testprojekt av 10 mikrotjänster som använder funktionerna i Kubernetes, gRPC, Istio och OpenCensus Tracing.

Skaffold har redan nästan 8000+ stjärnor på GitHub, är utvecklat av Google och ingår i GoogleContainerTools — Generellt sett finns det för närvarande all anledning att tro att projektet kommer att utvecklas lyckligt i alla sina dagar.

PS

Läs även på vår blogg:

Källa: will.com

Lägg en kommentar