Översikt av Skaffold för utveckling under Kubernetes

Översikt av Skaffold för utveckling under Kubernetes

För ett och ett halvt Är sedan, den 5 mars 2018, slÀppte Google den första alfa-versionen av sitt Open Source-projekt för CI/CD med namnet Skaffold, vars mÄl var att skapa "en enkel och reproducerbar utvecklingsmiljö för Kubernetes" sÄ att utvecklare kunde fokusera pÄ sjÀlva utvecklingen snarare Àn pÄ administration. Vad kan Skaffold intressera? Det visar sig att det har flera ess i rockÀrmen som kan göra det till ett kraftfullt verktyg för bÄde utvecklare och driftsingenjörer. LÄt oss bekanta oss med projektet och dess möjligheter.

NB: För övrigt har vi redan kortfattat berÀttat om Skaffold i vÄr övergripande översikt över verktyg för utvecklare, vars liv Àr kopplat till Kubernetes.

Teori. Syfte och funktioner

SĂ„, om vi pratar allmĂ€nt, löser Skaffold problemet med automatisering av CI/CD-cykeln (i faserna build, push, deploy), genom att erbjuda utvecklaren snabb Ă„terkoppling, dvs. möjligheten att snabbt fĂ„ resultat av de senaste kodĂ€ndringarna — i form av en uppdaterad applikation som körs i Kubernetes-klustret. Det kan fungera i olika miljöer (dev, stage, production
), och för detta hjĂ€lper Skaffold till att beskriva de relevanta pipelines för distribution.

KÀllkoden till Skaffold Àr skriven i Go-sprÄket, sprids under villkoren för den fria licensen Apache License 2.0 (GitHub).

LÄt oss titta pÄ de grundlÀggande funktionerna och egenskaperna. Till de första kan vi nÀmna följande:

  • Skaffold erbjuder verktyg för att skapa CI/CD-pipelines.
  • Det möjliggör att i bakgrunden övervaka Ă€ndringar i kĂ€llkoden och starta en automatiserad process för att bygga koden till containerbilder, publicera dessa bilder i Docker Registry och distribuera dem till Kubernetes-klustret.
  • Synkroniserar filer i repositoryt med arbetskatalogen i containern.
  • Automatiskt testar med hjĂ€lp av container-structure-test.
  • Vidarebefordrar portar.
  • LĂ€ser loggar frĂ„n applikationen som körs i containern.
  • HjĂ€lper till med att felsöka applikationer skrivna i Java, Node.js, Python, Go.

Nu — om funktionerna:

  • Skaffold har inga komponenter pĂ„ kluster-sidan.Det betyder att ytterligare konfiguration av Kubernetes för att anvĂ€nda detta verktyg inte krĂ€vs.
  • Olika pipelines för din applikation.Behöver du distribuera koden till den lokala Minikube medan du utvecklar, och sedan till stage eller produktion? Detta Ă€r möjligt med profiler och anvĂ€ndarkonfigurationer, miljövariabler och flaggor som gör det möjligt att beskriva olika pipelines för en och samma applikation.
  • CLI. Endast ett kommandoradsverktyg och konfigurationer i YAML. PĂ„ nĂ€tet kan man hitta omnĂ€mnanden av försök att skapa experimentellt GUI, men för nĂ€rvarande innebĂ€r det snarare att det Ă€r nĂ„gon som behöver det, men inte sĂ„ mycket.
  • Modularitet. Skaffold Ă€r ingen fristĂ„ende maskin, utan strĂ€var efter att anvĂ€nda separata moduler eller redan existerande lösningar för specifika uppgifter.

En illustration av det senaste:

  • Under byggsteget kan du anvĂ€nda:
    • docker build lokalt, i klustret med hjĂ€lp av kaniko eller i Google Cloud Build;
    • Bazel lokalt;
    • Jib Maven och Jib Gradle lokalt eller i Google Cloud Build;
    • anpassade build-skript som körs lokalt. Om du behöver köra en annan (mer flexibel / bekant / ...) lösning för byggande, beskrivs den i skriptet sĂ„ att Skaffold exakt kör den (exempel frĂ„n dokumentationen). Detta gör det möjligt att anvĂ€nda vilken byggare som helst som kan anropas med hjĂ€lp av skript;
  • Under teststeget stöds redan nĂ€mnda container-structure-test;
  • För distribution finns:
    • Kubectl;
    • Helm;
    • kustomize.

Tack vare detta kan Skaffold kallas en slags ramverk för att bygga CI/CD. HÀr Àr ett exempel pÄ arbetsflödet vid anvÀndning av det (frÄn projektets dokumentation):

Översikt av Skaffold för utveckling under Kubernetes

Hur ser Skaffold ut i grova drag?

  1. Verktyget övervakar Ă€ndringar i kĂ€llkoden. Om filer modifieras synkroniseras de med podden i applikationen i Kubernetes-klustret. Om det Ă€r möjligt — utan att bygga om bilden. I annat fall — byggs en ny bild.
  2. Den byggda bilden verifieras med hjÀlp av container-structure-test, taggas och skickas till Docker Registry.
  3. Efter det distribueras bilden — den rullas ut i Kubernetes-klustret.
  4. Om körningen har initierats med kommandot skaffold dev, börjar vi fÄ loggar frÄn applikationen, och Skaffold vÀntar pÄ förÀndringar för att upprepa alla ÄtgÀrder.

Översikt av Skaffold för utveckling under Kubernetes
En illustration av de grundlÀggande stegen i Skaffolds arbete

Praktik. LÄt oss prova Skaffold

För att demonstrera anvÀndningen av Skaffold tar jag ett exempel frÄn GitHub-repositoriet för projektet. Förresten, dÀr finns Àven mÄnga andra exempel som tar hÀnsyn till olika specifikationer. Alla ÄtgÀrder kommer att utföras lokalt i Minikube. Installation Àr enkel och tar nÄgra minuter, och för att komma igÄng behövs kubectl.

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

Vi klonar Skaffold-repot med nödvÀndiga exempel:

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

Jag har valt exemplet med tvĂ„ poddar, var och en innehĂ„llande en liten applikation i Go. En applikation Ă€r frontenden (leeroy-web) som dirigerar förfrĂ„gningar 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 kataloger, 8 filer

leeroy-app och leeroy-web innehÄller kod i Go och enkla Dockerfiles för lokal byggnation av denna kod:

~/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 koden för applikationerna — det rĂ€cker att veta att leeroy-web tar emot förfrĂ„gningar och proxar dem till leeroy-app. DĂ€rför finns det en service i filerna Deployment.yaml bara för app (för intern ruttning). Porten för podden web kommer vi att vidarebefordra för snabb Ă„tkomst till applikationen.

Hur ser det ut 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

HĂ€r beskrivs alla steg som nĂ€mnts ovan. Utöver denna konfiguration finns det Ă€ven en fil med globala instĂ€llningar — ~/.skaffold/config. Den kan redigeras manuellt eller via CLI — till exempel sĂ„ hĂ€r:

skaffold config set --global local-cluster true

Detta kommando stÀller in den globala variabeln local-cluster till vÀrdet true, varefter Skaffold inte kommer att försöka "push"-a bilder till ett fjÀrrregister. Om du utvecklar lokalt kan du anvÀnda detta kommando för att lagra bilder lokalt ocksÄ.

LÄt oss Äterkomma till skaffold.yaml:

  • Under fasen build vi anger att vi ska bygga och spara bilden lokalt. NĂ€r bygget körs första gĂ„ngen ser vi 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 man kan se har Skaffold automatiskt taggat bilderna. Förresten, flera taggningspolicyer stöds.

  • DĂ€refter anges i konfigen context: ./leeroy-app/, dvs. den kontext som anvĂ€nds för att bygga bilden.
  • Under deployment, it is determined that we will use kubectl and the mask for the required manifests.
  • PortForward: similar to how we usually forward ports using kubectl port-forward, we provide Skaffold with instructions to invoke this command. In this case, the local port 9000 is forwarded to 8080 in a Deployment named leeroy-web.

Now is the time to run skaffold dev: the command will create a continuous "feedback loop", i.e., it will not only build everything and deploy it to the cluster, but also report on the current state of the pods, watch for changes, and update the pod states.

Here are the results of starting skaffold dev --port-forward on a rebuild:

Översikt av Skaffold för utveckling under Kubernetes

First of all, we see that caching is being used. Next, the application is being built, deployed, and ports are being forwarded. Since it is specified --port-forward, Skaffold has forwarded the port to web, as requested, but it app forwarded at its own discretion (it chose the nearest available one). After that, we get the first logs from the applications.

Shall we check the functionality?

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

Let's modify the file leeroy-app\/app.go — a few seconds pass
 and:

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

At the same time, Skaffold output the same thing to the console as before, with one exception: it only emitted leeroy-app, rather than everything at once.

More practice

It is worth mentioning that when creating a new project, Skaffold configs can be 'bootstrapped' using the command init, which is very convenient. Furthermore, you can write several configs: develop on the default config, and then deploy to stage using the command run (the same process as dev, just not monitoring changes), using a different config.

On Katacoda, there is en guide an even simpler example. It offers a ready-made sandbox with Kubernetes, an application, and Skaffold. A great option if you're interested in trying out the basics yourself.

Ett av de möjliga anvĂ€ndningsomrĂ„dena för Skaffold Ă€r att hantera utveckling pĂ„ en fjĂ€rrkluster. Inte alla tycker att det Ă€r bekvĂ€mt att köra Minikube pĂ„ sin egen hĂ„rdvara och sedan lansera applikationen och vĂ€nta pĂ„ att den ska fungera korrekt
 I sĂ„dana fall löser Skaffold uppgiften utmĂ€rkt, vilket kan bekrĂ€ftas av till exempel Reddit-ingenjörer, vilket vi redan har nĂ€mnt. om finnas i vĂ„r blogg.

Och i denna publikation frÄn Weaveworks finns ett exempel pÄ hur man skapar en pipeline för produktion.

Slutsats

Skaffold Àr ett praktiskt verktyg för att bygga pipelines som innebÀr lansering av applikationer i Kubernetes och som frÀmst Àr inriktade pÄ utvecklarens behov. Det Àr ganska enkelt att skapa en "kort" pipeline som tar hÀnsyn till utvecklarens grundlÀggande behov, men om sÄ önskas kan man ocksÄ organisera mer omfattande processer. Som ett av de tydliga exemplen pÄ tillÀmpningen av Skaffold i CI/CD-processer redogörs för en sÄdan ett testprojekt som bestÄr av 10 mikrotjÀnster som anvÀnder sig av Kubernetes, gRPC, Istio och OpenCensus Tracing.

Skaffold har redan fĂ„tt nĂ€stan 8000 stjĂ€rnor pĂ„ GitHub, utvecklas av Google och Ă€r en del av GoogleContainerTools — sĂ„ i allmĂ€nhet finns det just nu all anledning att tro att projektet kommer att fortsĂ€tta att utvecklas lĂ„ngsiktigt och framgĂ„ngsrikt.

P.S.

LÀs Àven i vÄr blogg:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster