Werkzeuge für Entwickler von Anwendungen, die in Kubernetes laufen

Werkzeuge für Entwickler von Anwendungen, die in Kubernetes laufen

Der moderne Ansatz zur Betriebsführung löst viele drängende Geschäftsprobleme. Container und Orchestratoren ermöglichen eine einfache Skalierung von Projekten jeglicher Komplexität, vereinfachen die Veröffentlichung neuer Versionen und machen diese zuverlässiger, bringen jedoch gleichzeitig zusätzliche Herausforderungen für Entwickler mit sich. Programmierer haben in erster Linie ihre Codes im Kopf: Architektur, Qualität, Leistung, Eleganz – und nicht, wie sie in Kubernetes integriert werden und wie sie nach selbst minimalen Änderungen getestet und debuggt werden. Daher ist es nur logisch, dass sich Werkzeuge für Kubernetes aktiv weiterentwickeln, um selbst den „archaischsten“ Entwicklern zu helfen und ihnen zu ermöglichen, sich auf das Wesentliche zu konzentrieren.

In diesem Überblick wird eine kurze Information über einige Werkzeuge bereitgestellt, die das Leben von Entwicklern erleichtern, deren Code in den Pods eines Kubernetes-Clusters läuft.

Einfache Helfer

Kubectl-debug

  • Essenz: Fügen Sie Ihren Container in den Pod ein und sehen Sie, was darin passiert..
  • GitHub.
  • Kurze GH-Statistik: 715 Sterne, 54 Commits, 9 Mitwirkende.
  • Sprache: Go.
  • Lizenz: Apache License 2.0.

Dieses Plugin für kubectl ermöglicht es, innerhalb eines interessierenden Pods einen zusätzlichen Container zu erstellen, der den Namensraum der Prozesse mit den anderen Containern teilt. Damit kann die Funktionsweise des Pods debuggt werden: Netzwerkverbindungen überprüft, der Netzwerkverkehr angehört, ein strace für den interessierenden Prozess durchgeführt werden, und so weiter.

Man kann auch in den Prozesscontainer wechseln, indem man ausführt chroot /proc/PID/root — das ist sehr praktisch, wenn man eine root-Shell im Container benötigt, für den im Manifest securityContext.runAs.

festgelegt ist. Das Tool ist einfach und effektiv, sodass es für jeden Entwickler nützlich sein kann. Weitere Informationen dazu haben wir in einer eigenen Artikel.

Telepresence

  • Essenz: übertrage die Anwendung auf deinen Computer. Entwickle und debugge lokal..
  • Die Website; GitHub.
  • Kurze GH-Statistik: 2131 Sterne, 2712 Commits, 33 Mitwirkende.
  • Sprache: Python.
  • Lizenz: Apache License 2.0.

Die Idee dieses Tools besteht darin, einen Container mit der Anwendung auf dem lokalen Benutzercomputer zu starten und den gesamten Verkehr aus dem Cluster zu ihm und zurück zu proxien. Dieser Ansatz ermöglicht die lokale Entwicklung, indem einfach die Dateien in der bevorzugten IDE geändert werden: Die Ergebnisse sind sofort verfügbar.

Die Vorteile der lokalen Ausführung sind die Bequemlichkeit von Anpassungen und sofortige Ergebnisse sowie die Möglichkeit, die Anwendung auf gewohnte Weise zu debuggen. Nachteile sind die Anforderungen an die Verbindungsgeschwindigkeit, was besonders bemerkbar ist, wenn man mit einer Anwendung mit relativ hohem RPS und Traffic arbeitet. Außerdem hat Telepresence Probleme mit Volume-Mounts unter Windows, was für Entwickler, die an dieses Betriebssystem gewöhnt sind, ein entscheidendes Limit sein kann.

Wir haben bereits unsere Erfahrungen mit Telepresence geteilt. hier.

Ksync

  • Essenz: nahezu sofortige Synchronisierung von Code mit dem Container im Cluster..
  • GitHub.
  • Kurze GH-Statistik: 555 Sterne, 362 Commits, 11 Mitwirkende.
  • Sprache: Go.
  • Lizenz: Apache License 2.0.

Das Utility ermöglicht die Synchronisierung des Inhalts eines lokalen Verzeichnisses mit dem Containerverzeichnis, das im Cluster ausgeführt wird. Dieses Tool eignet sich hervorragend für Entwickler, die Skriptsprachen verwenden, deren Hauptproblem darin besteht, den Code in einen laufenden Container zu bringen. Ksync soll dieses Problem lösen.

Nach einmaliger Initialisierung mit dem Befehl ksync init Im Cluster wird ein DaemonSet erstellt, das dazu dient, den Zustand des Dateisystems des gewählten Containers zu überwachen. Auf seinem lokalen Computer führt der Entwickler den Befehl aus ksync watch, der die Konfigurationen überwacht und syncthingstartet, das die direkte Synchronisierung von Dateien mit dem Cluster durchführt.

Es bleibt, ksync anzuleiten, was und mit wem synchronisiert werden soll. Zum Beispiel könnte folgender Befehl verwendet werden:

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

… dies wird einen Watcher mit dem Namen myprojecterstellen, der nach einem Pod mit dem Label app=backend sucht und versucht, das lokale Verzeichnis /home/user/myproject/ mit dem Verzeichnis /var/www/myproject/ des Containers mit dem Namen php.

Probleme und Anmerkungen zu ksync aus unserer Erfahrung:

  • Auf den Knoten des Kubernetes-Clusters sollte der overlay2 als Storage-Driver für Docker verwendet werden. Mit anderen Tools wird es nicht funktionieren.
  • Bei der Verwendung von Windows als Client-Betriebssystem kann es zu Fehlfunktionen des Watchers des Dateisystems kommen. Dieser Fehler wurde beim Arbeiten mit großen Verzeichnissen festgestellt – mit einer großen Anzahl von verschachtelten Dateien und Verzeichnissen. Wir haben ein entsprechendes Issue erstellt Im Projekt Syncthing gibt es seit Anfang Juli keinen Fortschritt.
  • Verwenden Sie die Datei .stignore , um Pfade oder Dateimuster anzugeben, die nicht synchronisiert werden sollen (z. B. Verzeichnisse app/cache und .git).
  • Standardmäßig wird ksync den Container bei jeder Änderung von Dateien neu starten. Dies ist für Node.js praktisch, für PHP jedoch völlig überflüssig. Es wäre besser, opcache zu deaktivieren und das Flag --reload=false.
  • zu verwenden. Die Konfiguration kann jederzeit in $HOME/.ksync/ksync.yaml.

Squash

  • Essenz: debuggen Sie Prozesse direkt im Cluster..
  • GitHub.
  • Kurze GH-Statistik: 1154 Sterne, 279 Commits, 23 Mitwirkende.
  • Sprache: Go.
  • Lizenz: Apache License 2.0.

Dieses Tool dient der Fehlersuche in Prozessen direkt in den Pods. Die Utility ist einfach und ermöglicht im interaktiven Modus die Auswahl des gewünschten Debuggers (siehe unten) und Namespace + Pod, in dessen Prozess eingegriffen werden muss. Derzeit werden folgende unterstützt:

  • delve – für Anwendungen in Go;
  • GDB – über target remote + Portweiterleitung;
  • Portweiterleitung JDWP zur Debugging von Java-Anwendungen.

Von Seiten der IDE gibt es Unterstützung lediglich in VScode (mithilfe des Erweiterung), jedoch sind für das aktuelle Jahr (2019) Eclipse und Intellij geplant.

Für die Fehlersuche startet Squash auf den Knoten des Clusters einen privilegierten Container. Daher sollten Sie sich zunächst mit den Möglichkeiten vertraut machen. sicheren Modus um Sicherheitsprobleme zu vermeiden.

Komplexe Lösungen

Jetzt kommen wir zur schweren Artillerie – zu größeren Projekten, die dazu dienen, viele Bedürfnisse der Entwickler auf einmal zu decken.

NB: In dieser Liste findet sich sicherlich auch unser Open Source-Tool werf (ehemals bekannt als dapp). Wir haben bereits mehrfach darüber geschrieben und berichtet, weshalb wir uns entschieden haben, es nicht in die Übersicht aufzunehmen. Für diejenigen, die mehr über seine Möglichkeiten erfahren möchten, empfehlen wir, den Vortrag "werf – unser Werkzeug für CI/CD in Kubernetes».

DevSpace

  • Essenz: für alle, die mit Kubernetes arbeiten möchten, aber nicht tief in die Materie einsteigen wollen..
  • GitHub.
  • Kurze GH-Statistik: 630 Sterne, 1912 Commits, 13 Mitwirkende.
  • Sprache: Go.
  • Lizenz: Apache License 2.0.

Eine Lösung des gleichnamigen Unternehmens, das verwaltete Cluster mit Kubernetes für die Teamarbeit bereitstellt. Das Tool wurde für kommerzielle Cluster entwickelt, funktioniert jedoch auch hervorragend mit anderen.

Beim Ausführen des Befehls devspace init im Projektverzeichnis werden Ihnen (im interaktiven Modus) folgende Optionen angeboten:

  • einen Arbeits-Kubernetes-Cluster auszuwählen,
  • die vorhandenen nutzen Dockerfile oder einen neuen generieren, um einen Container auf dieser Basis zu erstellen,
  • ein Repository für die Speicherung von Container-Images auswählen usw.

Nach all diesen Vorbereitungen kann die Entwicklung beginnen, indem der Befehl devspace devausgeführt wird. Dieser Befehl wird den Container bauen, ihn in das Repository hochladen, ein Deployment im Cluster durchführen und den Port-Forwarding sowie die Synchronisation des Containers mit dem lokalen Verzeichnis starten.

Optional wird angeboten, mit einem Terminal in den Container zu wechseln. Es lohnt sich nicht abzulehnen, denn tatsächlich startet der Container mit dem Befehl sleep, und für das echte Testen muss die Anwendung manuell gestartet werden.

Schließlich führt der Befehl devspace deploy die Anwendung und die zugehörige Infrastruktur im Cluster aus, wonach alles im produktiven Modus funktioniert.

Die gesamte Projektkonfiguration wird in der Datei devspace.yamlgespeichert. Neben den Umgebungsparametern für die Entwicklung finden Sie darin auch eine Beschreibung der Infrastruktur, die den Standard-Manifests von Kubernetes ähnelt, jedoch stark vereinfacht ist.

Werkzeuge für Entwickler von Anwendungen, die in Kubernetes laufen
Architektur und grundlegende Schritte zur Arbeit mit DevSpace

Darüber hinaus lässt sich ein vordefiniertes Element (z. B. die MySQL-Datenbank) oder ein Helm-Chart problemlos in das Projekt integrieren. Weitere Informationen finden Sie in Dokumentation. — es ist einfach.

Skaffold nachdenken.

  • Die Website; GitHub.
  • Kurze Statistik zu GH: 7423 Sterne, 4173 Commits, 136 Mitwirkende.
  • Sprache: Go.
  • Lizenz: Apache License 2.0.

Dieses Tool von Google soll alle Bedürfnisse eines Entwicklers abdecken, dessen Code schließlich in einem Kubernetes-Cluster ausgeführt wird. Der Einstieg ist nicht so einfach wie bei devspace: es gibt keine Interaktivität, Sprachdefinition und keine automatische Erstellung Dockerfile hier werden Sie nicht angeboten.

Wenn Sie jedoch davon nicht abgeschreckt sind, hier sind die Möglichkeiten von Skaffold:

  • Änderungen im Quellcode verfolgen.
  • Den Code mit dem Pod-Container synchronisieren, wenn keine Kompilierung notwendig ist.
  • Container mit dem Code erstellen, wenn die Programmiersprache interpretiert ist, oder Artefakte kompilieren und in Container packen.
  • Die entstandenen Images automatisch mit container-structure-test.
  • Taggen und Hochladen der Images in das Docker-Registry.
  • Die Anwendung im Cluster mit kubectl, Helm oder kustomize bereitstellen.
  • Ports weiterleiten.
  • Anwendungen, die in Java, Node.js und Python geschrieben sind, debuggen.

Der Workflow wird in verschiedenen Varianten deklarativ in der Datei skaffold.yaml. Für das Projekt können mehrere Profile definiert werden, in denen die Build- und Deployment-Stufen teilweise oder vollständig geändert werden. Beispielsweise kann für die Entwicklung ein entwicklerfreundliches Basis-Image angegeben werden, während für Staging und Produktion ein minimales Image verwendet wird (+ Nutzung securityContext für Container oder um den Cluster zu überschreiben, in dem die Anwendung bereitgestellt wird).

Das Erstellen von Docker-Containern kann lokal oder remote erfolgen: in Google Cloud Build oder im Cluster mithilfe von Kaniko. Auch Bazel und Jib Maven/Gradle werden unterstützt. Für das Tagging unterstützt Skaffold zahlreiche Strategien: nach git commit Hash, Datum/Uhrzeit, sha256-Checksumme des Quellcodes usw.

Separat sollte die Möglichkeit der Container-Tests hervorgehoben werden. Das bereits erwähnte Framework container-structure-test bietet die folgenden Prüfmethoden an:

  • Ausführung von Befehlen im Kontext des Containers mit Verfolgung der Exit-Status und Überprüfung der Textausgaben der Befehle.
  • Überprüfung des Vorhandenseins von Dateien im Container und der Übereinstimmung der Attribute mit den angegebenen.
  • Überprüfung des Inhalts von Dateien durch reguläre Ausdrücke.
  • Abgleich der Metadaten des Images (ENV, ENTRYPOINT, VOLUMES usw.).
  • Überprüfung der Kompatibilität von Lizenzen.

Die Synchronisierung von Dateien mit dem Container erfolgt nicht auf optimalste Weise: Skaffold erstellt einfach ein Archiv mit den Quelldateien, kopiert es und entpackt es im Container (tar muss installiert sein). Wenn Ihre Hauptaufgabe also das Synchronisieren von Code ist, sollten Sie besser eine spezialisierte Lösung (ksync) in Betracht ziehen.

Werkzeuge für Entwickler von Anwendungen, die in Kubernetes laufen
Wichtige Schritte bei der Arbeit mit Skaffold

Generell ermöglicht das Tool keine Abstraktion von Kubernetes-Manifests und bietet keinerlei Interaktivität, was es schwierig machen kann, sich zurechtzufinden. Aber das ist auch sein Vorteil — es bietet größere Freiheiten.

Garden

  • Die Website; GitHub.
  • Kurze GH-Statistik: 1063 Sterne, 1927 Commits, 17 Mitwirkende.
  • Sprache: TypeScript (Es ist geplant, das Projekt in mehrere Komponenten zu unterteilen, von denen einige in Go sein werden, sowie ein SDK zur Erstellung von Erweiterungen in TypeScript/JavaScript und Go bereitzustellen.).
  • Lizenz: Apache License 2.0.

Wie Skaffold ist auch Garden darauf ausgerichtet, die Prozesse zur Bereitstellung von Anwendungs-Code im K8s-Cluster zu automatisieren. Dafür muss zunächst die Struktur des Projekts in einer YAML-Datei beschrieben werden, bevor der Befehl garden devausgeführt wird. Dieser wird die gesamte Magie entfalten:

  • Es wird die Container mit verschiedenen Teilen des Projekts erstellen.
  • Führt Integrations- und Unit-Tests durch, sofern diese beschrieben wurden.
  • Rollt alle Komponenten des Projekts in das Cluster aus.
  • Im Falle von Änderungen am Quellcode wird die gesamte Pipeline neu gestartet.

Der Fokus bei der Nutzung dieses Tools liegt auf der gemeinsamen Nutzung eines entfernten Clusters durch das Entwicklerteam. In diesem Fall, wenn bestimmte Phasen der Erstellung und des Testens bereits abgeschlossen sind, wird der gesamte Prozess erheblich beschleunigt, da Garden die zwischengespeicherten Ergebnisse nutzen kann.

Ein Modul des Projekts kann ein Container, ein Maven-Container, ein Helm-Chart, ein Manifest für kubectl apply oder sogar eine OpenFaaS-Funktion sein. Dabei kann jedes Modul aus einem entfernten Git-Repository bezogen werden. Ein Modul kann (muss aber nicht) Dienste, Aufgaben und Tests definieren. Dienste und Aufgaben können Abhängigkeiten haben, was es ermöglicht, die Reihenfolge des Deployments eines bestimmten Dienstes sowie die Ausführung von Aufgaben und Tests zu bestimmen.

Garden bietet dem Benutzer ein ansprechendes Dashboard (derzeit in experimentellem Zustand)., in dem das Projekt-Diagramm angezeigt wird: Komponenten, Reihenfolge der Zusammenstellung, Durchführung von Aufgaben und Tests, deren Verbindungen und Abhängigkeiten. Direkt im Browser können Sie auch die Protokolle aller Projektkomponenten einsehen und überprüfen, was jede Komponente per HTTP ausgibt (sofern natürlich für sie eine Ingress-Ressource deklariert ist).

Werkzeuge für Entwickler von Anwendungen, die in Kubernetes laufen
Panel für Garden

Dieses Tool verfügt auch über einen Hot-Reload-Modus, der Änderungen an den Skripten einfach mit dem Container im Cluster synchronisiert und dadurch den Debugging-Prozess erheblich beschleunigt. Garden bietet eine gute Dokumentation und ansprechende Beispielbibliothek,die es ermöglicht, sich schnell einzuarbeiten und loszulegen. Übrigens haben wir kürzlich eine Übersetzung des Artikels von seinen Autoren veröffentlicht.

Fazit

Natürlich beschränkt sich diese Liste nicht auf Tools zur Entwicklung und Debugging von Anwendungen in Kubernetes. Es gibt noch viele nützliche und praktische Tools, die eines separaten Artikels würdig sind oder mindestens Erwähnung verdienen. Erzählen Sie uns, welche Tools Sie nutzen, mit welchen Problemen Sie konfrontiert wurden und wie Sie diese gelöst haben!

P.S.

Lesen Sie auch in unserem Blog:

Quelle: habr.com

Kaufen 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