Überblick über Skaffold für die Entwicklung unter Kubernetes

Überblick über Skaffold für die Entwicklung unter Kubernetes

Vor anderthalb Jahren, am 5. März 2018, hat Google die erste Alpha-Version seines Open-Source-Projekts für CI/CD mit dem Namen Skaffold nachdenken., das darauf abzielt, eine "einfache und reproduzierbare Entwicklung unter Kubernetes" zu schaffen, damit sich Entwickler auf das Entwickeln und nicht auf die Administration konzentrieren können. Was macht Skaffold interessant? Es hat sich herausgestellt, dass es einige Vorteile bietet, die es zu einem leistungsstarken Werkzeug für Entwickler und möglicherweise auch für Betriebsingenieure machen. Lassen Sie uns das Projekt und seine Möglichkeiten näher kennenlernen.

NB: Übrigens haben wir bereits kurz über Skaffold in unserem allgemeinen Überblick über Entwicklerwerkzeuge, die mit Kubernetes verbunden sind, berichtet.

Theorie. Zweck und Möglichkeiten

Zusammenfassend lässt sich sagen, dass Skaffold die Automatisierung des CI/CD-Zyklus (in den Phasen Build, Push, Deploy) erleichtert und dem Entwickler sofortige Rückmeldungen bietet, also die Möglichkeit, schnell die Ergebnisse von Codeänderungen zu sehen – in Form einer aktualisierten Anwendung, die im Kubernetes-Cluster läuft. Es kann in verschiedenen Umgebungen (Dev, Stage, Production...) arbeiten, und Skaffold unterstützt dabei, die entsprechenden Pipelines für das Deployment zu beschreiben.

Der Quellcode von Skaffold ist in der Programmiersprache Go geschrieben, wird unter der GPLv3-Lizenz bereitgestellt. unter der freien Lizenz Apache License 2.0 (GitHub).

Betrachten wir die Hauptfunktionen und Merkmale. Zu den ersten gehören:

  • Skaffold bietet Werkzeuge zur Erstellung von CI/CD-Pipelines.
  • Es überwacht im Hintergrund Änderungen im Quellcode und startet den automatisierten Prozess zur Erstellung von Container-Images, veröffentlicht diese Images im Docker Registry und deployt sie im Kubernetes-Cluster.
  • Es synchronisiert Dateien im Repository mit dem Arbeitsverzeichnis im Container.
  • Testet automatisch mit container-structure-test.
  • Leitet Ports weiter.
  • Li оқt die Logs der Anwendung, die im Container läuft.
  • Unterstützt bei der Fehlersuche von Anwendungen, die in Java, Node.js, Python, Go geschrieben wurden.

Jetzt zu den Besonderheiten:

  • Skaffold hat keine Komponenten auf der Clusterseite. Das bedeutet, dass Kubernetes nicht zusätzlich konfiguriert werden muss, um dieses Tool zu nutzen.
  • Verschiedene Pipelines für Ihre Anwendung. Müssen Sie den Code in Minikube lokal bereitstellen, während Sie entwickeln, und danach in der Stage- oder Produktionsumgebung? Dafür gibt es Profile und benutzerdefinierte Konfigurationen, Umgebungsvariablen und Flags, die es ermöglichen, verschiedene Pipelines für eine Anwendung zu beschreiben.
  • CLI. Nur die Konsolenanwendung und Konfigurationen in YAML. Im Internet finden sich Hinweise auf Versuche, ein experimentelles GUI, jedoch bedeutet dies momentan eher, dass es dafür einen Bedarf gibt, aber nicht wirklich existiert.
  • Modularität. Skaffold ist kein eigenständiges Tool, sondern zielt darauf ab, einzelne Module oder bereits bestehende Lösungen für spezifische Aufgaben zu nutzen.

Ein Beispiel dafür:

  • Während der Build-Phase können folgende Optionen verwendet werden:
    • docker build lokal, im Cluster mit kaniko oder in Google Cloud Build;
    • Bazel lokal;
    • Jib Maven und Jib Gradle lokal oder in Google Cloud Build;
    • benutzerdefinierte Build-Skripte, die lokal ausgeführt werden. Wenn Sie eine andere (flexiblere / vertrautere / ...) Lösung für den Build-Prozess verwenden möchten, wird diese im Skript beschrieben, sodass Skaffold genau das startet (aus der Dokumentation). Dadurch kann jeder beliebige Build-Werkzeug verwendet werden, das über das Skript aufgerufen werden kann;
  • In der Testphase wird bereits das erwähnte container-structure-test;
  • Für den Deployment-Prozess stehen zur Verfügung:
    • Kubectl;
    • Helm;
    • kustomize.

Dies macht Skaffold zu einer Art Framework für CI/CD. Hier ist ein Beispiel für einen Workflow bei dessen Verwendung (aus der Projektdokumentation):

Überblick über Skaffold für die Entwicklung unter Kubernetes

Wie sieht der Arbeitsablauf von Skaffold im Großen und Ganzen aus?

  1. Das Tool überwacht Änderungen im Quellverzeichnis. Wenn Änderungen an Dateien vorgenommen werden, werden diese mit dem Pod der Anwendung im Kubernetes-Cluster synchronisiert. Wenn möglich — ohne das Image erneut zu bauen. Andernfalls wird ein neues Image erstellt.
  2. Das erstellte Image wird mit container-structure-test überprüft, getaggt und in das Docker Registry hochgeladen.
  3. Anschließend wird das Image bereitgestellt — es wird im Kubernetes-Cluster deployt.
  4. Wenn der Start über den Befehl skaffold dev, dann beginnen wir, Protokolle von der Anwendung zu erhalten, während Skaffold auf Änderungen wartet, um alle Aktionen erneut auszuführen.

Überblick über Skaffold für die Entwicklung unter Kubernetes
Illustration der Hauptphasen der Skaffold-Arbeit

Praxis. Wir probieren Skaffold aus

Zur Demonstration der Verwendung von Skaffold nehme ich ein Beispiel aus dem GitHub-Repository des Projekts. Übrigens dort gibt es viele weitere Beispiele, die verschiedene Besonderheiten berücksichtigen. Alle Aktionen führe ich lokal in Minikube aus. Die Installation ist einfach und dauert nur wenige Minuten, wobei für den Start kubectl benötigt wird.

Wir installieren 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

Wir klonen das Skaffold-Repository mit den benötigten Beispielen:

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

Ich habe ein Beispiel mit zwei Pods ausgewählt, von denen jeder eine kleine Anwendung in Go enthält. Eine Anwendung ist das Frontend (leeroy-web), das Anfragen an die zweite Anwendung, das Backend (leeroy-app), weiterleitet. Sehen wir uns an, wie das aussieht:

~/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 Verzeichnisse, 8 Dateien

leeroy-app und leeroy-web enthalten Go-Code sowie einfache Dockerfiles für den lokalen Build dieses Codes:

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

Ich werde den Anwendungscode nicht aufzeigen — es genügt zu wissen, dass leeroy-web Anfragen entgegennimmt und diese an leeroy-appweiterleitet. Daher gibt es in den Deployment.yaml eine Service-Konfiguration nur für app (für die interne Routenführung). Den Port des Pods web werden wir für einen schnellen Zugriff auf die Anwendung weiterleiten.

Wie sieht 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 werden alle vorher genannten Phasen beschrieben. Neben diesem Config-Datei gibt es auch eine Datei mit globalen Einstellungen — ~/.skaffold/config. Sie können es manuell oder über die CLI bearbeiten — zum Beispiel so:

skaffold config set --global local-cluster true

Dieser Befehl setzt die globale Variable local-cluster auf true, wonach Skaffold nicht mehr versuchen wird, Images in ein entferntes Repository zu pushen. Wenn Sie lokal entwickeln, können Sie diesen Befehl verwenden, um die Images ebenfalls lokal zu speichern.

Kehren wir zurück zu skaffold.yaml:

  • In der Phase build wir geben an, dass das Image lokal gebaut und gespeichert werden soll. Nach dem ersten Start des Builds sehen wir Folgendes:
    // т.к. 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

    Wie zu sehen ist, hat Skaffold die Images automatisch getaggt. Übrigens werden mehrere Tagging-Politiken unterstützt.

  • Im Konfigurationsfile steht weiterhin context: ./leeroy-app/, das heißt, der Kontext, in dem das Image erstellt wird, ist festgelegt.
  • In der Deployment-Phase wird festgelegt, dass wir kubectl und eine Maskierung für die erforderlichen Manifestdateien verwenden.
  • PortForward: ähnlich wie wir normalerweise Ports über kubectl port-forwardweiterleiten, geben wir Skaffold Anweisungen, diesen Befehl aufzurufen. In diesem Fall wird der lokale Port 9000 auf 8080 im Deployment mit dem Namen leeroy-web.

Es ist Zeit, es zu starten skaffold dev: Das Team erstellt einen fortlaufenden „Feedback-Zyklus“, der nicht nur alles sammelt und im Cluster bereitstellt, sondern auch den aktuellen Zustand der Pods überwacht, Änderungen verfolgt und den Status der Pods aktualisiert.

Hier ist das Ergebnis des Starts skaffold dev --port-forward bei der erneuten Erstellung:

Überblick über Skaffold für die Entwicklung unter Kubernetes

Zunächst ist zu erkennen, dass der Cache verwendet wird. Danach wird die Anwendung zusammengestellt, bereitgestellt und die Ports weitergeleitet. Da angegeben ist --port-forward, hat Skaffold den Port bis zu web, wie gewünscht, weitergeleitet, während app er nach eigenem Ermessen weitergeleitet hat (den nächsten verfügbaren ausgewählt). Nach diesem Schritt erhalten wir die ersten Logs von den Anwendungen.

Überprüfen wir die Funktionsfähigkeit?

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

Modifizieren Sie die Datei leeroy-app/app.go — es vergehen einige Sekunden… und:

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

Dabei hat Skaffold in der Konsole das gleiche ausgegeben wie zuvor, mit einer Ausnahme: es hat nur leeroy-app, und nicht alles auf einmal.

Mehr Praxis

Es ist erwähnenswert, dass beim Erstellen eines neuen Projekts die Konfigurationen für Skaffold mit dem Befehl initschnell eingerichtet werden können, was sehr praktisch ist. Außerdem lassen sich mehrere Konfigurationen schreiben: Die Entwicklung erfolgt mit der Standardkonfiguration, die dann mit dem Befehl run (der gleiche Prozess wie dev, nur dass keine Änderungen verfolgt werden), unter Verwendung einer anderen Konfiguration aktualisiert wird.

Auf Katacoda gibt es die Richtlinien ein noch einfacheres Beispiel. Dort wird bereits eine funktionierende Sandbox mit Kubernetes, einer Anwendung und Skaffold angeboten. Eine großartige Option, wenn Sie selbst die Grundlagen ausprobieren möchten.

Eine mögliche Verwendung von Skaffold ist die Entwicklung auf einem Remote-Cluster. Nicht jeder möchte Minikube auf seiner eigenen Hardware starten, das Anwendung bereitstellen und auf dessen angemessene Funktion warten… In diesem Fall löst Skaffold die gestellte Aufgabe hervorragend, was zum Beispiel die Ingenieure von Reddit bestätigen können, worüber wir bereits schrieben in unserem Blog.

Und in In dieser Veröffentlichung Von Weaveworks finden Sie ein Beispiel für die Erstellung eines Pipelines für die Produktion.

Fazit

Skaffold — ein praktisches Tool zur Erstellung von Pipelines für die Bereitstellung von Anwendungen in Kubernetes, das sich in erster Linie an die Bedürfnisse der Entwicklung richtet. Mit ihm ist es recht einfach, eine "kurze" Pipeline zu entwickeln, die die grundlegenden Anforderungen der Entwickler berücksichtigt, während auch umfangreichere Prozesse organisiert werden können. Ein Beispiel dafür so ist ein Testprojekt mit 10 Microservices, die die Möglichkeiten von Kubernetes, gRPC, Istio und OpenCensus Tracing nutzen.

Skaffold hat bereits über 8000 Sterne auf GitHub erhalten, wird von Google entwickelt und ist Teil von GoogleContainerTools. Somit gibt es derzeit alle Gründe zu glauben, dass das Projekt langfristig erfolgreich sein wird.

P.S.

Lesen Sie auch in unserem Blog:

Quelle: habr.com

Erwerben Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster