Pregled Skaffolda za razvoj Kubernetes

Pregled Skaffolda za razvoj Kubernetes

Pred letom in pol, 5. marca 2018, je Google izdal prvo alfa različico svojega odprtokodnega projekta za CI/CD, imenovano Skafold, katerega cilj je bil ustvariti "preprost in ponovljiv razvoj Kubernetes", tako da bi se razvijalci lahko osredotočili na razvoj in ne na administracijo. Kaj bi lahko bilo zanimivega o Skaffoldu? Izkazalo se je, da ima v rokavu nekaj trikov, s katerimi lahko postane močno orodje za razvijalca in morda celo operativnega inženirja. Spoznajmo projekt in njegove zmogljivosti.

NB: Mimogrede, o Skaffoldu smo že na kratko govorili v naši generalki pregled orodij za razvijalce, čigar življenja so povezana s Kubernetesom.

Teorija. Namen in zmogljivosti

Torej, na splošno Skaffold rešuje problem avtomatizacije cikla CI/CD (na stopnjah gradnje, potiskanja, uvajanja), tako da razvijalcu ponuja takojšnje povratne informacije, tj. zmožnost hitrega prejema rezultata kasnejših sprememb kode – v obliki posodobljene aplikacije, ki teče v gruči Kubernetes. In lahko deluje v različnih vezjih (dev, stage, production ...), za katere Skaffold pomaga opisati ustrezne cevovode za uvajanje.

Skaffoldova izvorna koda je napisana v Go, distributer pod brezplačno licenco Apache 2.0 (GitHub).

Oglejmo si glavne funkcije in funkcije. Prvi vključujejo naslednje:

  • Skaffold ponuja orodja za ustvarjanje cevovodov CI/CD.
  • Omogoča spremljanje sprememb v izvorni kodi v ozadju in zagon avtomatiziranega postopka sestavljanja kode v slike vsebnika, objavo teh slik v registru Docker in njihovo uvajanje v gručo Kubernetes.
  • Sinhronizira datoteke v repozitoriju z delovnim imenikom v vsebniku.
  • Samodejno testira s testom strukture vsebnika.
  • Posreduje vrata.
  • Bere dnevnike aplikacije, ki se izvaja v vsebniku.
  • Pomaga pri odpravljanju napak v aplikacijah, napisanih v Javi, Node.js, Python, Go.

Zdaj o funkcijah:

  • Sam Skaffold nima komponent na strani gruče. To pomeni, da Kubernetesa ni treba dodatno konfigurirati za uporabo tega pripomočka.
  • Različni cevovodi za vašo aplikacijo. Ali morate med razvojem uvesti kodo v lokalni Minikube in nato v oder ali produkcijo? V ta namen obstajajo profili in uporabniške konfiguracije, spremenljivke okolja in zastavice, ki vam omogočajo, da opišete različne cevovode za eno aplikacijo.
  • CLI. Samo konzolni pripomoček in konfiguracije v YAML. Na internetu lahko najdete sklicevanja na poskuse ustvarjanja eksperimentalni GUI, vendar to trenutno najverjetneje pomeni le, da ga nekdo potrebuje, ne pa res.
  • Modularnost. Skaffold ni samostojen harvester, ampak stremi k uporabi posameznih modulov ali obstoječih rešitev za specifične naloge.

Ilustracija slednjega:

  • V fazi montaže lahko uporabite:
    • gradnjo dockerja lokalno, v gruči z uporabo kanika ali v storitvi Google Cloud Build;
    • Bazel lokalno;
    • Jib Maven in Jib Gradle lokalno ali v storitvi Google Cloud Build;
    • skripti za izdelavo po meri se izvajajo lokalno. Če morate zagnati drugo (bolj prilagodljivo/znano/...) gradbeno rešitev, je opisana v skriptu, tako da jo Skaffold zažene (primer iz dokumentacije). To vam omogoča uporabo katerega koli zbiralnika, ki ga lahko pokličete s skriptom;
  • V fazi testiranja že omenjeno test strukture vsebnika;
  • Za uvajanje je na voljo naslednje:
    • Kubectl;
    • čelada;
    • prilagoditi.

Zahvaljujoč temu lahko Skaffold imenujemo edinstven okvir za gradnjo CI/CD. Tukaj je primer poteka dela pri njegovi uporabi (iz projektne dokumentacije):

Pregled Skaffolda za razvoj Kubernetes

Kako je na splošno videti Skaffoldovo delo?

  1. Pripomoček spremlja spremembe v imeniku izvorne kode. Če se datoteke spremenijo, se te sinhronizirajo s podom aplikacije v gruči Kubernetes. Če je mogoče, brez ponovnega sestavljanja slike. V nasprotnem primeru se sestavi nova slika.
  2. Sestavljena slika se preveri s testom strukture vsebnika, označi in pošlje v register Docker.
  3. Po tem se slika razmesti – razmesti v gručo Kubernetes.
  4. Če je bil zagon inicializiran z ukazom skaffold dev, nato začnemo prejemati dnevnike iz aplikacije in Skaffold čaka na spremembe, da znova ponovi vsa dejanja.

Pregled Skaffolda za razvoj Kubernetes
Ilustracija glavnih faz delovanja Skaffold

Vadite. Preizkušam Skaffold

Za prikaz uporabe Skaffolda bom vzel primer iz Repozitorij projektov GitHub. Mimogrede, tam Najdete lahko še veliko drugih primerov, ki upoštevajo različne posebnosti. Vsa dejanja bom izvajal lokalno v Minikube. Namestitev je preprosta in traja nekaj minut, za začetek pa boste potrebovali kubectl.

Namestite 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

Klonirajmo Skaffoldovo skladišče s potrebnimi primeri:

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

Izbral sem primer z dvema sklopoma, od katerih vsak vsebuje eno majhno aplikacijo Go. Ena aplikacija je frontend (leeroy-web), ki preusmeri zahtevo na drugo aplikacijo – backend (leeroy-app). Poglejmo, kako izgleda:

~/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 in leeroy-web vsebujeta kodo Go in preproste datoteke Dockerfiles za lokalno izdelavo te kode:

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

Ne bom dal kode aplikacije - dovolj je, da to vem leeroy-web sprejema zahteve in jih posreduje leeroy-app. Zato v datotekah Deployment.yaml obstaja storitev samo za app (za interno usmerjanje). Pod pristanišče web ga bomo posredovali sebi za hiter dostop do aplikacije.

Izgleda 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

Vse zgoraj omenjene stopnje so opisane tukaj. Poleg te konfiguracije obstaja tudi datoteka z globalnimi nastavitvami - ~/.skaffold/config. Urejate ga lahko ročno ali prek CLI - na primer takole:

skaffold config set --global local-cluster true

Ta ukaz bo nastavil globalno spremenljivko local-cluster v pomen true, po katerem Skaffold ne bo poskušal potisniti slik v oddaljeni register. Če razvijate lokalno, lahko uporabite ta ukaz za lokalno gradnjo slik.

Nazaj k skaffold.yaml:

  • Na odru build določamo, da morate sliko zbrati in shraniti lokalno. Ko se gradnja prvič zažene, bomo videli naslednje:
    // т.к. 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

    Kot lahko vidite, je Skaffold sam označil slike. Mimogrede, podprtih je več politik označevanja.

  • Nadalje v konfiguraciji je navedeno context: ./leeroy-app/, tj. določen je kontekst, v katerem je slika zbrana.
  • Na stopnji uvajanja je določeno, da bomo uporabili kubectl in masko za potrebne manifeste.
  • PortForward: podobno kot običajno posredujemo vrata z uporabo kubectl port-forward, Skaffoldu damo navodila za klic tega ukaza. V tem primeru so lokalna vrata 9000 posredovana na 8080 v razmestitvi z imenom leeroy-web.

Čas je za izstrelitev skaffold dev: Ekipa bo ustvarila stalno »povratno zanko«, tj. ne samo, da bo vse zbral in razmestil v gručo, ampak vam bo tudi povedal o trenutnem stanju podov, spremljal spremembe in posodobil stanje podov.

Tukaj je rezultat zagona skaffold dev --port-forward pri ponovnem sestavljanju:

Pregled Skaffolda za razvoj Kubernetes

Najprej lahko vidite, da se predpomnilnik uporablja. Nato se aplikacija sestavi, razmesti in posreduje vrata. Ker je določeno --port-forward, je Skaffold posredoval pristanišče web, kot ga vprašali, ampak tukaj app metal je po lastni presoji (izbral najbližjo prosto). Po tem prejmemo prve dnevnike aplikacij.

Preverimo, če deluje?

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

Spreminjanje datoteke leeroy-app/app.go - mine nekaj sekund ... in:

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

Hkrati je sam Skaffold v konzoli prikazal isto stvar kot prej, z izjemo ene točke: le iztekel se je leeroy-app, in ne vse naenkrat.

Več vaje

Prav tako je treba omeniti, da lahko pri ustvarjanju novega projekta konfiguracije za Skaffold zaženete z ukazom init, kar je zelo priročno. Poleg tega lahko napišete več konfiguracij: izvedete razvoj na privzeti konfiguraciji in nato z ukazom uvedete na stopnjo run (isti postopek kot dev, preprosto ne spremlja sprememb), z uporabo druge konfiguracije.

Na katacoda je vodstvo S primerom je še lažje. Ponuja pa že pripravljen peskovnik s Kubernetesom, aplikacijo in Skaffoldom. Odlična možnost, če želite sami preizkusiti same osnove.

Eden od možnih primerov uporabe za Skaffold je izvajanje razvoja na oddaljeni gruči. Vsakomur ni prijetno poganjati Minikube na lastni strojni opremi, nato pa aplikacijo razviti in pričakovati, da bo ustrezno delovala ... V tem primeru Skaffold odlično rešuje težavo, kar lahko potrdijo na primer inženirji Reddita, saj imamo že obravnavan писали v našem blogu.

In ta publikacija pri Weaveworks lahko najdete primer ustvarjanja cevovoda za proizvodnjo.

Zaključek

Skaffold je priročno orodje za gradnjo cevovodov, ki vključujejo uvajanje aplikacij v Kubernetes in so osredotočeni predvsem na razvojne potrebe. Omogoča precej enostavno ustvarjanje "kratkega" cevovoda, ki upošteva osnovne potrebe razvijalca, vendar po želji lahko organizirate večje procese. Kot enega od jasnih primerov uporabe Skaffolda v procesih CI/CD je podan kot testni projekt 10 mikrostoritev, ki uporabljajo zmogljivosti Kubernetes, gRPC, Istio in OpenCensus Tracing.

Skaffold ima na GitHubu že skoraj 8000+ zvezdic, razvil ga je Google in je del Google ContainerTools — na splošno trenutno obstajajo vsi razlogi za domnevo, da se bo projekt srečno razvijal do konca svojih dni.

PS

Preberite tudi na našem blogu:

Vir: www.habr.com

Dodaj komentar