Op een prachtige lentedag, toen ik niet naar huis wilde, en een onbedwingbare drang om te leven en te leren me brandde als een heet ijzer, kwam het idee op om de verleidelijke nieuwe functie op de firewall te onderzoeken.

Op een prachtige lentedag, toen ik niet naar huis wilde, en een onbedwingbare drang om te leven en te leren me brandde als een heet ijzer, kwam het idee op om de verleidelijke nieuwe functie op de firewall te onderzoeken.

Anderhalve jaar geleden, op 5 maart 2018, heeft Google de eerste alfa-versie van zijn Open Source-project voor CI/CD genaamd Skaffold, met als doel het creëren van "eenvoudige en reproduceerbare ontwikkeling op Kubernetes", zodat ontwikkelaars zich kunnen concentreren op het ontwikkelen in plaats van op het beheer. Wat maakt Skaffold interessant? Het lijkt erop dat het enkele troeven heeft waardoor het een krachtig hulpmiddel kan worden voor zowel ontwikkelaars als operationele ingenieurs. Laten we kennismaken met het project en zijn mogelijkheden.

NB: Overigens hebben we kort al iets verteld over Skaffold in onze algemene overzicht van tools voor ontwikkelaars, wiens leven verband houdt met Kubernetes.

Theorie. Doel en mogelijkheden

Dus, om het algemeen te zeggen, lost Skaffold de automatiseringsvraag van de CI/CD-cyclus op (in de fasen build, push, deploy), door de ontwikkelaar directe feedback te bieden, dat wil zeggen de mogelijkheid om snel de resultaten van recente codewijzigingen te ontvangen - in de vorm van een bijgewerkte applicatie die draait in een Kubernetes-cluster. En het kan werken in verschillende omgevingen (dev, stage, production...), waarvoor Skaffold helpt om de bijbehorende pipelines voor implementatie te beschrijven.

De broncode van Skaffold is geschreven in de programmeertaal Go, wordt verspreid onder de voorwaarden van de Apache License 2.0 (GitHub).

Laten we de belangrijkste functies en mogelijkheden bekijken. Tot de eerste behoren de volgende:

  • Skaffold biedt hulpmiddelen voor het creëren van CI/CD-pipelines.
  • Staat achtergrondmonitoring toe van wijzigingen in de broncode en lanceert een geautomatiseerd proces voor het bouwen van code in containerafbeeldingen, het publiceren van deze afbeeldingen in de Docker Registry en hun implementatie in het Kubernetes-cluster.
  • Synchroniseert bestanden in de repository met de werkdirectory in de container.
  • Test automatisch met behulp van container-structure-test.
  • Stelt poorten door.
  • Leest de logs van de applicatie die in de container draait.
  • Helpt bij het debuggen van applicaties die zijn geschreven in Java, Node.js, Python, Go.

Laten we nu kijken naar de kenmerken:

  • Skaffold zelf heeft geen componenten aan de clusterzijde. Dit betekent dat Kubernetes niet extra geconfigureerd hoeft te worden voor gebruik met deze tool.
  • Verschillende pipelines voor uw applicatie. Moet code uitrollen naar de lokale Minikube terwijl je ontwikkelt, en daarna naar staging of productie? Daarvoor zijn er profielen en gebruikersconfiguraties, omgevingsvariabelen en vlaggen die het mogelijk maken verschillende pipelines voor één applicatie te beschrijven.
  • CLIHet is alleen een consoletool en configuraties in YAML. Online zijn er vermeldingen van pogingen om een experimentele GUI, maar op dit moment betekent dit eerder dat iemand het nodig heeft, maar niet veel.
  • Modulariteit. Skaffold is geen op zichzelf staande tool, maar streeft ernaar om afzonderlijke modules of al bestaande oplossingen voor specifieke taken te gebruiken.

Een illustratie hiervan:

  • In de bouwfase kunnen de volgende middelen worden gebruikt:
    • docker build lokaal, in een cluster met behulp van kaniko of in Google Cloud Build;
    • Bazel lokaal;
    • Jib Maven en Jib Gradle lokaal of in Google Cloud Build;
    • aangepaste build-scripts die lokaal worden uitgevoerd. Als u een andere (meer flexibele / gebruikelijke / ...) buildoplossing wilt gebruiken, wordt deze in het script beschreven zodat Skaffold precies die uitvoert (voorbeeld uit de documentatie). Dit maakt het mogelijk om elke builder te gebruiken die via een script kan worden aangeroepen;
  • Tijdens de testfase wordt al genoemd container-structure-test;
  • Voor deployment zijn de volgende middelen beschikbaar:
    • Kubectl;
    • Helm;
    • kustomize.

Hierdoor kan Skaffold worden beschouwd als een soort framework voor CI/CD. Hier is een voorbeeld van een workflow bij gebruik (uit de documentatie van het project):

Op een prachtige lentedag, toen ik niet naar huis wilde, en een onbedwingbare drang om te leven en te leren me brandde als een heet ijzer, kwam het idee op om de verleidelijke nieuwe functie op de firewall te onderzoeken.

Hoe ziet de werking van Skaffold er globaal uit?

  1. De tool houdt wijzigingen in de map met de broncode in de gaten. Als er wijzigingen in de bestanden worden aangebracht, worden deze gesynchroniseerd met de pod van de applicatie in het Kubernetes-cluster. Indien mogelijk — zonder de afbeelding opnieuw te bouwen. In andere gevallen — wordt een nieuwe afbeelding gebouwd.
  2. De gebouwde afbeelding wordt gecontroleerd met container-structure-test, getagd en naar de Docker Registry gestuurd.
  3. Daarna wordt de afbeelding gedeployed — uitgerold in het Kubernetes-cluster.
  4. Als de uitvoering is gestart met het commando skaffold dev, dan beginnen we logboeken van de applicatie te ontvangen, terwijl Skaffold wacht op wijzigingen om alle acties opnieuw te herhalen.

Op een prachtige lentedag, toen ik niet naar huis wilde, en een onbedwingbare drang om te leven en te leren me brandde als een heet ijzer, kwam het idee op om de verleidelijke nieuwe functie op de firewall te onderzoeken.
Illusie van de belangrijkste stappen in de werking van Skaffold

Praktijk. Probeer Skaffold

Voor een demonstratie van het gebruik van Skaffold neem ik een voorbeeld uit de GitHub-repository van het project. Übrigens, daarzelfde Er zijn ook veel andere voorbeelden te vinden die rekening houden met verschillende specificaties. Alle acties worden lokaal in Minikube uitgevoerd. De installatie is eenvoudig en duurt een paar minuten, en voor de eerste stap is kubectl nodig.

Laten we Skaffold installeren:

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

We klonen de Skaffold-repository met de benodigde voorbeelden:

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

Ik heb een voorbeeld gekozen met twee pods, elk met een kleine applicatie geschreven in Go. Eén applicatie is de frontend (leeroy-web), die verzoeken doorstuurt naar de tweede applicatie, de backend (leeroy-app). Laten we eens kijken hoe dat eruitziet:

~/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 bevatten Go-code en eenvoudige Dockerfiles voor de lokale opbouw van deze code:

~/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 zal de code van de applicaties niet geven — het is voldoende om te weten dat leeroy-web verzoeken aanvaardt en deze doorstuurt naar leeroy-app. Daarom bevat het bestand Deployment.yaml een Service alleen voor app (voor interne routering). De poort van de pod web gaan we doorsturen voor snelle toegang tot de applicatie.

Hoe ziet 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

Hier worden alle fasen beschreven die eerder zijn genoemd. Naast deze configuratie is er ook een bestand met globale instellingen — ~/ .skaffold/config. Dit kan handmatig worden bewerkt of via de CLI — bijvoorbeeld zo:

skaffold config set --global local-cluster true

Dit commando stelt de globale variabele local-cluster op de waarde van true, waarna Skaffold niet zal proberen om afbeeldingen naar een externe register te pushen. Als je lokaal ontwikkelt, kun je dit commando gebruiken om ook lokaal afbeeldingen op te slaan.

Laten we terugkeren naar skaffold.yaml:

  • In de fase build geven we aan dat de afbeelding lokaal moet worden opgebouwd en opgeslagen. Nadat de bouw voor het eerst is uitgevoerd, zullen we het volgende zien:
    // т.к. 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

    Zoals te zien is, heeft Skaffold zelf de afbeeldingen getagd. Übrigens worden meerdere tagging-beleid ondersteund.

  • Vervolgens staat in de configuratie context: ./leeroy-app/, dat wil zeggen dat de context is gedefinieerd waarin de afbeelding wordt opgebouwd.
  • In de implementatiefase wordt bepaald dat we kubectl gaan gebruiken en een masker voor de benodigde manifesten.
  • PortForward: vergelijkbaar met hoe we normaal gesproken poorten doorgeven met behulp van kubectl port-forward, geven we instructies aan Skaffold om dit commando aan te roepen. In dit geval wordt lokale poort 9000 doorgestuurd naar 8080 in de Deployment met de naam leeroy-web.

Het is tijd om skaffold dev: het commando creëert een voortgaande 'feedbackloop', dat wil zeggen dat het niet alleen alles verzamelt en implementeert in het cluster, maar ook informatie geeft over de huidige status van de pods, de veranderingen volgt en de status van de pods update.

Hier is het resultaat van de uitvoering skaffold dev --port-forward bij een herbouw:

Op een prachtige lentedag, toen ik niet naar huis wilde, en een onbedwingbare drang om te leven en te leren me brandde als een heet ijzer, kwam het idee op om de verleidelijke nieuwe functie op de firewall te onderzoeken.

Ten eerste is te zien dat de cache wordt gebruikt. Vervolgens wordt de applicatie gebouwd, geïmplementeerd en worden de poorten doorgestuurd. Aangezien is opgegeven --port-forward, heeft Skaffold de poort doorgestuurd zoals gevraagd, maar hij heeft webde poort naar eigen inzicht doorgestuurd (de dichtstbijzijnde beschikbare gekozen). Daarna krijgen we de eerste logs van de applicaties. app Zullen we de functionaliteit controleren?

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

Laten we het bestand

leeroy-app/app.go aanpassen — na enkele seconden… 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!!!

Ondertussen heeft Skaffold hetzelfde in de console weergegeven als eerder, met uitzondering van één moment: hij heeft alleen

, en niet alles in één keer. leeroy-appMeer praktijkervaring

Het is ook vermeldenswaard dat bij het maken van een nieuw project de configuraties voor Skaffold kunnen worden 'gebootstrap't met behulp van het commando

init , wat erg handig is. Bovendien kunnen meerdere configuraties worden geschreven: ontwikkelen op de standaardconfiguratie, en daarna implementeren met het commandorun (hetzelfde proces als dev , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie.Op katacoda is er

een handleiding handboek met een nog eenvoudiger voorbeeld. Bovendien biedt het al een kant-en-klare sandbox met Kubernetes, een applicatie en Skaffold. Een uitstekende optie als je zelf de basisprincipes wilt uitproberen.

Een van de mogelijke toepassingen van Skaffold is ontwikkelen op een externe cluster. Niet iedereen vindt het handig om Minikube op eigen hardware te draaien, om vervolgens een applicatie uit te rollen en te wachten totdat deze goed functioneert... In dat geval lost Skaffold de gestelde taak uitstekend op, wat bijvoorbeeld ingenieurs van Reddit kunnen bevestigen, waar we al eerder over hebben geschreven op onze blog.

En bij deze publicatie Weaveworks kun je een voorbeeld vinden van het creëren van een pipeline voor productie.

Conclusie

Skaffold is een handig hulpmiddel voor het bouwen van pipelines voor het uitrollen van applicaties in Kubernetes, met een focus op ontwikkelbehoeften. Het is vrij eenvoudig om een 'korte' pipeline te creëren die aan de basisbehoeften van een ontwikkelaar voldoet, maar als je wilt, kun je ook grotere processen organiseren. Een van de duidelijke voorbeelden van het gebruik van Skaffold in CI/CD-processen wordt gegeven zo'n door een testproject met 10 microservices die gebruikmaken van de mogelijkheden van Kubernetes, gRPC, Istio en OpenCensus Tracing.

Skaffold heeft al bijna 8000+ sterren op GitHub, het wordt ontwikkeld door Google en maakt deel uit van GoogleContainerTools — kortom, op dit moment zijn er alle redenen om aan te nemen dat het project zich langdurig en succesvol zal ontwikkelen.

P.S.

Lees ook op onze blog:

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster