
Ein moderner Ansatz in der Betriebsführung löst zahlreiche aktuelle Probleme für Unternehmen. Container und Orchestratoren ermöglichen es, Projekte jeder Komplexität leicht zu skalieren, vereinfachen die Veröffentlichung neuer Versionen und machen diese zuverlässiger, schaffen jedoch gleichzeitig zusätzliche Probleme für Entwickler. Programmierer sorgen sich in erster Linie um ihren Code: Architektur, Qualität, Leistung, Eleganz – und nicht darum, wie dieser in Kubernetes läuft oder wie er nach den kleinsten Änderungen getestet und debuggt werden kann. Daher ist es nicht verwunderlich, dass Werkzeuge für Kubernetes aktiv entwickelt werden, die dabei helfen, Probleme selbst der ‚archaischsten‘ Entwickler zu lösen und es ihnen ermöglichen, sich auf das Wesentliche zu konzentrieren.
In dieser Übersicht werden einige Werkzeuge vorgestellt, die das Leben von Programmierern erleichtern, deren Code in den Pods eines Kubernetes-Clusters läuft.
Einfache Helfer
Kubectl-debug
- Essenz: Füge deinen Container in den Pod ein und sieh dir an, was darin passiert.
- .
- 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 des interessierenden Pods einen zusätzlichen Container zu erstellen, der den Namensraum der Prozesse mit den anderen Containern teilt. In diesem Container kann die Funktionsweise des Pods debuggt werden: Überprüfen der Netzwerkfunktion, Abhören des Netzwerkverkehrs, Durchführung von strace des interessierenden Prozesses usw.
Es kann auch in den Container eines Prozesses gewechselt werden, indem man chroot /proc/PID/root ausführt – das ist sehr praktisch, wenn ein Root-Shell im Container benötigt wird, für den im Manifest festgelegt ist securityContext.runAs.
Das Tool ist einfach und effektiv, sodass es jedem Entwickler nützlich sein kann. Mehr darüber haben wir in einer .
Telepresence
- Essenz: Übertrage die Anwendung auf deinen Computer. Entwickle und debugge lokal..
- ; .
- Kurze GH-Statistik: 2131 Sterne, 2712 Commits, 33 Mitwirkende.
- Sprache: Python.
- Lizenz: Apache License 2.0.
Die Idee dieses Werkzeugs 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 proxyen. Dieser Ansatz ermöglicht die lokale Entwicklung, indem einfach die Dateien in deiner bevorzugten IDE geändert werden: Die Ergebnisse sind sofort verfügbar.
Die Vorteile des lokalen Starts sind die Bequemlichkeit von Änderungen und das sofortige Ergebnis, sowie die Möglichkeit, die Anwendung auf gewohnte Weise zu debuggen. Zu den Nachteilen gehört die Anforderung an die Geschwindigkeit der Verbindung, was besonders bemerkbar ist, wenn man mit einer Anwendung arbeitet, die eine ausreichend hohe RPS und Traffic hat. Außerdem hat Telepresence Probleme mit Volume-Mounts in Windows, was ein entscheidendes Hindernis für Entwickler sein kann, die an dieses Betriebssystem gewöhnt sind.
Wir haben bereits unsere Erfahrungen mit der Nutzung von Telepresence geteilt. .
Ksync
- Essenz: nahezu sofortige Synchronisation des Codes mit dem Container im Cluster..
- .
- Kurze GH-Statistik: 555 Sterne, 362 Commits, 11 Mitwirkende.
- Sprache: Go.
- Lizenz: Apache License 2.0.
Das Tool ermöglicht die Synchronisation des Inhalts eines lokalen Verzeichnisses mit dem Verzeichnis des Containers, der im Cluster läuft. Ein solches Werkzeug eignet sich hervorragend für Entwickler von Skriptsprache, deren Hauptproblem die Bereitstellung des Codes im laufenden Container ist. Ksync soll dieses Kopfschmerzproblem lösen.
Mit einmaliger Initialisierung des Befehls ksync init wird im Cluster ein DaemonSet erstellt, das verwendet wird, um den Zustand des Dateisystems des ausgewählten Containers zu überwachen. Auf seinem lokalen Computer führt der Entwickler den Befehl aus ksync watch, der die Konfigurationen überwacht und , das die direkte Synchronisation der Dateien mit dem Cluster durchführt.
Es bleibt, ksync anzuweisen, was und mit was synchronisiert werden soll. Zum Beispiel ein solcher Befehl:
ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/ … erstellt einen Watcher mit dem Namen myproject, 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 Hinweise zu ksync aus unserer Erfahrung:
- Auf den Knoten des Kubernetes-Clusters muss
overlay2als Storage-Driver für Docker verwendet werden. Keine anderen Tools werden damit funktionieren. - Bei der Verwendung von Windows als Client-Betriebssystem kann der Watcher des Dateisystems möglicherweise nicht korrekt arbeiten. Dieser Bug wurde beim Arbeiten mit großen Verzeichnissen festgestellt – mit einer großen Anzahl von вложенными Dateien und Verzeichnissen. Wir haben eine im Projekt syncthing erstellt, aber bisher (seit Anfang Juli) gibt es keinen Fortschritt.
- Verwenden Sie die Datei Um Pfade oder Dateimuster anzugeben, die nicht synchronisiert werden sollen (zum Beispiel Verzeichnisse
app/cacheund.git). - Standardmäßig wird ksync den Container bei jeder Änderung der Dateien neu starten. Dies ist komfortabel für Node.js, jedoch vollkommen überflüssig für PHP. Es ist besser, opcache auszuschalten und das Flag
--reload=false. - Die Konfiguration kann jederzeit in
$HOME/.ksync/ksync.yaml.
Squash
- Essenz: dein Debugging direkt im Cluster.
- .
- Kurze GH-Statistik: 1154 Sterne, 279 Commits, 23 Mitwirkende.
- Sprache: Go.
- Lizenz: Apache License 2.0.
Dieses Tool ist zum Debuggen von Prozessen direkt in Pods gedacht. Das Dienstprogramm ist einfach und ermöglicht im interaktiven Modus die Auswahl des benötigten Debuggers (siehe unten) und Namespace + Pod, in dessen Prozess eingegriffen werden muss. Derzeit werden unterstützt:
- delve – für Go-Anwendungen;
- GDB – über target remote + Portweiterleitung;
- Portweiterleitung JDWP für das Debuggen von Java-Anwendungen.
Von der IDE wird nur VScode unterstützt (mit Hilfe von ), jedoch sind in den Plänen für das laufende (2019) Jahr Eclipse und Intellij vorgesehen.
Für das Debuggen von Prozessen startet Squash in den Cluster-Knoten einen privilegierten Container, daher sollte man sich zunächst über die Möglichkeiten informieren, um Sicherheitsprobleme zu vermeiden.
Komplexe Lösungen
Kommen wir zur schweren Artillerie – größeren "skalierbaren" Projekten, die darauf abzielen, viele Bedürfnisse der Entwickler gleichzeitig zu schließen.
NB: In dieser Liste ist auf jeden Fall auch unser Open Source-Dienstprogramm (früher bekannt als dapp) enthalten. Allerdings haben wir schon oft darüber geschrieben und berichtet, weshalb wir beschlossen haben, es nicht in die Übersicht aufzunehmen. Für diejenigen, die sich näher über die Möglichkeiten informieren möchten, empfehlen wir den Vortrag "».
DevSpace
- Essenz: für diejenigen, die mit Kubernetes arbeiten möchten, aber nicht tief in die Materie eintauchen wollen.
- .
- Kurze GH-Statistik: 630 Sterne, 1912 Commits, 13 Mitwirkende.
- Sprache: Go.
- Lizenz: Apache License 2.0.
Lösung von dem gleichnamigen Unternehmen, das Managed-Cluster mit Kubernetes für die Teamarbeit bereitstellt. Das Dienstprogramm wurde für kommerzielle Cluster erstellt, funktioniert jedoch auch hervorragend mit allen anderen.
Beim Ausführen des Befehls devspace init im Verzeichnis des Projekts werden Ihnen (im interaktiven Modus) folgende Optionen angeboten:
- einen Kubernetes-Cluster auszuwählen,
- einen vorhandenen zu verwenden
Dockerfile(oder einen neuen zu erstellen), um auf seiner Grundlage einen Container zu erstellen, - ein Repository zum Speichern der Container-Images auszuwählen usw.
Nach all diesen Vorbereitungen kann die Entwicklung beginnen, indem Sie den Befehl ausführen devspace dev. Dieser Befehl erstellt den Container, lädt ihn in das Repository, rollt das Deployment im Cluster aus und startet das Port-Forwarding sowie die Synchronisierung des Containers mit dem lokalen Verzeichnis.
Optional wird angeboten, mit dem Terminal in den Container zu wechseln. Das sollten Sie nicht ablehnen, denn in der Realität startet der Container mit dem Befehl sleep, und um die Anwendung real zu testen, muss sie manuell gestartet werden.
Schließlich führt der Befehl devspace deploy die Anwendung und die damit verbundene Infrastruktur im Cluster aus, nach dem alles im produktiven Modus funktioniert.
Die gesamte Projektkonfiguration befindet sich in der Datei devspace.yaml. Neben den Umgebungen für die Entwicklung finden Sie darin auch eine Beschreibung der Infrastruktur, die den Standard-Manifesten von Kubernetes ähnelt, aber stark vereinfacht ist.

Architektur und Hauptschritte zur Arbeit mit DevSpace
Zusätzlich ist es einfach, eine vordefinierte Komponente (z. B. die MySQL-Datenbank) oder ein Helm-Chart zum Projekt hinzuzufügen. Lesen Sie mehr in — es ist nicht kompliziert.
Skaffold
- ; .
- Kurze GH-Statistik: 7423 Sterne, 4173 Commits, 136 Mitwirkende.
- Sprache: Go.
- Lizenz: Apache License 2.0.
Dieses Tool von Google beansprucht, alle Bedürfnisse eines Entwicklers zu decken, dessen Code irgendwie im Kubernetes-Cluster ausgeführt wird. Es ist nicht so einfach, es zu bedienen wie devspace: Es gibt keine Interaktivität, keine Spracherkennung und keine automatische Erstellung Dockerfile wird Ihnen hier nicht angeboten.
Wenn Sie sich davon jedoch nicht einschüchtern lassen — hier ist, was Skaffold ermöglicht:
- Überwachung von Änderungen am Quellcode.
- Synchronisierung mit dem Pod-Container, sofern keine Erstellung erforderlich ist.
- Erstellung von Containern mit Code, wenn die Programmiersprache interpretiert ist, oder Kompilierung von Artefakten und Verpackung in Container.
- Die resultierenden Bilder automatisch prüfen mit .
- Markieren und Hochladen von Images in das Docker-Registry.
- Bereitstellung der Anwendung im Cluster unter Verwendung von kubectl, Helm oder kustomize.
- Port-Forwarding durchführen.
- Debuggen von Anwendungen, die in Java, Node.js, Python geschrieben sind.
Der Workflow wird in verschiedenen Variationen deklarativ in der Datei skaffold.yamlbeschrieben. Für das Projekt können auch mehrere Profile definiert werden, in denen die Build- und Deployment-Stufen teilweise oder vollständig geändert werden. Zum Beispiel kann für die Entwicklung ein für den Entwickler passendes Basisbild und für Staging und Produktion ein minimales angegeben werden (+ verwenden) securityContext in Containern oder einen Cluster, in dem die Anwendung bereitgestellt wird, neu definieren.
Die Erstellung von Docker-Containern kann lokal oder remote erfolgen: in oder im Cluster mithilfe von . Auch Bazel und Jib Maven/Gradle werden unterstützt. Für die Tagging-Strategien unterstützt Skaffold zahlreiche Optionen: nach Git-Commit-Hash, Datum/Uhrzeit, SHA256-Prüfziffer der Quelldateien usw.
Besonders hervorzuheben ist die Möglichkeit, Container zu testen. Das bereits erwähnte Framework container-structure-test bietet folgende Prüfmethoden an:
- Ausführung von Befehlen im Kontext des Containers mit Nachverfolgung der Exit-Status und Überprüfung des Textausgabe der Befehle.
- Überprüfung der Existenz von Dateien im Container und Übereinstimmung der Attribute mit den angegebenen.
- Kontrolle des Inhalts von Dateien anhand von regulären Ausdrücken.
- Abgleich der Metadaten des Images (
ENV,ENTRYPOINT,VOLUMESusw.). - Überprüfung der Kompatibilität von Lizenzen.
Die Synchronisierung von Dateien mit dem Container erfolgt nicht auf die optimalste Weise: Skaffold erstellt einfach ein Archiv mit den Quelldateien, kopiert es und entpackt es im Container (tar muss installiert sein). Wenn Ihre Hauptaufgabe darin besteht, den Code zu synchronisieren, sollten Sie besser eine spezialisierte Lösung (ksync) in Betracht ziehen.

Die wichtigsten Phasen der Arbeit mit Skaffold
Insgesamt erlaubt das Tool keine Abstraktion von Kubernetes-Manifests und bietet keine Interaktivität, weshalb es schwierig zu erlernen scheint. Doch das ist auch sein Vorteil — große Handlungsspielräume.
Garden
- ; .
- Kurze GH-Statistik: 1063 Sterne, 1927 Commits, 17 Mitwirkende.
- Sprache: TypeScript (Es ist geplant, das Projekt in mehrere Komponenten aufzuteilen, von denen einige in Go umgesetzt werden, sowie ein SDK zur Erstellung von Erweiterungen in TypeScript/JavaScript und Go zu erstellen.).
- Lizenz: Apache License 2.0.
Wie Skaffold zielt auch Garden darauf ab, die Prozesse zur Bereitstellung des Anwendungscodes im K8s-Cluster zu automatisieren. Dazu müssen Sie zunächst die Projektstruktur in einer YAML-Datei beschreiben und dann den Befehl garden dev. Dieser führt die ganze Magie aus:
- Erstellt Container für verschiedene Teile des Projekts.
- Führt Integrations- und Unit-Tests durch, sofern diese beschrieben wurden.
- Stellt alle Komponenten des Projekts im Cluster bereit.
- Bei Änderungen des Quellcodes wird der gesamte Pipeline-Prozess erneut gestartet.
Der Hauptfokus bei der Verwendung dieses Werkzeugs liegt auf der gemeinsamen Nutzung des entfernten Clusters durch das Entwicklerteam. In diesem Fall, wenn bereits einige Phasen des Builds und der Tests abgeschlossen sind, beschleunigt dies den gesamten Prozess erheblich, da Garden die zwischengespeicherten Ergebnisse verwenden kann.
Das 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 abgerufen werden. Ein Modul kann (muss aber nicht) Services, Aufgaben und Tests definieren. Services und Aufgaben können Abhängigkeiten haben, wodurch die Reihenfolge des Deployments eines bestimmten Services, der Start von Aufgaben und Tests festgelegt werden kann.
Garden bietet dem Nutzer ein schönes Dashboard (vorerst in ), in dem das Projekt-Diagramm angezeigt wird: Komponenten, Reihenfolge im Build, Ausführung von Aufgaben und Tests sowie deren Beziehungen und Abhängigkeiten. Direkt im Browser kann man auch die Protokolle aller Komponenten des Projekts einsehen und überprüfen, was eine bestimmte Komponente über HTTP ausgibt (sofern für sie eine Resource ingress deklariert ist).

Das Dashboard für Garden
Dieses Werkzeug hat auch einen Hot-Reload-Modus, der einfach die Änderungen an den Skripten mit dem Container im Cluster synchronisiert und den Debugging-Prozess erheblich beschleunigt. Garden hat eine gute und eine annehmbare , die es ermöglicht, schnell damit zu beginnen und es zu nutzen. Übrigens haben wir vor kurzem von seinen Autoren veröffentlicht.
Fazit
Selbstverständlich ist diese Liste nicht die einzige Sammlung von Werkzeugen zur Entwicklung und Debugging von Anwendungen in Kubernetes. Es gibt noch viele nützliche und praktische Tools, die es wert sind, wenn nicht einen eigenen Artikel, dann zumindest eine Erwähnung zu erhalten. Erzählen Sie uns, welche Werkzeuge Sie verwenden, mit welchen Problemen Sie konfrontiert wurden und wie Sie diese gelöst haben!
P.S.
Lesen Sie auch in unserem Blog:
- «»;
- «»;
- «»;
- «».
Quelle: habr.com
