Endurskoðun Skaffold fyrir Kubernetes þróun

Endurskoðun Skaffold fyrir Kubernetes þróun

Fyrir einu og hálfu ári, þann 5. mars 2018, gaf Google út fyrstu alfa útgáfuna af Open Source verkefni sínu fyrir CI/CD sem heitir Skaffold, sem hafði það að markmiði að búa til „einfalda og endurtekna Kubernetes þróun“ þannig að verktaki gæti einbeitt sér að þróun frekar en stjórnun. Hvað gæti verið áhugavert við Skaffold? Eins og það kemur í ljós eru nokkur brellur í erminni sem geta gert það að öflugu tæki fyrir þróunaraðilann, og kannski jafnvel rekstrarfræðinginn. Kynntum okkur verkefnið og getu þess.

NB: Við höfum nú þegar talað stuttlega um Skaffold í hershöfðingjanum okkar endurskoðun á verkfærum þróunaraðila, þar sem líf þeirra er tengt Kubernetes.

Kenning. Tilgangur og getu

Svo, almennt séð, leysir Skaffold vandamálið við að gera CI/CD hringrásina sjálfvirkan (á byggingar-, ýtingar-, dreifingarstigum), og býður þróunaraðilanum skjót viðbrögð, þ.e. getu til að fá fljótt niðurstöður síðari kóðabreytinga - í formi uppfærðs forrits sem keyrir í Kubernetes klasanum. Og það getur virkað í mismunandi hringrásum (dev, stage, production ...), sem Skaffold hjálpar til við að lýsa samsvarandi leiðslum fyrir útsetningu.

Frumkóði Skaffold er skrifaður í Go, dreift af undir ókeypis Apache leyfi 2.0 (GitHub).

Við skulum skoða helstu aðgerðir og eiginleika. Hið fyrsta inniheldur eftirfarandi:

  • Skaffold býður upp á verkfæri til að búa til CI/CD leiðslur.
  • Gerir þér kleift að fylgjast með breytingum á frumkóðanum í bakgrunni og keyra sjálfvirkt ferli við að setja saman kóða í gámamyndir, birta þessar myndir í Docker Registry og dreifa þeim í Kubernetes klasann.
  • Samstillir skrár í geymslunni við vinnuskrána í ílátinu.
  • Prófar sjálfkrafa með því að nota container-structure-test.
  • Áfram hafnir.
  • Les annála forrits sem keyrir í gámi.
  • Hjálpar við að kemba forrit sem eru skrifuð í Java, Node.js, Python, Go.

Nú um eiginleikana:

  • Skaffold sjálft hefur enga klasahliðarhluta. Það er, það er engin þörf á að stilla Kubernetes frekar til að nota þetta tól.
  • Mismunandi leiðslur fyrir umsókn þína. Þarftu að rúlla kóðanum út á staðbundna Minikube á meðan þú ert að þróa og síðan í svið eða framleiðslu? Í þessu skyni eru til Snið og notendastillingar, umhverfisbreytur og fánar, sem gera þér kleift að lýsa mismunandi leiðslum fyrir eitt forrit.
  • CLI. Aðeins console gagnsemi og stillingar í YAML. Á netinu er hægt að finna tilvísanir í tilraunir til að búa til tilrauna GUI, í augnablikinu þýðir þetta líklegast bara að einhver þarfnast hans, en ekki í raun.
  • Modularity. Skaffold er ekki sjálfstætt uppskerutæki heldur miðar það að því að nota einstakar einingar eða núverandi lausnir fyrir ákveðin verkefni.

Myndskreyting af því síðarnefnda:

  • Á samsetningarstigi geturðu notað:
    • docker byggja á staðnum, í þyrping með kaniko eða í Google Cloud Build;
    • Bazel á staðnum;
    • Jib Maven og Jib Gradle á staðnum eða í Google Cloud Build;
    • sérsniðin smíði forskriftir keyra á staðnum. Ef þú þarft að keyra aðra (sveigjanlegri/kunnuglegri/...) byggingarlausn er henni lýst í handritinu þannig að Skaffold ræsir hana (dæmi úr skjölum). Þetta gerir þér kleift að nota hvaða safnara sem hægt er að kalla með handriti;
  • Á prófunarstigi, sem þegar hefur verið nefnt gáma-byggingarpróf;
  • Fyrir dreifingu er eftirfarandi:
    • Kubectl;
    • Hjálmur;
    • sérsníða.

Þökk sé þessu má kalla Skaffold einstakt ramma fyrir byggingu CI/CD. Hér er dæmi um verkflæði þegar það er notað (úr verkefnisskjölunum):

Endurskoðun Skaffold fyrir Kubernetes þróun

Hvernig lítur verk Skaffold út almennt séð?

  1. Tækið fylgist með breytingum á frumkóðaskránni. Ef breytingar eru gerðar á skránum eru þær samstilltar við forritapakkann í Kubernetes klasanum. Ef mögulegt er, án þess að setja myndina saman aftur. Annars er ný mynd sett saman.
  2. Samsetta myndin er skoðuð með því að nota container-structure-test, merkt og send til Docker Registry.
  3. Eftir þetta er myndin sett upp - sett í Kubernetes þyrpinguna.
  4. Ef ræsingin var frumstillt með skipuninni skaffold dev, þá byrjum við að fá logs frá forritinu og Skaffold bíður eftir breytingum til að endurtaka allar aðgerðir aftur.

Endurskoðun Skaffold fyrir Kubernetes þróun
Myndskreyting af helstu stigum Skaffoldarreksturs

Æfðu þig. Reynir Skaffold

Til að sýna fram á notkun Skaffold mun ég taka dæmi úr GitHub verkefnageymsla... Við the vegur, þar Þú getur fundið mörg önnur dæmi sem taka tillit til ýmissa sérkenna. Ég mun framkvæma allar aðgerðir á staðnum í Minikube. Uppsetningin er einföld og tekur nokkrar mínútur og þú þarft kubectl til að byrja.

Settu upp 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ð skulum klóna geymslu Skaffold með nauðsynlegum dæmum:

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

Ég valdi dæmi með tveimur belgjum, sem hver inniheldur eitt lítið Go forrit. Eitt forritið er framenda (leeroy-web), sem vísar beiðninni á annað forritið - bakendann (leeroy-app). Við skulum sjá hvernig það lítur út:

~/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 innihalda Go kóða og einfaldar Dockerfiles til að búa til þennan kóða á staðnum:

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

Ég mun ekki gefa upp umsóknarkóðann - það er nóg að vita það leeroy-web tekur við beiðnum og veitir þeim umboð leeroy-app. Því í skrám Deployment.yaml það er aðeins þjónusta fyrir app (fyrir innri leið). Pod port web við munum senda það til okkar til að fá skjótan aðgang að forritinu.

Lítur ú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

Öllum stigunum sem nefnd eru hér að ofan er lýst hér. Til viðbótar við þessa stillingu er líka skrá með alþjóðlegum stillingum - ~/.skaffold/config. Það er hægt að breyta því handvirkt eða í gegnum CLI - til dæmis, svona:

skaffold config set --global local-cluster true

Þessi skipun mun stilla alþjóðlegu breytuna local-cluster í merkingu true, eftir það mun Skaffold ekki reyna að ýta myndum í fjarskráninguna. Ef þú ert að þróa á staðnum geturðu notað þessa skipun til að búa til myndir á staðnum.

Aftur til skaffold.yaml:

  • Á sviðinu build við tilgreinum að þú þurfir að safna og vista myndina á staðnum. Eftir að byggingin er keyrð í fyrsta skipti munum við sjá eftirfarandi:
    // т.к. 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

    Eins og sjá má merkti Skaffold myndirnar sjálfur. Við the vegur, eru nokkrar merkingarstefnur studdar.

  • Lengra í stillingunni er það gefið til kynna context: ./leeroy-app/, þ.e. tilgreint er samhengið sem myndinni er safnað í.
  • Á dreifingarstigi er ákveðið að við munum nota kubectl og grímu fyrir nauðsynlegar birtingarmyndir.
  • PortForward: svipað og við sendum venjulega höfn með því að nota kubectl port-forward, gefum við Skaffold fyrirmæli um að kalla þessa skipun. Í þessu tilviki er staðbundin höfn 9000 send til 8080 í Deployment með nafninu leeroy-web.

Það er kominn tími til að ræsa skaffold dev: Liðið mun búa til áframhaldandi „feedback loop“, þ.e. það mun ekki aðeins safna öllu saman og dreifa því í þyrpinguna, heldur mun það einnig segja þér frá stöðu fræbelganna í augnablikinu, fylgjast með breytingum og uppfæra stöðu fræbelganna.

Hér er afrakstur kynningarinnar skaffold dev --port-forward þegar þú setur saman aftur:

Endurskoðun Skaffold fyrir Kubernetes þróun

Í fyrsta lagi geturðu séð að verið er að nota skyndiminni. Því næst er forritið sett saman, dreift og höfnum send áfram. Síðan tilgreint --port-forward, Skaffold framseldi höfnina til web, eins og hann var spurður, en hér app hann kastaði eftir eigin geðþótta (valdi næsta lausa). Eftir þetta fáum við fyrstu annálana frá umsóknunum.

Við skulum athuga hvort það virkar?

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

Að breyta skránni leeroy-app/app.go - nokkrar sekúndur líða... 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!!!

Á sama tíma sýndi Skaffold sjálft það sama í stjórnborðinu og áður, að einum punkti undanskildum: það rúllaði aðeins út leeroy-app, og ekki allt í einu.

Meiri æfing

Það er líka vert að nefna að þegar nýtt verkefni er búið til er hægt að ræsa stillingar fyrir Skaffold með skipuninni init, sem er mjög þægilegt. Að auki geturðu skrifað nokkrar stillingar: framkvæma þróun á sjálfgefna stillingu og rúlla síðan út á svið með skipuninni run (sama ferli og dev, fylgist bara ekki með breytingum), með því að nota aðra stillingu.

Á katacoda er forystu Það er enn auðveldara með dæmi. En það býður upp á tilbúinn sandkassa með Kubernetes, forriti og Skaffold. Frábær kostur ef þú hefur áhuga á að prófa grunnatriðin sjálfur.

Eitt hugsanlegt notkunartilvik fyrir Skaffold er að stunda þróun á afskekktum klasa. Það eru ekki allir sáttir við að keyra Minikube á eigin vélbúnaði, rúlla síðan forritinu út og búast við því að það virki á fullnægjandi hátt... Í þessu tilfelli leysir Skaffold vandamálið fullkomlega, sem hægt er að staðfesta til dæmis af Reddit verkfræðingum, eins og við höfum þegar rætt писали í blogginu okkar.

Og í þessa útgáfu frá Weaveworks má finna dæmi um að búa til leiðslu fyrir framleiðslu.

Ályktun

Skaffold er þægilegt tól til að byggja upp leiðslur sem fela í sér að rúlla út forritum til Kubernetes og eru fyrst og fremst lögð áhersla á þróunarþarfir. Það gerir það frekar auðvelt að búa til „stutt“ leiðslu sem tekur mið af grunnþörfum framkvæmdaraðila, en ef þess er óskað geturðu skipulagt stærri ferla. Sem eitt af skýru dæmunum um notkun Skaffold í CI/CD ferlum er gefin svo prófverkefni af 10 örþjónustum sem nota eiginleika Kubernetes, gRPC, Istio og OpenCensus Tracing.

Skaffold er nú þegar með næstum 8000+ stjörnur á GitHub, er þróað af Google og er hluti af GoogleContainerTools — Almennt séð er í augnablikinu full ástæða til að ætla að verkefnið muni þróast með farsælum hætti.

PS

Lestu líka á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd