Resinsje fan Skaffold foar Kubernetes ûntwikkeling

Resinsje fan Skaffold foar Kubernetes ûntwikkeling

In jier en in heal lyn, op 5 maart 2018, publisearre Google de earste alfaferzje fan har Open Source-projekt foar CI / CD neamd Skaffold, waans doel wie om "ienfâldige en werhelle Kubernetes-ûntwikkeling" te meitsjen, sadat ûntwikkelders har rjochtsje kinne op ûntwikkeling ynstee fan administraasje. Wat kin ynteressant wêze oer Skaffold? Sa't it docht bliken, hat it in pear trúkjes op 'e mouwe dy't it in krêftich ark meitsje kinne foar de ûntwikkelder, en miskien sels de operaasje-yngenieur. Litte wy yn 'e kunde komme mei it projekt en syn mooglikheden.

NB: Oer Skaffold ha wy trouwens al koart praat yn ús generaal resinsje fan developer ark, waans libben ferbûn is mei Kubernetes.

Teory. Doel en mooglikheden

Dat, yn 't algemien, Skaffold lost it probleem op fan it automatisearjen fan' e CI / CD-syklus (by de bou, triuwe, ynsette stadia), en biedt de ûntwikkelder prompt feedback, d.w.s. de mooglikheid om fluch ûntfange it resultaat fan folgjende koade feroarings - yn 'e foarm fan in bywurke applikaasje rint yn de Kubernetes kluster. En it kin wurkje yn ferskate circuits (dev, poadium, produksje ...), wêrfoar Skaffold helpt om de oerienkommende pipelines foar útrol te beskriuwen.

De boarnekoade fan Skaffold is skreaun yn Go, ferspraat troch ûnder de fergese Apache License 2.0 (GitHub).

Litte wy nei de wichtichste funksjes en funksjes sjen. De earste omfetsje it folgjende:

  • Skaffold biedt ark foar it meitsjen fan CI / CD-pipelines.
  • Hjirmei kinne jo wizigingen yn 'e boarnekoade op' e eftergrûn kontrolearje en in automatisearre proses útfiere fan it gearstallen fan koade yn kontenerôfbyldings, dizze ôfbyldings publisearje yn 'e Docker Registry en ynsette se nei it Kubernetes-kluster.
  • Syngronisearret bestannen yn 'e repository mei de wurkmap yn' e kontener.
  • Testet automatysk mei container-struktuer-test.
  • Forwards havens.
  • Lês de logs fan in applikaasje dy't rint yn in kontener.
  • Helpt by it debuggen fan applikaasjes skreaun yn Java, Node.js, Python, Go.

No oer de funksjes:

  • Skaffold sels hat gjin kluster-side komponinten. Dat is, it is net nedich om Kubernetes fierder te konfigurearjen om dit hulpprogramma te brûken.
  • Ferskillende pipelines foar jo applikaasje. Moatte jo de koade útrolje nei lokale Minikube wylst jo ûntwikkelje, en dan nei poadium of produksje? Foar dit doel binne der profilen en brûkerskonfiguraasjes, omjouwingsfariabelen en flaggen, wêrmei jo ferskate pipelines foar ien applikaasje kinne beskriuwe.
  • CLI. Allinnich konsole-hulpprogramma en konfiguraasjes yn YAML. Op it ynternet kinne jo ferwizings fine nei besykjen om te meitsjen eksperimintele GUI, lykwols, op it stuit dit meast wierskynlik gewoan betsjut dat immen nedich him, mar net echt.
  • Modulariteit. Skaffold is gjin selsstannige harvester, mar stribbet nei it brûken fan yndividuele modules as besteande oplossingen foar spesifike taken.

Yllustraasje fan dat lêste:

  • Yn de gearstalling faze kinne jo brûke:
    • docker bouwe lokaal, yn in kluster mei kaniko of yn Google Cloud Build;
    • Bazel lokaal;
    • Jib Maven en Jib Gradle lokaal as yn Google Cloud Build;
    • oanpaste build skripts rinne lokaal. As jo ​​​​in oare (mear fleksibele/fertroude/...) bou-oplossing moatte útfiere, wurdt it beskreaun yn it skript sadat Skaffold it lanseart (foarbyld út dokumintaasje). Hjirmei kinne jo elke samler brûke dy't mei in skript neamd wurde kin;
  • By de test faze, de al neamde container-struktuer-test;
  • Foar ynset wurde de folgjende foarsjoen:
    • kubectl;
    • Helm;
    • oanpasse.

Mei tank oan dit, Skaffold kin neamd wurde in unyk ramt foar it bouwen fan CI / CD. Hjir is in foarbyld fan workflow by it brûken fan it (fan 'e projektdokumintaasje):

Resinsje fan Skaffold foar Kubernetes ûntwikkeling

Hoe sjocht Skaffold syn wurk der yn algemiene termen út?

  1. It hulpprogramma kontrolearret feroaringen yn 'e boarnekoade-map. As der wizigings wurde makke oan de bestannen, wurde se syngronisearre mei de applikaasje pod yn it Kubernetes-kluster. As it mooglik is, sûnder de ôfbylding opnij te sammeljen. Oars wurdt in nije ôfbylding gearstald.
  2. De gearstalde ôfbylding wurdt kontrolearre mei help fan container-structure-test, tagged en stjoerd nei it Docker Registry.
  3. Hjirnei wurdt de ôfbylding ynset - ynset yn it Kubernetes-kluster.
  4. As de lansearring waard inisjalisearre mei it kommando skaffold dev, dan begjinne wy ​​logs te ûntfangen fan 'e applikaasje, en Skaffold wachtet op feroaringen om alle aksjes wer te werheljen.

Resinsje fan Skaffold foar Kubernetes ûntwikkeling
Yllustraasje fan 'e wichtichste stadia fan Skaffold operaasje

Oefenje. Skaffold besykje

Om it gebrûk fan Skaffold te demonstrearjen sil ik in foarbyld nimme fan GitHub projekt repository... Trouwens, op itselde plak Jo kinne in protte oare foarbylden fine dy't rekken hâlde mei ferskate spesifiken. Ik sil alle aksjes lokaal útfiere yn Minikube. Ynstallaasje is ienfâldich en duorret in pear minuten, en jo sille kubectl nedich wêze om te begjinnen.

Ynstallearje 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

Litte wy it repository fan Skaffold klonearje mei de nedige foarbylden:

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

Ik keas in foarbyld mei twa pods, elk mei ien lytse Go-applikaasje. Ien applikaasje is de frontend (leeroy-web), dy't it fersyk omliedt nei de twadde applikaasje - de efterkant (leeroy-app). Litte wy sjen hoe't it derút sjocht:

~/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 en leeroy-web befetsje Go-koade en ienfâldige Dockerfiles foar it bouwen fan dizze koade lokaal:

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

Ik sil de applikaasjekoade net jaan - it is genôch om dat te witten leeroy-web akseptearret fersiken en proxies se oan leeroy-app. Dêrom yn de triemmen Deployment.yaml der is in Service allinnich foar app (foar ynterne routing). Pod haven web wy sille it nei ússels trochstjoere foar rappe tagong ta de applikaasje.

Hoe sjocht it der út? 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 hjirboppe neamde stadia wurde hjir beskreaun. Neist dizze konfiguraasje is d'r ek in bestân mei globale ynstellingen - ~/.skaffold/config. It kin mei de hân of fia de CLI bewurke wurde - bygelyks sa:

skaffold config set --global local-cluster true

Dit kommando sil de globale fariabele ynstelle local-cluster yn betsjutting true, wêrnei't Skaffold net besykje ôfbyldings nei it register op ôfstân te triuwen. As jo ​​​​lokaal ûntwikkelje, kinne jo dit kommando brûke om ôfbyldings lokaal te bouwen.

Werom nei skaffold.yaml:

  • Op it poadium build wy spesifisearje dat jo moatte sammelje en bewarje de ôfbylding lokaal. Nei't de bou foar de earste kear rint, sille wy it folgjende sjen:
    // т.к. 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

    Sa't jo sjen kinne, markearre Skaffold de bylden sels. Trouwens, ferskate taggingbelied wurde stipe.

  • Fierder yn 'e konfiguraasje wurdt it oanjûn context: ./leeroy-app/, d.w.s. de kontekst wêryn't de ôfbylding wurdt sammele wurdt oantsjutte.
  • Yn it ynsetstadium wurdt bepaald dat wy kubectl en in masker sille brûke foar de nedige manifesten.
  • PortForward: fergelykber mei hoe't wy meastal trochstjoere havens mei help kubectl port-forward, jouwe wy ynstruksjes oan Skaffold om dit kommando op te roppen. Yn dit gefal wurdt lokale haven 9000 trochstjoerd nei 8080 yn Ynset mei de namme leeroy-web.

It is tiid om te lansearjen skaffold dev: It team sil in trochgeande "feedback-loop" meitsje, d.w.s. it sil net allinich alles sammelje en it ynsette nei it kluster, mar sil jo ek fertelle oer de steat fan 'e pods op it stuit, wizigingen kontrolearje en de steat fan' e pods bywurkje.

Hjir is it lansearringsresultaat skaffold dev --port-forward by werynstallaasje:

Resinsje fan Skaffold foar Kubernetes ûntwikkeling

Earst kinne jo sjen dat de cache wurdt brûkt. Dêrnei wurdt de applikaasje gearstald, ynset en wurde havens trochstjoerd. Sûnt oantsjutte --port-forward, Skaffold stjoerde de haven nei web, sa't him frege waard, mar hjir app hy smiet nei eigen goedtinken (keas de tichtstbyste frije). Hjirnei krije wy de earste logs fan 'e applikaasjes.

Lit ús kontrolearje oft it wurket?

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

It wizigjen fan de triem leeroy-app/app.go - in pear sekonden passe ... en:

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

Tagelyk liet Skaffold sels itselde ding yn 'e konsole sjen as earder, mei útsûndering fan ien punt: it rôle allinich út leeroy-app, en net alles yn ien kear.

Mear praktyk

It is ek it neamen wurdich dat by it meitsjen fan in nij projekt konfiguraasjes foar Skaffold kinne wurde bootstrapped mei it kommando init, dat is hiel handich. Derneist kinne jo ferskate konfiguraasjes skriuwe: ûntwikkeling útfiere op 'e standert konfiguraasje, en rôlje dan út nei it poadium mei it kommando run (itselde proses as dev, kontrolearret gewoan gjin feroaringen), mei in oare konfiguraasje.

Op katacoda is der liederskip It is noch makliker mei in foarbyld. Mar it biedt in klearmakke sânbak mei Kubernetes, in applikaasje en Skaffold. In geweldige opsje as jo ynteressearre binne yn it besykjen fan 'e heul basis sels.

Ien mooglik gebrûk foar Skaffold is it útfieren fan ûntwikkeling op in kluster op ôfstân. Net elkenien is noflik om Minikube op har eigen hardware te rinnen, dan de applikaasje út te rôljen en te ferwachtsjen dat it adekwaat funksjonearret ... Yn dit gefal lost Skaffold it probleem perfekt op, dat kin wurde befêstige, bygelyks troch Reddit-yngenieurs, lykas wy hawwe al besprutsen skreaun yn ús blog.

En yn dizze publikaasje fan Weaveworks kinne jo in foarbyld fine fan it meitsjen fan in pipeline foar produksje.

konklúzje

Skaffold is in handich ark foar it bouwen fan pipelines dy't it útroljen fan applikaasjes nei Kubernetes befetsje en primêr rjochte binne op ûntwikkelingsbehoeften. It makket it frij maklik om in "koarte" pipeline te meitsjen dy't rekken hâldt mei de basisbehoeften fan 'e ûntwikkelder, mar as jo wolle, kinne jo gruttere prosessen organisearje. As ien fan de dúdlike foarbylden fan in gebrûk Skaffold yn CI / CD prosessen is jûn sa'n test projekt fan 10 microservices mei help fan de mooglikheden fan Kubernetes, gRPC, Istio en OpenCensus Tracing.

Skaffold hat al hast 8000+ stjerren op GitHub, is ûntwikkele troch Google en is diel fan GoogleContainerTools - yn it algemien, op it stuit is der alle reden om te leauwen dat it projekt sil ûntwikkelje lokkich altyd nei.

PS

Lês ek op ús blog:

Boarne: www.habr.com

Add a comment