Skaffold Review für Kubernetes Development



Vor eineinhalb Jahren, am 5. März 2018, veröffentlichte Google die erste Alpha-Version seines Open Source-Projekts für CI / CD namens Skaffold . Ziel war es, eine „einfache und reproduzierbare Entwicklung für Kubernetes“ zu schaffen, damit sich die Entwickler auf die Entwicklung konzentrieren können nicht auf Verwaltung. Was könnte für Skaffold von Interesse sein? Wie sich herausstellte, hat er ein paar Trümpfe im Ärmel, dank derer er ein mächtiges Werkzeug für einen Entwickler und vielleicht einen Betriebsingenieur werden kann. Wir werden uns mit dem Projekt und seinen Fähigkeiten vertraut machen.

Übrigens haben wir in unserem allgemeinen Überblick über Tools für Entwickler, deren Leben mit Kubernetes zusammenhängt, bereits kurz über Skaffold gesprochen.

Theorie Zweck und Eigenschaften


Im Allgemeinen löst Skaffold das Problem der Automatisierung des CI / CD-Zyklus (in den Phasen Build, Push, Deployment) und bietet dem Entwickler ein sofortiges Feedback, d. H. Die Möglichkeit, das Ergebnis der nächsten Codeänderungen schnell abzurufen - in Form einer aktualisierten Anwendung, die im Kubernetes-Cluster ausgeführt wird. Und es kann in verschiedenen Konturen (Entwickler, Bühne, Produktion ...) arbeiten, für die Skaffold hilft, die geeigneten Pipelines für den Roll-out zu beschreiben.

Der Quellcode für Skaffold ist in Go geschrieben und wird unter der kostenlosen Apache License 2.0 ( GitHub ) vertrieben.

Betrachten Sie die Hauptfunktionen und -merkmale. Die ersten umfassen Folgendes:

  • Skaffold bietet Tools zum Erstellen von CI / CD-Pipelines.
  • Ermöglicht es Ihnen, Änderungen im Quellcode im Hintergrund zu überwachen und den automatisierten Prozess des Einbaus des Codes in Container-Images zu starten, diese Images in der Docker-Registrierung zu veröffentlichen und im Kubernetes-Cluster bereitzustellen.
  • Synchronisiert Dateien im Repository mit dem Arbeitsverzeichnis im Container.
  • Automatische Tests mit Container-Struktur-Test.
  • Ports weiterleiten.
  • Liest die Protokolle der Anwendung, die im Container ausgeführt wird.
  • Hilft beim Debuggen von Anwendungen, die in Java, Node.js, Python, Go geschrieben wurden.

Nun zu den Funktionen:

  • Skaffold selbst hat keine cluster-seitigen Komponenten . Das heißt, Sie müssen Kubernetes nicht zusätzlich konfigurieren, um dieses Dienstprogramm zu verwenden.
  • Verschiedene Pipelines für Ihre Anwendung . Müssen Sie den Code während der Entwicklung im lokalen Minikube veröffentlichen und dann auf der Bühne oder in der Produktion? Dazu werden Profile und Benutzerkonfigurationen, Umgebungsvariablen und Flags bereitgestellt, mit denen Sie verschiedene Pipelines für eine Anwendung beschreiben können.
  • CLI Nur Konsolendienstprogramm und Konfigurationen in YAML. Im Netzwerk finden Sie Verweise auf Versuche, eine experimentelle GUI zu erstellen, aber im Moment bedeutet dies wahrscheinlich nur, dass jemand sie benötigt, aber nicht wirklich.
  • Modularität . Skaffold ist kein eigenständiger Mähdrescher, sondern versucht, separate Module oder vorhandene Lösungen für bestimmte Aufgaben zu verwenden.

Illustration des letzteren:

  • In der Montagephase können Sie Folgendes verwenden:
    • Docker-Build lokal, in einem Cluster mit Kaniko oder in Google Cloud Build;
    • Bazel vor Ort;
    • Jib Maven und Jib Gradle lokal oder in Google Cloud Build;
    • Benutzerdefinierte Build-Skripte werden lokal ausgeführt. Wenn Sie eine andere (flexiblere / vertraute / ...) Lösung für die Assembly ausführen müssen, wird diese im Skript beschrieben, damit Skaffold sie ausführt ( Beispiel aus der Dokumentation ). Auf diese Weise können Sie jeden Kollektor verwenden, der mit einem Skript aufgerufen werden kann.
  • In der Testphase wird der bereits erwähnte Container-Struktur-Test unterstützt;
  • Für den Einsatz sind vorgesehen:
    • Kubectl;
    • Helm;
    • anpassen.

Dank dessen kann Skaffold als eine Art Framework für die Erstellung von CI / CD bezeichnet werden . Hier ist ein Beispiel für einen Workflow bei Verwendung (aus der Projektdokumentation):



Wie sieht Skaffolds Arbeit im Allgemeinen aus?

  1. Das Dienstprogramm überwacht Änderungen im Quellverzeichnis. Wenn Änderungen an den Dateien vorgenommen werden, werden diese mit dem Anwendungs-Pod im Kubernetes-Cluster synchronisiert. Wenn möglich, ohne das Bild wieder zusammenzusetzen. Andernfalls wird ein neues Bild erstellt.
  2. Das zusammengestellte Image wird mithilfe eines Container-Struktur-Tests überprüft, markiert und an die Docker-Registrierung gesendet.
  3. Danach wird das Image bereitgestellt - es wird in einem Kubernetes-Cluster bereitgestellt.
  4. Wenn der Start mit dem Befehl skaffold dev initialisiert wurde, erhalten wir Protokolle von der Anwendung, und Skaffold erwartet, dass Änderungen alle Schritte erneut wiederholen.



Abbildung der Meilensteine ​​des Gerüsts

Übe. Ich versuche es mit einem Gerüst


Um die Verwendung von Skaffold zu demonstrieren, nehme ich ein Beispiel aus dem GitHub-Repository des Projekts . Übrigens finden Sie dort viele andere Beispiele, die verschiedene Besonderheiten berücksichtigen. Alle Aktionen werden lokal in Minikube ausgeführt. Die Installation ist einfach und dauert einige Minuten. Für den Start ist Kubectl erforderlich.

Installieren Sie das Gerüst:

 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 

Lassen Sie uns das Skaffold-Repository mit den erforderlichen Beispielen klonen:

 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 auf Go enthält. Eine Anwendung ist das Frontend (leeroy-web), eine Weiterleitungsanforderung an die zweite Anwendung ist das Backend (leeroy-app). Mal sehen, wie es 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 directories, 8 files 

leeroy-app und leeroy-web enthalten Go-Code und einfache Docker-Dateien, um diesen Code lokal zu erstellen:

 ~/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 weitergeben - es reicht zu wissen, dass leeroy-web Anfragen akzeptiert und an leeroy-app . Daher gibt es in den Dateien Deployment.yaml nur Service für die app (für internes Routing). Der web Pod-Port wird uns für den schnellen Zugriff auf die Anwendung zur Verfügung gestellt.

Wie skaffold.yaml aussieht:

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

Alle oben genannten Schritte werden hier beschrieben. Zusätzlich zu dieser Konfiguration gibt es auch eine Datei mit globalen Einstellungen - ~/.skaffold/config . Es kann manuell oder über die CLI bearbeitet werden - zum Beispiel wie folgt:

 skaffold config set --global local-cluster true 

Dieser Befehl setzt die globale Variable local-cluster auf true . Danach versucht Skaffold nicht mehr, die Bilder in die Remote-Registrierung zu übertragen. Wenn Sie lokal entwickeln, können Sie mit diesem Befehl auch Bilder lokal hinzufügen.

Zurück zu skaffold.yaml :

  • In der build weisen wir darauf hin, dass Sie das Image lokal erfassen und speichern müssen. Nachdem die Montage zum ersten Mal gestartet wurde, 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 Sie sehen, hat Skaffold die Bilder unabhängig getestet. Übrigens werden mehrere Tagging-Richtlinien unterstützt.
  • Folgendes wird im Konfigurationskontext angegeben context: ./leeroy-app/ , d.h. Der Kontext, in dem das Bild zusammengestellt wird, wird angegeben.
  • In der Bereitstellungsphase wird festgelegt, dass für die gewünschten Manifeste Kubectl und eine Maske verwendet werden.
  • PortForward : Ähnlich wie wir normalerweise Ports mit kubectl port-forward , geben wir Skaffold-Anweisungen, um diesen Befehl aufzurufen. In diesem Fall wird der lokale Port 9000 in Deployment unter dem Namen leeroy-web an 8080 weitergeleitet.

Es ist Zeit, mit der skaffold dev zu beginnen: Das Team erstellt eine fortlaufende „Feedback-Schleife“, d. H. sammelt nicht nur alles und installiert in einem Cluster, sondern informiert auch über den aktuellen Status von Pods, überwacht die Änderungen und aktualisiert den Status von Pods.

Hier ist das Ergebnis der Ausführung von skaffold dev --port-forward beim Zusammenbau:



Zunächst ist klar, dass der Cache verwendet wird. Als Nächstes wird die Anwendung zusammengestellt, bereitgestellt und die Ports weitergeleitet. Da --port-forward angegeben ist, hat Skaffold den Port wie gewünscht an das web weitergeleitet, die app nach eigenem Ermessen weitergeleitet (er hat die nächste freie app ). Danach erhalten wir die ersten Protokolle von den Anwendungen.

Leistung prüfen?

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

leeroy-app/app.go - es dauert 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!!! 

Gleichzeitig brachte Skaffold selbst das Gleiche wie zuvor auf die Konsole, mit der Ausnahme eines Punktes: Es wurde nur die leeroy-app und nicht alle auf einmal.

Mehr Übung


Es ist erwähnenswert, dass beim Erstellen eines neuen Projekts die Konfiguration für Skaffold mit dem Befehl init gebootet werden kann, was sehr praktisch ist. Darüber hinaus können Sie mehrere Konfigurationen schreiben: Entwickeln Sie die Konfiguration standardmäßig und rollen Sie dann mit dem Befehl run (der gleiche Vorgang wie dev , folgt nur nicht den Änderungen) auf der Bühne aus, wobei Sie eine andere Konfiguration verwenden.

Katacoda hat ein Tutorial mit einem noch einfacheren Beispiel. Dafür bietet es eine fertige Sandbox mit Kubernetes, der Applikation und Skaffold. Eine großartige Option, wenn Sie daran interessiert sind, die Grundlagen selbst auszuprobieren.

Ein möglicher Anwendungsfall für Skaffold ist die Entwicklung auf einem Remote-Cluster. Nicht jeder kann Minikube problemlos auf seiner eigenen Hardware ausführen, die Anwendung dann ausrollen und auf die ordnungsgemäße Funktion warten ... In diesem Fall löst Skaffold die Aufgabe perfekt, die beispielsweise die Reddit-Ingenieure bestätigen können, wie wir bereits in unserem Blog beschrieben haben.

In dieser Veröffentlichung von Weaveworks finden Sie ein Beispiel für die Erstellung einer Pipeline für die Produktion.

Fazit


Skaffold ist ein praktisches Tool zum Erstellen von Pipelines, bei denen Anwendungen für Kubernetes bereitgestellt werden und das sich hauptsächlich auf die Entwicklungsanforderungen konzentriert. Damit ist es ganz einfach, eine „kurze“ Pipeline zu erstellen, die die Grundbedürfnisse des Entwicklers berücksichtigt. Wenn Sie möchten, können Sie jedoch ehrgeizigere Prozesse organisieren. Eines der anschaulichen Beispiele für die Verwendung von Skaffold in CI / CD-Prozessen ist ein Testprojekt von 10 Microservices, die die Funktionen von Kubernetes, gRPC, Istio und OpenCensus Tracing nutzen.

Skaffold hat auf GitHub bereits mehr als 8000 Sterne erhalten, wird von Google entwickelt und ist Teil von GoogleContainerTools. Im Allgemeinen gibt es derzeit allen Grund zu der Annahme, dass sich das Projekt für immer glücklich entwickeln wird.

PS


Lesen Sie auch in unserem Blog:

Source: https://habr.com/ru/post/de474692/


All Articles