Nekega čudovitega pomladnega večera, ko domov ni bilo želje, in neukročena želja po življenju in spoznavanju je srbečim in žgočim železom mučila, se je pojavila ideja, da bi se malo poigrali s privlačno funkcijo požarnega zidu, imenovano.

Nekega čudovitega pomladnega večera, ko domov ni bilo želje, in neukročena želja po življenju in spoznavanju je srbečim in žgočim železom mučila, se je pojavila ideja, da bi se malo poigrali s privlačno funkcijo požarnega zidu, imenovano.

Predkonec 5. marca 2018 je podjetje Google izdalo prvo alfa različico svojega odprtokodnega projekta za CI/CD z imenom Skaffold, katere cilj je ustvariti "enostavno in ponovljivo razvojno okolje za Kubernetes", da se lahko razvijalci osredotočijo na razvoj, namesto na upravljanje. Kaj lahko Skaffold ponudi? Kot se je izkazalo, ima več adutov, zaradi katerih je lahko močno orodje tako za razvijalce kot za inženirje za upravljanje. Spoznajmo projekt in njegove zmožnosti.

NB: Mimogrede, že smo na kratko spregovorili o Skaffoldu v našem splošnem pregledu orodij za razvijalce, katerih življenje je povezano s Kubernetesom.

Teorija. Namen in možnosti

Torej, na splošno lahko rečemo, da Skaffold rešuje nalogo avtomatizacije CI/CD cikla (v fazah build, push, deploy), saj razvijalcu ponuja hitro povratno informacijo, to je sposobnost hitrega pridobivanja rezultatov sprememb kode — v obliki posodobljene aplikacije, ki deluje v Kubernetes klasterju. Deluje lahko v različnih okoljih (dev, stage, production…), za kar Skaffold pomaga opisati ustrezne poti za izvedbo.

Izvorna koda Skaffolda je napisana v jeziku Go, se distribuira pod pogoji proste licence Apache License 2.0 (GitHub).

Oglejmo si glavne funkcije in lastnosti. Med prvimi lahko omenimo naslednje:

  • Skaffold ponuja orodja za ustvarjanje CI/CD poti.
  • Omogoča spremljanje sprememb v izvorni kodi v ozadju in zagon avtomatiziranega procesa sestavljanja kode v slike kontejnerjev, objavo teh slik v Docker Registry in njihovo uvedbo v Kubernetes klaster.
  • Sinhronizira datoteke v repozitoriju z delovnim imenikom v kontejnerju.
  • Samodejno testira z uporabo container-structure-test.
  • Preusmerja vrata.
  • Beri dnevnike aplikacije, zagnane v kontejnerju.
  • Pomaga pri odpravljanju napak v aplikacijah, napisanih v Java, Node.js, Python, Go.

Zdaj o posebnostih:

  • Sama Skaffold nima komponent na strani klasterja. To pomeni, da dodatne nastavitve Kubernetes za uporabo tega orodja niso potrebne.
  • Različne poti za vašo aplikacijo. Morate izdati kodo v lokalni Minikube, medtem ko razvijate, nato pa na stage ali production? Za to so predvideni profil in user configurations, environment variables, and flags that allow describing different pipelines for a single application.
  • CLI. Only a console utility and configurations in YAML. Online, you can find mentions of attempts to create an experimental GUI, however, at the moment this mostly means that someone needs it, but not very much.
  • Modularity. Skaffold is not a standalone tool; it aims to use individual modules or existing solutions for specific tasks.

An illustration of the latter:

  • At the build stage, you can use:
    • docker build locally, in a cluster using kaniko, or in Google Cloud Build;
    • Bazel locally;
    • Jib Maven and Jib Gradle locally or in Google Cloud Build;
    • custom build scripts running locally. If you need to run another (more flexible/customary/…) build solution, it is described in the script for Skaffold to specifically run that one (primer iz dokumentacije). This allows using any build tool that can be invoked through a script;
  • At the testing stage, the previously mentioned container-structure-test;
  • For deployment, the following are provided:
    • Kubectl;
    • Helm;
    • kustomize.

Thanks to this, Skaffold can be described as a kind of framework for building CI/CD. Here’s an example of the workflow when using it (from the project documentation):

Nekega čudovitega pomladnega večera, ko domov ni bilo želje, in neukročena želja po življenju in spoznavanju je srbečim in žgočim železom mučila, se je pojavila ideja, da bi se malo poigrali s privlačno funkcijo požarnega zidu, imenovano.

What does the overall work of Skaffold look like?

  1. The utility monitors changes in the source code directory. If modifications are made to the files, they are synchronized with the app's pod in the Kubernetes cluster. If possible — without rebuilding the image. Otherwise — a new image is built.
  2. The built image is validated using container-structure-test, tagged, and sent to Docker Registry.
  3. After that, the image is deployed — launched in the Kubernetes cluster.
  4. If the launch was initiated with the command skaffold dev, we begin receiving logs from the application while Skaffold waits for changes to repeat all actions again.

Nekega čudovitega pomladnega večera, ko domov ni bilo želje, in neukročena želja po življenju in spoznavanju je srbečim in žgočim železom mučila, se je pojavila ideja, da bi se malo poigrali s privlačno funkcijo požarnega zidu, imenovano.
An illustration of the main stages of Skaffold's operation

Practice. Let's try Skaffold

To demonstrate the use of Skaffold, I'll take an example from the GitHub repository of the project. By the way, tja you can also find many other examples considering various specifics. All actions will be performed locally in Minikube. The installation is simple and will take a few minutes, and you'll need kubectl to get started.

Let's install 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

Kloniće repo sa primerima za Skaffold:

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

Izabrao sam primer sa dva pod-a, od kojih svaki sadrži po jednu malu aplikaciju napisanu u Go. Jedna aplikacija je frontend (leeroy-web), koja preusmerava zahteve na drugu aplikaciju — backend (leeroy-app). Pogledajmo kako to 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 direktorijuma, 8 datoteka

leeroy-app i leeroy-web sadrže kod na Go i jednostavne Dockerfile-ove za lokalnu izgradnju tog koda:

~/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ću prikazivati kod aplikacija — dovoljno je znati da leeroy-web prihvata zahteve i proksira ih ka leeroy-app. Zato u datotekama Deployment.yaml postoji Service samo za app (za internu rutiranje). Port pod-a web proširićemo za brzi pristup aplikaciji.

Kako 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

Ovdje su opisane sve faze pomenute ranije. Pored ove konfiguracije postoji i datoteka sa globalnim podešavanjima — ~/ .skaffold/config. Može se uređivati ručno ili putem CLI-ja — na primer, ovako:

skaffold config set --global local-cluster true

Ova komanda postavlja globalnu promenljivu local-cluster na vrednost true, nakon čega Skaffold neće pokušavati da 'push'-uje slike u udaljeni registar. Ako radite lokalno, možete koristiti ovu komandu da skladištite slike lokalno.

Vratimo se na skaffold.yaml:

  • U fazi build navodimo da treba napraviti i sačuvati sliku lokalno. Nakon što se prvi put pokrene izgradnja, videćemo sledeće:
    // т.к. 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

    Kao što se može videti, Skaffold je samostalno označio slike. Usput, podržava se nekoliko politika označavanja.

  • Dalje, u konfiguraciji je navedeno context: ./leeroy-app/, tj. postavljen je kontekst u kojem se slika gradi.
  • Na fazi implementacije utvrđuje se da ćemo koristiti kubectl i masku za potrebne manifeste.
  • PortForward: slično onome kako obično preusmjeravamo portove pomoću kubectl port-forward, dajemo instrukcije Skaffoldu za pozivanje ove komande. U ovom slučaju — lokalni port 9000 se preusmjerava na 8080 u Deployment-u nazvanom leeroy-web.

Sada je vreme da pokrenemo skaffold dev: komanda će stvoriti neprekidnu 'povratnu petlju', tj. ne samo da će skupiti sve i implementirati u klaster, već će i izvesti stanje podova u tom trenutku, pratiti promene i ažurirati stanje podova.

Evo rezultata pokretanja skaffold dev --port-forward prilikom ponovne izrade:

Nekega čudovitega pomladnega večera, ko domov ni bilo želje, in neukročena želja po življenju in spoznavanju je srbečim in žgočim železom mučila, se je pojavila ideja, da bi se malo poigrali s privlačno funkcijo požarnega zidu, imenovano.

Prvo, vidimo da se koristi keš. Zatim — aplikacija se pravi, implementira, portovi se preusmjeravaju. Budući da je navedeno --port-forward, Skaffold je preusmjerio port do web, kao što je i traženo, dok je app preusmjerio po sopstvenoj proceni (izabrao najbliži slobodni). Posle ovoga dobijamo prve logove od aplikacija.

Da proverimo funkcionalnost?

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

Modifikujemo datoteku leeroy-app\/app.go — prođe nekoliko sekundi… i:

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

U tom trenutku sam Skaffold isporučio u konzolu isto što i ranije, osim jednog momenta: izveo je samo leeroy-app, a ne sve odjednom.

Više prakse

Vrijedi pomenuti i to da prilikom kreiranja novog projekta, konfiguracije za Skaffold se mogu za 'bootstrap' pomoću komande init, što je veoma praktično. Pored toga, moguće je napisati nekoliko konfiguracija: raditi na konfiguraciji po defaultu, a zatim preći na stage komandom run (isti proces kao i dev, samo ne prati promene), koristeći drugu konfiguraciju.

Na katacodi postoji vodnik s primerom još jednostavnijim. Umesto toga, tamo se nudi već gotova sandbox sa Kubernetes-om, aplikacijom i Skaffold-om. Odlična opcija, ako vam je zanimljivo da samostalno isprobate osnove.

Ena od možnosti uporabe Skaffolda je razvoj na oddaljenem klastru. Ni vsakomur udobno zagnati Minikube na svoji strojni opremi, nato pa implementirati aplikacijo in čakati na njeno ustrezno delovanje… V tem primeru Skaffold odlično rešuje postavljeno nalogo, kar lahko potrdijo inženirji Reddit, o čemer smo že pisali v našem blogu.

In te publikacije od Weaveworks lahko najdete primer ustvarjanja pipelines za produkcijo.

Zaključek

Skaffold je priročno orodje za gradnjo pipelines, ki vključujejo implementacijo aplikacij v Kubernetes in so usmerjena predvsem na potrebe razvoja. Z njim je precej enostavno ustvariti 'kratko' pipeline, ki upošteva osnovne potrebe razvijalca, vendar pa je mogoče organizirati tudi bolj obsežne procese. Kot en od jasnih primerov uporabe Skaffolda v CI/CD procesih se navaja takšen testni projekt s 10 mikrostoritvami, ki izkoriščajo možnosti Kubernetes, gRPC, Istio in OpenCensus Tracing.

Skaffold je že prejel skoraj 8000+ zvezd na GitHubu, razvija ga Google in je del GoogleContainerTools — na splošno, za pravočasno menimo, da se bo projekt razvijal dolgo in srečno.

P.S.

Preberite tudi na našem blogu:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster