Tools für Entwickler von Anwendungen, die auf Kubernetes ausgeführt werden

Tools für Entwickler von Anwendungen, die auf Kubernetes ausgeführt werden

Ein moderner Betriebsansatz löst viele dringende Geschäftsprobleme. Container und Orchestratoren erleichtern die Skalierung von Projekten beliebiger Komplexität, vereinfachen die Veröffentlichung neuer Versionen und machen sie zuverlässiger, schaffen aber gleichzeitig zusätzliche Probleme für Entwickler. Dem Programmierer geht es in erster Linie um seinen Code: Architektur, Qualität, Leistung, Eleganz – und nicht darum, wie er in Kubernetes funktioniert und wie er nach minimalen Änderungen getestet und debuggt werden kann. Daher ist es auch ganz natürlich, dass aktiv Tools für Kubernetes entwickelt werden, die dabei helfen, die Probleme selbst der „archaischsten“ Entwickler zu lösen und ihnen die Möglichkeit zu geben, sich auf das Wesentliche zu konzentrieren.

Diese Rezension bietet kurze Informationen über einige der Tools, die einem Programmierer, dessen Code im Pod'ax eines Kubernetes-Clusters ausgeführt wird, das Leben erleichtern.

Einfache Helfer

Kubectl-Debug

  • Die Quintessenz: Fügen Sie Ihren Container einem Pod hinzu und sehen Sie, was darin passiert.
  • GitHub.
  • Kurze GH-Statistiken: 715 Sterne, 54 Commits, 9 Mitwirkende.
  • Sprache: Los.
  • Lizenz: Apache-Lizenz 2.0.

Mit diesem Plugin für kubectl können Sie einen zusätzlichen Container innerhalb des gewünschten Pods erstellen, der den Prozess-Namespace mit anderen Containern teilt. Darin können Sie den Betrieb des Pods debuggen: das Netzwerk überprüfen, den Netzwerkverkehr abhören, eine Überwachung des betreffenden Prozesses durchführen usw.

Sie können auch durch Ausführen zum Prozesscontainer wechseln chroot /proc/PID/root – Dies kann sehr praktisch sein, wenn Sie eine Root-Shell in einem Container benötigen, für den sie im Manifest festgelegt ist securityContext.runAs.

Das Tool ist einfach und effektiv und kann daher für jeden Entwickler nützlich sein. Mehr darüber haben wir in geschrieben separater Artikel.

Telepräsenz

  • Die Quintessenz: Übertragen Sie die Anwendung auf Ihren Computer. Lokal entwickeln und debuggen.
  • Webseite; GitHub.
  • Kurze GH-Statistiken: 2131 Sterne, 2712 Commits, 33 Mitwirkende.
  • Sprache: Python.
  • Lizenz: Apache-Lizenz 2.0.

Die Idee dieses Snap-Ins besteht darin, einen Container mit der Anwendung auf dem lokalen Benutzercomputer zu starten und den gesamten Datenverkehr vom Cluster dorthin und zurück zu übertragen. Mit diesem Ansatz können Sie lokal entwickeln, indem Sie einfach Dateien in Ihrer bevorzugten IDE bearbeiten: Die Ergebnisse sind sofort verfügbar.

Die Vorteile der lokalen Ausführung liegen in der Bequemlichkeit von Bearbeitungen und sofortigen Ergebnissen sowie der Möglichkeit, die Anwendung auf die übliche Weise zu debuggen. Der Nachteil besteht darin, dass es hohe Anforderungen an die Verbindungsgeschwindigkeit stellt, was sich besonders dann bemerkbar macht, wenn Sie mit einer Anwendung mit relativ hohem RPS und Datenverkehr arbeiten müssen. Darüber hinaus hat Telepresence Probleme mit Volume-Mounts unter Windows, was für Entwickler, die mit diesem Betriebssystem vertraut sind, eine entscheidende Einschränkung darstellen kann.

Wir haben bereits unsere Erfahrungen mit der Nutzung von Telepräsenz geteilt hier.

Ksync

  • Die Quintessenz: Fast sofortige Synchronisierung des Codes mit dem Container im Cluster.
  • GitHub.
  • Kurze GH-Statistiken: 555 Sterne, 362 Commits, 11 Mitwirkende.
  • Sprache: Los.
  • Lizenz: Apache-Lizenz 2.0.

Mit dem Dienstprogramm können Sie den Inhalt eines lokalen Verzeichnisses mit dem Verzeichnis eines im Cluster ausgeführten Containers synchronisieren. Ein solches Tool ist perfekt für Entwickler in Skript-Programmiersprachen, deren Hauptproblem darin besteht, Code an einen laufenden Container zu liefern. Ksync soll diese Kopfschmerzen lindern.

Bei einmaliger Initialisierung durch den Befehl ksync init Im Cluster wird ein DaemonSet erstellt, mit dem der Zustand des Dateisystems des ausgewählten Containers überwacht wird. Auf seinem lokalen Computer führt der Entwickler den Befehl aus ksync watch, das Konfigurationen und Ausführungen überwacht syncthing, wodurch Dateien direkt mit dem Cluster synchronisiert werden.

Es bleibt nur noch, ksync anzuweisen, womit synchronisiert werden soll. Zum Beispiel dieser Befehl:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

...erstellt einen Beobachter namens myprojectDadurch wird nach einem Pod mit einem Label gesucht app=backend und versuchen Sie, das lokale Verzeichnis zu synchronisieren /home/user/myproject/ mit Katalog /var/www/myproject/ am angerufenen Container php.

Probleme und Hinweise zu ksync aus unserer Erfahrung:

  • Muss auf Kubernetes-Clusterknoten verwendet werden overlay2 als Speichertreiber für Docker. Das Dienstprogramm funktioniert nicht mit anderen.
  • Wenn Sie Windows als Client-Betriebssystem verwenden, funktioniert der Dateisystem-Watcher möglicherweise nicht richtig. Dieser Fehler wurde beim Arbeiten mit großen Verzeichnissen bemerkt – mit einer großen Anzahl verschachtelter Dateien und Verzeichnisse. Wir kreierten relevantes Thema im Syncthing-Projekt, aber es gibt noch keine Fortschritte dabei (seit Anfang Juli).
  • Datei verwenden .stignore um Pfade oder Dateimuster anzugeben, die nicht synchronisiert werden müssen (z. B. Verzeichnisse). app/cache и .git).
  • Standardmäßig startet ksync den Container neu, wenn sich Dateien ändern. Für Node.js ist das praktisch, für PHP ist es jedoch völlig unnötig. Es ist besser, den Opcache auszuschalten und das Flag zu verwenden --reload=false.
  • Die Konfiguration kann jederzeit korrigiert werden $HOME/.ksync/ksync.yaml.

Squash

  • Die Quintessenz: Debug-Prozesse direkt im Cluster.
  • GitHub.
  • Kurze GH-Statistiken: 1154 Sterne, 279 Commits, 23 Mitwirkende.
  • Sprache: Los.
  • Lizenz: Apache-Lizenz 2.0.

Dieses Tool ist für das Debuggen von Prozessen direkt in Pods konzipiert. Das Dienstprogramm ist einfach und ermöglicht Ihnen interaktiv die Auswahl des gewünschten Debuggers (siehe unten) und Namespace + Pod, in dessen Prozess Sie eingreifen müssen. Derzeit unterstützt:

  • delve – für Go-Anwendungen;
  • GDB – über Ziel-Remote + Portweiterleitung;
  • JDWP-Portweiterleitung zum Debuggen von Java-Anwendungen.

Auf der IDE-Seite ist die Unterstützung nur in VScode verfügbar (mit Erweiterungen), für das laufende Jahr (2019) sind jedoch Eclipse und Intellij geplant.

Um Prozesse zu debuggen, führt Squash einen privilegierten Container auf den Clusterknoten aus, daher müssen Sie sich zunächst mit den Funktionen vertraut machen Sicherheitsmodus um Sicherheitsprobleme zu vermeiden.

Komplettlösungen

Kommen wir zur schweren Artillerie – eher „groß angelegte“ Projekte, die darauf ausgelegt sind, viele Bedürfnisse der Entwickler sofort zu erfüllen.

NB: In dieser Liste gibt es natürlich einen Platz für unser Open-Source-Dienstprogramm Hof (früher bekannt als dapp). Wir haben jedoch bereits mehr als einmal darüber geschrieben und gesprochen und haben uns daher entschieden, es nicht in die Rezension aufzunehmen. Für diejenigen, die mehr über seine Fähigkeiten erfahren möchten, empfehlen wir die Lektüre/Anhörung des Berichts „werf ist unser Tool für CI/CD in Kubernetes".

DevSpace

  • Die Quintessenz: für diejenigen, die mit der Arbeit in Kubernetes beginnen möchten, aber nicht tief in den Dschungel eintauchen möchten.
  • GitHub.
  • Kurze GH-Statistiken: 630 Sterne, 1912 Commits, 13 Mitwirkende.
  • Sprache: Los.
  • Lizenz: Apache-Lizenz 2.0.

Eine Lösung des gleichnamigen Unternehmens, die verwaltete Cluster mit Kubernetes für die Teamentwicklung bereitstellt. Das Dienstprogramm wurde für kommerzielle Cluster entwickelt, funktioniert aber hervorragend mit allen anderen.

Beim Ausführen des Befehls devspace init Im Projektkatalog werden Ihnen (interaktiv) angeboten:

  • Wählen Sie einen funktionierenden Kubernetes-Cluster aus.
  • benutze existierendes Dockerfile (oder einen neuen generieren), um einen darauf basierenden Container zu erstellen,
  • Wählen Sie ein Repository zum Speichern von Container-Images usw. aus.

Nach all diesen vorbereitenden Schritten können Sie mit der Entwicklung beginnen, indem Sie den Befehl ausführen devspace dev. Der Container wird erstellt, in das Repository hochgeladen, die Bereitstellung im Cluster bereitgestellt und die Portweiterleitung und Synchronisierung des Containers mit dem lokalen Verzeichnis gestartet.

Optional werden Sie aufgefordert, das Terminal in den Container zu verschieben. Sie sollten nicht ablehnen, da der Container in Wirklichkeit mit dem Befehl „sleep“ startet und für echte Tests die Anwendung manuell gestartet werden muss.

Endlich das Team devspace deploy Rollt die Anwendung und die zugehörige Infrastruktur im Cluster aus, woraufhin alles im Kampfmodus zu funktionieren beginnt.

Die gesamte Projektkonfiguration wird in einer Datei gespeichert devspace.yaml. Neben den Entwicklungsumgebungseinstellungen finden Sie darin auch eine Beschreibung der Infrastruktur, ähnlich den Standard-Kubernetes-Manifesten, nur stark vereinfacht.

Tools für Entwickler von Anwendungen, die auf Kubernetes ausgeführt werden
Architektur und Hauptphasen der Arbeit mit DevSpace

Darüber hinaus ist es einfach, dem Projekt eine vordefinierte Komponente (z. B. ein MySQL-DBMS) oder ein Helm-Chart hinzuzufügen. Lesen Sie mehr in Dokumentation - Es ist nicht kompliziert.

Gerüst

  • Webseite; GitHub.
  • Kurze GH-Statistiken: 7423 Sterne, 4173 Commits, 136 Mitwirkende.
  • Sprache: Los.
  • Lizenz: Apache-Lizenz 2.0.

Dieses Dienstprogramm von Google soll alle Anforderungen eines Entwicklers abdecken, dessen Code irgendwie auf einem Kubernetes-Cluster ausgeführt werden soll. Der Einstieg in die Nutzung ist nicht so einfach wie bei Devspace: keine Interaktivität, Spracherkennung und automatische Erstellung Dockerfile Sie werden es Ihnen hier nicht anbieten.

Wenn Ihnen das jedoch keine Angst macht, können Sie mit Skaffold Folgendes tun:

  • Verfolgen Sie Änderungen am Quellcode.
  • Synchronisieren Sie es mit dem Pod-Container, wenn keine Montage erforderlich ist.
  • Sammeln Sie Container mit Code, wenn die Sprache interpretiert wird, oder kompilieren Sie Artefakte und packen Sie sie in Container.
  • Die resultierenden Bilder werden automatisch mit überprüft Container-Struktur-Test.
  • Markieren und Hochladen von Bildern in die Docker-Registrierung.
  • Stellen Sie eine Anwendung in einem Cluster mit kubectl, Helm oder kustomize bereit.
  • Führen Sie eine Portweiterleitung durch.
  • Debuggen Sie in Java, Node.js und Python geschriebene Anwendungen.

Der Workflow in verschiedenen Variationen wird in der Datei deklarativ beschrieben skaffold.yaml. Für ein Projekt können Sie auch mehrere Profile definieren, in denen Sie die Montage- und Bereitstellungsphasen teilweise oder vollständig ändern können. Geben Sie beispielsweise für die Entwicklung ein Basis-Image an, das für den Entwickler geeignet ist, und für Staging und Produktion ein minimales (+ Verwendungszweck). securityContext (Container hinzufügen oder den Cluster neu definieren, in dem die Anwendung bereitgestellt wird).

Docker-Container können lokal oder remote erstellt werden: in Google Cloud-Build oder in einem Cluster mit Kaniko. Bazel und Jib Maven/Gradle werden ebenfalls unterstützt. Für das Tagging unterstützt Skaffold viele Strategien: nach Git-Commit-Hash, Datum/Uhrzeit, sha256-Summe der Quellen usw.

Unabhängig davon ist die Möglichkeit zu erwähnen, Container zu testen. Das bereits erwähnte Container-Struktur-Test-Framework bietet folgende Verifizierungsmethoden:

  • Ausführen von Befehlen im Kontext eines Containers mit Verfolgung des Exit-Status und Überprüfen der Textausgabe des Befehls.
  • Überprüfen, ob Dateien im Container vorhanden sind und mit den angegebenen Attributen übereinstimmen.
  • Kontrolle von Dateiinhalten mithilfe regulärer Ausdrücke.
  • Überprüfung der Bildmetadaten (ENV, ENTRYPOINT, VOLUMES usw.).
  • Lizenzkompatibilität prüfen.

Die Synchronisierung von Dateien mit dem Container erfolgt nicht optimal: Skaffold erstellt einfach ein Archiv mit den Quellen, kopiert es und entpackt es im Container (tar muss installiert sein). Wenn Ihre Hauptaufgabe daher die Codesynchronisierung ist, ist es besser, nach einer speziellen Lösung (ksync) zu suchen.

Tools für Entwickler von Anwendungen, die auf Kubernetes ausgeführt werden
Hauptphasen des Skaffold-Betriebs

Im Allgemeinen ermöglicht das Tool keine Abstraktion von Kubernetes-Manifesten und verfügt über keine Interaktivität, sodass es möglicherweise schwierig zu beherrschen erscheint. Aber das ist auch sein Vorteil – größere Handlungsfreiheit.

Garden

  • Webseite; GitHub.
  • Kurze GH-Statistiken: 1063 Sterne, 1927 Commits, 17 Mitwirkende.
  • Sprache: TypeScript (Es ist geplant, das Projekt in mehrere Komponenten aufzuteilen, von denen einige in Go sein werden, und außerdem ein SDK zum Erstellen von Add-ons in TypeScript/JavaScript und Go zu erstellen.).
  • Lizenz: Apache-Lizenz 2.0.

Wie Skaffold zielt Garden darauf ab, die Prozesse der Bereitstellung von Anwendungscode an den K8s-Cluster zu automatisieren. Dazu müssen Sie zunächst die Projektstruktur in einer YAML-Datei beschreiben und dann den Befehl ausführen garden dev. Sie wird die ganze Magie vollbringen:

  • Sammeln Sie Container mit verschiedenen Teilen des Projekts.
  • Führt Integrations- und Unit-Tests durch, sofern welche beschrieben wurden.
  • Rollout aller Projektkomponenten im Cluster.
  • Wenn sich der Quellcode ändert, wird die gesamte Pipeline neu gestartet.

Das Hauptaugenmerk bei der Verwendung dieses Tools liegt auf der gemeinsamen Nutzung eines Remote-Clusters mit einem Entwicklungsteam. Wenn in diesem Fall einige der Bau- und Testschritte bereits durchgeführt wurden, beschleunigt dies den gesamten Prozess erheblich, da Garden die zwischengespeicherten Ergebnisse verwenden kann.

Ein Projektmodul kann ein Container, ein Maven-Container, ein Helm-Chart oder ein Manifest für sein kubectl apply oder sogar eine OpenFaaS-Funktion. Darüber hinaus können alle Module aus einem Remote-Git-Repository abgerufen werden. Ein Modul kann Dienste, Aufgaben und Tests definieren oder auch nicht. Dienste und Aufgaben können Abhängigkeiten aufweisen, dank derer Sie die Bereitstellungsreihenfolge eines bestimmten Dienstes bestimmen und den Start von Aufgaben und Tests organisieren können.

Garden bietet dem Benutzer ein schönes Dashboard (derzeit in experimenteller Zustand), das das Projektdiagramm anzeigt: Komponenten, Montagereihenfolge, Ausführung von Aufgaben und Tests, ihre Verbindungen und Abhängigkeiten. Direkt im Browser können Sie die Protokolle aller Projektkomponenten anzeigen und überprüfen, was eine bestimmte Komponente über HTTP ausgibt (sofern natürlich eine Ingress-Ressource dafür deklariert ist).

Tools für Entwickler von Anwendungen, die auf Kubernetes ausgeführt werden
Panel für den Garten

Dieses Tool verfügt außerdem über einen Hot-Reload-Modus, der Skriptänderungen einfach mit dem Container im Cluster synchronisiert und so den Debugging-Prozess der Anwendung erheblich beschleunigt. Der Garten hat einen guten Dokumentation und nicht schlecht Reihe von BeispielenSo können Sie sich schnell daran gewöhnen und mit der Nutzung beginnen. Übrigens haben wir erst kürzlich veröffentlicht Artikel übersetzung von seinen Autoren.

Abschluss

Natürlich ist diese Liste von Tools zum Entwickeln und Debuggen von Anwendungen in Kubernetes nicht darauf beschränkt. Es gibt viele weitere sehr nützliche und praktische Dienstprogramme, die, wenn nicht sogar einen separaten Artikel, so doch zumindest eine Erwähnung wert sind. Sagen Sie uns, was Sie verwenden, auf welche Probleme Sie gestoßen sind und wie Sie diese gelöst haben!

PS

Lesen Sie auch auf unserem Blog:

Source: habr.com

Kommentar hinzufügen