
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:
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?
- 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.
- Das zusammengestellte Image wird mithilfe eines Container-Struktur-Tests überprüft, markiert und an die Docker-Registrierung gesendet.
- Danach wird das Image bereitgestellt - es wird in einem Kubernetes-Cluster bereitgestellt.
- 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
leeroy-app und leeroy-web enthalten Go-Code und einfache Docker-Dateien, um diesen Code lokal zu erstellen:
~/skaffold/examples/microservices
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 , // ,
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
leeroy-app/app.go
- es dauert einige Sekunden ... und:
~/skaffold/examples/microservices
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: