Rezension von Skaffold für die Kubernetes-Entwicklung

Rezension von Skaffold für die Kubernetes-Entwicklung

Vor anderthalb Jahren, am 5. März 2018, veröffentlichte Google die erste Alpha-Version seines Open-Source-Projekts für CI/CD namens Gerüst, dessen Ziel es war, eine „einfache und wiederholbare Kubernetes-Entwicklung“ zu schaffen, damit sich Entwickler auf die Entwicklung statt auf die Verwaltung konzentrieren können. Was könnte an Skaffold interessant sein? Wie sich herausstellt, hat es ein paar Tricks im Ärmel, die es zu einem leistungsstarken Werkzeug für den Entwickler und vielleicht sogar den Betriebsingenieur machen können. Machen wir uns mit dem Projekt und seinen Möglichkeiten vertraut.

NB: Übrigens haben wir in unserem General bereits kurz über Skaffold gesprochen Überprüfung der Entwicklertools, dessen Leben mit Kubernetes verbunden ist.

Theorie. Zweck und Fähigkeiten

Im Allgemeinen löst Skaffold also das Problem der Automatisierung des CI/CD-Zyklus (in den Phasen Build, Push, Deployment), indem es dem Entwickler schnelles Feedback bietet, d. h. die Möglichkeit, das Ergebnis nachfolgender Codeänderungen schnell zu erhalten – in Form einer aktualisierten Anwendung, die im Kubernetes-Cluster ausgeführt wird. Und es kann in verschiedenen Schaltkreisen (Entwicklung, Bühne, Produktion ...) arbeiten, wobei Skaffold dabei hilft, die entsprechenden Pipelines für den Rollout zu beschreiben.

Der Quellcode von Skaffold ist in Go geschrieben, vertrieben von unter der kostenlosen Apache-Lizenz 2.0 (GitHub).

Schauen wir uns die wichtigsten Funktionen und Features an. Die ersten umfassen Folgendes:

  • Skaffold bietet Tools zum Erstellen von CI/CD-Pipelines.
  • Ermöglicht Ihnen, Änderungen im Quellcode im Hintergrund zu überwachen und einen automatisierten Prozess zum Zusammenstellen von Code in Container-Images auszuführen, diese Images in der Docker-Registrierung zu veröffentlichen und sie im Kubernetes-Cluster bereitzustellen.
  • Synchronisiert Dateien im Repository mit dem Arbeitsverzeichnis im Container.
  • Führt automatische Tests mithilfe des Containerstrukturtests durch.
  • Leitet Ports weiter.
  • Liest die Protokolle einer Anwendung, die in einem Container ausgeführt wird.
  • Hilft beim Debuggen von Anwendungen, die in Java, Node.js, Python, Go geschrieben sind.

Nun zu den Funktionen:

  • Skaffold selbst verfügt über keine Cluster-seitigen Komponenten. Das heißt, es ist nicht erforderlich, Kubernetes für die Verwendung dieses Dienstprogramms weiter zu konfigurieren.
  • Verschiedene Pipelines für Ihre Anwendung. Müssen Sie den Code während der Entwicklung auf dem lokalen Minikube ausrollen und dann in die Bühne oder Produktion bringen? Zu diesem Zweck gibt es Profile und Benutzerkonfigurationen, Umgebungsvariablen und Flags, mit denen Sie verschiedene Pipelines für eine Anwendung beschreiben können.
  • CLI. Nur Konsolendienstprogramm und Konfigurationen in YAML. Im Internet findet man Hinweise auf Schaffensversuche experimentelle GUIAllerdings bedeutet das im Moment höchstwahrscheinlich nur, dass ihn jemand braucht, aber nicht wirklich.
  • Modularität. Skaffold ist kein eigenständiger Harvester, sondern strebt danach, einzelne Module oder bestehende Lösungen für spezifische Aufgaben zu nutzen.

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/vertrautere/...) Build-Lösung ausführen müssen, wird dies im Skript beschrieben, sodass Skaffold sie startet (Beispiel aus der Dokumentation). Dadurch können Sie jeden Collector verwenden, der über ein Skript aufgerufen werden kann;
  • In der Testphase ist das bereits erwähnte Container-Struktur-Test;
  • Für die Bereitstellung wird Folgendes bereitgestellt:
    • Kubectl;
    • Helm;
    • anpassen.

Aus diesem Grund kann Skaffold als einzigartig bezeichnet werden Framework für die Erstellung von CI/CD. Hier ist ein Beispiel-Workflow bei der Verwendung (aus der Projektdokumentation):

Rezension von Skaffold für die Kubernetes-Entwicklung

Wie sieht Skaffolds Arbeit im Allgemeinen aus?

  1. Das Dienstprogramm überwacht Änderungen im Quellcodeverzeichnis. Wenn Änderungen an den Dateien vorgenommen werden, werden diese mit dem Anwendungs-Pod im Kubernetes-Cluster synchronisiert. Wenn möglich, ohne das Bild neu zusammenzusetzen. Andernfalls wird ein neues Bild zusammengestellt.
  2. Das zusammengestellte Image wird mithilfe des Container-Strukturtests überprüft, markiert und an die Docker-Registrierung gesendet.
  3. Danach wird das Image bereitgestellt – bereitgestellt im Kubernetes-Cluster.
  4. Wenn der Start mit dem Befehl initialisiert wurde skaffold dev, dann beginnen wir, Protokolle von der Anwendung zu empfangen, und Skaffold wartet auf Änderungen, um alle Aktionen erneut zu wiederholen.

Rezension von Skaffold für die Kubernetes-Entwicklung
Darstellung der Hauptphasen des Skaffold-Betriebs

Üben. Ich versuche es mit Skaffold

Um die Verwendung von Skaffold zu demonstrieren, nehme ich ein Beispiel aus GitHub-Projekt-Repository. Übrigens ibid Sie können viele weitere Beispiele finden, die verschiedene Besonderheiten berücksichtigen. Ich werde alle Aktionen lokal in Minikube durchführen. Die Installation ist einfach und dauert ein paar Minuten. Um loszulegen, benötigen Sie kubectl.

Skaffold installieren:

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

Klonen wir das Skaffold-Repository mit den notwendigen Beispielen:

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

Ich habe ein Beispiel mit zwei Pods ausgewählt, die jeweils eine kleine Go-Anwendung enthalten. Eine Anwendung ist das Frontend (leeroy-web), das die Anfrage an die zweite Anwendung – das Backend (leeroy-app) – weiterleitet. 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 zum lokalen Erstellen 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 preisgeben – es reicht aus, das zu wissen leeroy-web nimmt Anfragen entgegen und leitet sie weiter leeroy-app. Deshalb in den Akten Deployment.yaml Es gibt einen Service nur für app (für internes Routing). Pod-Port web Wir leiten es an uns selbst weiter, damit wir schnell auf die Anwendung zugreifen können.

Sieht so aus 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

Alle oben genannten Phasen 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 so:

skaffold config set --global local-cluster true

Dieser Befehl legt die globale Variable fest local-cluster in die Bedeutung trueDanach versucht Skaffold nicht mehr, Bilder in die Remote-Registrierung zu übertragen. Wenn Sie lokal entwickeln, können Sie mit diesem Befehl Images lokal erstellen.

Wir kehren zu skaffold.yaml:

  • Auf der Bühne build Wir geben an, dass Sie das Bild lokal sammeln und speichern müssen. Nachdem der Build zum ersten Mal ausgeführt 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 können, hat Skaffold die Bilder selbst markiert. Übrigens werden mehrere Tagging-Richtlinien unterstützt.

  • Weiter in der Konfiguration wird darauf hingewiesen context: ./leeroy-app/, d.h. Der Kontext, in dem das Bild erfasst wird, wird angegeben.
  • In der Bereitstellungsphase wird festgelegt, dass wir kubectl und eine Maske für die erforderlichen Manifeste verwenden.
  • PortForward: Ähnlich wie wir normalerweise Ports weiterleiten kubectl port-forward, geben wir Skaffold die Anweisung, diesen Befehl aufzurufen. In diesem Fall wird der lokale Port 9000 im Deployment mit dem Namen an 8080 weitergeleitet leeroy-web.

Es ist Zeit zu starten skaffold dev: Das Team wird eine fortlaufende „Feedbackschleife“ erstellen, d. h. Es sammelt nicht nur alles und stellt es im Cluster bereit, sondern informiert Sie auch über den aktuellen Status der Pods, überwacht Änderungen und aktualisiert den Status der Pods.

Hier ist das Launch-Ergebnis skaffold dev --port-forward beim Zusammenbau:

Rezension von Skaffold für die Kubernetes-Entwicklung

Zunächst können Sie sehen, dass der Cache verwendet wird. Als Nächstes wird die Anwendung zusammengestellt, bereitgestellt und die Ports werden weitergeleitet. Da angegeben --port-forward, Skaffold leitete den Port an weiter web, wie er gefragt wurde, aber hier app er warf nach eigenem Ermessen (wählte den nächstgelegenen freien). Danach erhalten wir die ersten Protokolle der Anwendungen.

Schauen wir mal, ob es funktioniert?

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

Ändern der Datei leeroy-app/app.go - ein paar Sekunden vergehen... 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 zeigte Skaffold selbst in der Konsole dasselbe an wie zuvor, mit Ausnahme eines Punktes: Es wurde nur ausgerollt leeroy-app, und nicht alles auf einmal.

Mehr Übung

Erwähnenswert ist auch, dass beim Erstellen eines neuen Projekts Konfigurationen für Skaffold mit dem Befehl gebootet werden können init, was sehr praktisch ist. Darüber hinaus können Sie mehrere Konfigurationen schreiben: Führen Sie die Entwicklung mit der Standardkonfiguration durch und führen Sie sie dann mit dem Befehl auf die Bühne aus run (gleicher Vorgang wie dev, überwacht nur keine Änderungen) und verwendet eine andere Konfiguration.

Auf Katacoda gibt es руководство Mit einem Beispiel geht es noch einfacher. Aber es bietet eine fertige Sandbox mit Kubernetes, einer Anwendung und Skaffold. Eine tolle Option, wenn Sie die Grundlagen selbst ausprobieren möchten.

Ein möglicher Anwendungsfall für Skaffold ist die Durchführung der Entwicklung auf einem Remote-Cluster. Nicht jedem gefällt es, Minikube auf seiner eigenen Hardware auszuführen, dann die Anwendung auszurollen und zu erwarten, dass sie angemessen funktioniert ... In diesem Fall löst Skaffold das Problem perfekt, was beispielsweise von Reddit-Ingenieuren bestätigt werden kann, wie wir es getan haben bereits besprochen schrieb in unserem Blog.

Und in dieser Veröffentlichung Bei Weaveworks finden Sie ein Beispiel für die Erstellung einer Pipeline für die Produktion.

Abschluss

Skaffold ist ein praktisches Tool zum Aufbau von Pipelines, die das Rollout von Anwendungen auf Kubernetes umfassen und in erster Linie auf Entwicklungsanforderungen ausgerichtet sind. Damit ist es ganz einfach, eine „kurze“ Pipeline zu erstellen, die die Grundbedürfnisse des Entwicklers berücksichtigt, aber auf Wunsch können Sie auch größere Prozesse organisieren. Als eines der klaren Beispiele für den Einsatz von Skaffold in CI/CD-Prozessen ist gegeben solche Testprojekt von 10 Microservices unter Verwendung der Funktionen von Kubernetes, gRPC, Istio und OpenCensus Tracing.

Skaffold hat bereits fast 8000+ Sterne auf GitHub, wird von Google entwickelt und ist Teil von GoogleContainerTools — Im Allgemeinen gibt es im Moment allen Grund zu der Annahme, dass sich das Projekt bis ans Ende seiner Tage glücklich entwickeln wird.

PS

Lesen Sie auch auf unserem Blog:

Source: habr.com

Kommentar hinzufügen