{"id":37475,"date":"2019-10-31T22:17:51","date_gmt":"2019-10-31T19:17:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\/"},"modified":"2019-10-31T22:17:51","modified_gmt":"2019-10-31T19:17:51","slug":"instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","title":{"rendered":"Entwicklungstools f\u00fcr Anwendungen, die in Kubernetes ausgef\u00fchrt werden","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Entwicklungstools f\u00fcr Anwendungen, die in Kubernetes ausgef\u00fchrt werden\" src=\"\/wp-content\/uploads\/2019\/08\/ad1f46a3562dcefacaa1722ee1ce3387.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEin moderner Ansatz in der Betriebsf\u00fchrung l\u00f6st zahlreiche aktuelle Probleme f\u00fcr Unternehmen. Container und Orchestratoren erm\u00f6glichen es, Projekte jeder Komplexit\u00e4t leicht zu skalieren, vereinfachen die Ver\u00f6ffentlichung neuer Versionen und machen diese zuverl\u00e4ssiger, schaffen jedoch gleichzeitig zus\u00e4tzliche Probleme f\u00fcr Entwickler. Programmierer sorgen sich in erster Linie um ihren Code: Architektur, Qualit\u00e4t, Leistung, Eleganz \u2013 und nicht darum, wie dieser in Kubernetes l\u00e4uft oder wie er nach den kleinsten \u00c4nderungen getestet und debuggt werden kann. Daher ist es nicht verwunderlich, dass Werkzeuge f\u00fcr Kubernetes aktiv entwickelt werden, die dabei helfen, Probleme selbst der \u201aarchaischsten\u2018 Entwickler zu l\u00f6sen und es ihnen erm\u00f6glichen, sich auf das Wesentliche zu konzentrieren.<\/p>\n<p>In dieser \u00dcbersicht werden einige Werkzeuge vorgestellt, die das Leben von Programmierern erleichtern, deren Code in den Pods eines Kubernetes-Clusters l\u00e4uft.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Einfache Helfer<\/h2>\n<p><\/p>\n<h3>Kubectl-debug<\/h3>\n<p><\/p>\n<ul>\n<li> Essenz: <b>F\u00fcge deinen Container in den Pod ein und sieh dir an, was darin passiert<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aylei\/kubectl-debug\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 715 Sterne, 54 Commits, 9 Mitwirkende.<\/li>\n<li> Sprache: Go.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nDieses kubectl-Plugin erm\u00f6glicht es, innerhalb des gew\u00fcnschten Pods einen zus\u00e4tzlichen Container zu erstellen, der den Namensraum der Prozesse mit den anderen Containern teilt. Damit kann die Funktionsweise des Pods debuggt werden: Die Netzwerkverbindung \u00fcberpr\u00fcfen, den Netzwerkverkehr anh\u00f6ren, einen strace des interessierenden Prozesses durchf\u00fchren usw.<\/p>\n<p>Es kann auch in den Container eines Prozesses gewechselt werden, indem man <code>chroot \/proc\/PID\/root<\/code> ausf\u00fchrt \u2013 das ist sehr praktisch, wenn ein Root-Shell im Container ben\u00f6tigt wird, f\u00fcr den im Manifest festgelegt ist <code>securityContext.runAs<\/code>.<\/p>\n<p>Das Tool ist einfach und effektiv, sodass es jedem Entwickler n\u00fctzlich sein kann. Mehr dar\u00fcber haben wir in einer <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">separaten Artikel<\/a><\/noindex>.<\/p>\n<h3>Telepresence<\/h3>\n<p><\/p>\n<ul>\n<li> Essenz: <b>\u00dcbertrage die Anwendung auf deinen Computer. Entwickle und debugge lokal.<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.telepresence.io\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/telepresenceio\/telepresence\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 2131 Sterne, 2712 Commits, 33 Mitwirkende.<\/li>\n<li> Sprache: Python.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nDie 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\u00fcck zu proxyen. Dieser Ansatz erm\u00f6glicht die lokale Entwicklung, indem einfach die Dateien in deiner bevorzugten IDE ge\u00e4ndert werden: Die Ergebnisse sind sofort verf\u00fcgbar.<\/p>\n<p>Die Vorteile des lokalen Starts sind die Bequemlichkeit von \u00c4nderungen und das sofortige Ergebnis, sowie die M\u00f6glichkeit, die Anwendung auf gewohnte Weise zu debuggen. Zu den Nachteilen geh\u00f6rt 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\u00dferdem hat Telepresence Probleme mit Volume-Mounts in Windows, was ein entscheidendes Hindernis f\u00fcr Entwickler sein kann, die an dieses Betriebssystem gew\u00f6hnt sind.<\/p>\n<p>Wir haben bereits unsere Erfahrungen mit der Nutzung von Telepresence geteilt. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">hier<\/a><\/noindex>.<\/p>\n<h3>Ksync<\/h3>\n<p><\/p>\n<ul>\n<li> Essenz: <b>nahezu sofortige Synchronisation des Codes mit dem Container im Cluster.<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/vapor-ware\/ksync\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 555 Sterne, 362 Commits, 11 Mitwirkende.<\/li>\n<li> Sprache: Go.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nDas Tool erm\u00f6glicht die Synchronisation des Inhalts eines lokalen Verzeichnisses mit dem Verzeichnis des Containers, der im Cluster l\u00e4uft. Ein solches Werkzeug eignet sich hervorragend f\u00fcr Entwickler von Skriptsprache, deren Hauptproblem die Bereitstellung des Codes im laufenden Container ist. Ksync soll dieses Kopfschmerzproblem l\u00f6sen.<\/p>\n<p>Mit einmaliger Initialisierung des Befehls <code>ksync init<\/code> wird im Cluster ein DaemonSet erstellt, das verwendet wird, um den Zustand des Dateisystems des ausgew\u00e4hlten Containers zu \u00fcberwachen. Auf seinem lokalen Computer f\u00fchrt der Entwickler den Befehl aus <code>ksync watch<\/code>, der die Konfigurationen \u00fcberwacht und <noindex><a rel=\"nofollow\" href=\"https:\/\/syncthing.net\/\">syncthing<\/a><\/noindex>, das die direkte Synchronisation der Dateien mit dem Cluster durchf\u00fchrt.<\/p>\n<p>Es bleibt, ksync anzuweisen, was und mit was synchronisiert werden soll. Zum Beispiel ein solcher Befehl:<\/p>\n<pre><code class=\"plaintext\">ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false \/home\/user\/myproject\/ \/var\/www\/myproject\/<\/code><\/pre>\n<p>\n\u2026 erstellt einen Watcher mit dem Namen <code>myproject<\/code>, der nach einem Pod mit dem Label <code>app=backend<\/code> sucht und versucht, das lokale Verzeichnis <code>\/home\/user\/myproject\/<\/code> mit dem Verzeichnis <code>\/var\/www\/myproject\/<\/code> des Containers mit dem Namen <code>php<\/code>.<\/p>\n<p>Probleme und Hinweise zu ksync aus unserer Erfahrung:<\/p>\n<ul>\n<li> Auf den Knoten des Kubernetes-Clusters muss <code>overlay2<\/code> als Storage-Driver f\u00fcr Docker verwendet werden. Keine anderen Tools werden damit funktionieren.<\/li>\n<li> Bei der Verwendung von Windows als Client-Betriebssystem kann es zu einer fehlerhaften Funktionsweise des File System Watchers kommen. Dieser Bug wurde bei der Arbeit mit gro\u00dfen Verzeichnissen beobachtet \u2014 mit einer gro\u00dfen Anzahl an verschachtelten Dateien und Verzeichnissen. Wir haben <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/syncthing\/syncthing\/issues\/5832\">entsprechende Issue<\/a><\/noindex> im Projekt syncthing erstellt, aber bisher (seit Anfang Juli) gibt es keinen Fortschritt.<\/li>\n<li> Verwenden Sie die Datei <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.syncthing.net\/users\/ignoring.html\"><code>.stignore<\/code><\/a><\/noindex> Um Pfade oder Dateimuster anzugeben, die nicht synchronisiert werden sollen (zum Beispiel Verzeichnisse <code>app\/cache<\/code> und <code>.git<\/code>).<\/li>\n<li> Standardm\u00e4\u00dfig wird ksync den Container bei jeder \u00c4nderung der Dateien neu starten. Dies ist komfortabel f\u00fcr Node.js, jedoch vollkommen \u00fcberfl\u00fcssig f\u00fcr PHP. Es ist besser, opcache auszuschalten und das Flag <code>--reload=false<\/code>.<\/li>\n<li> Die Konfiguration kann jederzeit in <code>$HOME\/.ksync\/ksync.yaml<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Squash<\/h3>\n<p><\/p>\n<ul>\n<li> Essenz: <b>dein Debugging direkt im Cluster<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/solo-io\/squash\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 1154 Sterne, 279 Commits, 23 Mitwirkende.<\/li>\n<li> Sprache: Go.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nDieses Tool ist zur Debugging von Prozessen direkt in den Pods gedacht. Die Utility ist einfach und erm\u00f6glicht im interaktiven Modus die Auswahl des gew\u00fcnschten Debuggers. <i>(siehe unten)<\/i> und Namespace + Pod, in dessen Prozess eingegriffen werden muss. Derzeit werden unterst\u00fctzt:<\/p>\n<ul>\n<li> delve \u2013 f\u00fcr Go-Anwendungen;<\/li>\n<li> GDB \u2013 \u00fcber target remote + Portweiterleitung;<\/li>\n<li> Portweiterleitung JDWP f\u00fcr das Debuggen von Java-Anwendungen.<\/li>\n<\/ul>\n<p>\nVon der IDE wird nur VScode unterst\u00fctzt (mit Hilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ilevine.squash\">f\u00fcr die Arbeit mit Modulen, die anstelle von Header-Dateien verwendet werden k\u00f6nnen. Module bieten einen neuen Weg zur Organisation von Quelltexten, basierend auf der Definition von Komponentenbereichen, ohne \u00fcber \u201e#include\u201c eingebundene Header-Dateien.<\/a><\/noindex>), jedoch sind in den Pl\u00e4nen f\u00fcr das laufende (2019) Jahr Eclipse und Intellij vorgesehen.<\/p>\n<p>F\u00fcr das Debuggen von Prozessen startet Squash in den Cluster-Knoten einen privilegierten Container, daher sollte man sich zun\u00e4chst \u00fcber die M\u00f6glichkeiten <noindex><a rel=\"nofollow\" href=\"https:\/\/squash.solo.io\/secure_mode\/\">des sicheren Modus<\/a><\/noindex> informieren, um Sicherheitsprobleme zu vermeiden.<\/p>\n<h2>Komplexe L\u00f6sungen<\/h2>\n<p>\nKommen wir zur schweren Artillerie \u2013 gr\u00f6\u00dferen \"skalierbaren\" Projekten, die darauf abzielen, viele Bed\u00fcrfnisse der Entwickler gleichzeitig zu schlie\u00dfen.<\/p>\n<p><i><b>NB<\/b>: In dieser Liste ist auf jeden Fall auch unser Open Source-Dienstprogramm <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\"><b>werf<\/b><\/a><\/noindex> (fr\u00fcher bekannt als dapp) enthalten. Allerdings haben wir schon oft dar\u00fcber geschrieben und berichtet, weshalb wir beschlossen haben, es nicht in die \u00dcbersicht aufzunehmen. F\u00fcr diejenigen, die sich n\u00e4her \u00fcber die M\u00f6glichkeiten informieren m\u00f6chten, empfehlen wir den Vortrag \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2013 unser Werkzeug f\u00fcr CI\/CD in Kubernetes<\/a><\/noindex>\u00bb.<\/i><\/p>\n<h3>DevSpace<\/h3>\n<p><\/p>\n<ul>\n<li> Essenz: <b>f\u00fcr diejenigen, die mit Kubernetes arbeiten m\u00f6chten, aber nicht tief in die Materie eintauchen wollen<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devspace-cloud\/devspace\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 630 Sterne, 1912 Commits, 13 Mitwirkende.<\/li>\n<li> Sprache: Go.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nL\u00f6sung von dem gleichnamigen Unternehmen, das Managed-Cluster mit Kubernetes f\u00fcr die Teamarbeit bereitstellt. Das Dienstprogramm wurde f\u00fcr kommerzielle Cluster erstellt, funktioniert jedoch auch hervorragend mit allen anderen.<\/p>\n<p>Beim Ausf\u00fchren des Befehls <code>devspace init<\/code> im Verzeichnis des Projekts werden Ihnen (im interaktiven Modus) folgende Optionen angeboten:<\/p>\n<ul>\n<li> einen Kubernetes-Cluster auszuw\u00e4hlen,<\/li>\n<li> einen vorhandenen zu verwenden <code>Dockerfile<\/code> (oder einen neuen zu erstellen), um auf seiner Grundlage einen Container zu erstellen,<\/li>\n<li> ein Repository zum Speichern der Container-Images auszuw\u00e4hlen usw.<\/li>\n<\/ul>\n<p>\nNach all diesen Vorbereitungen kann die Entwicklung beginnen, indem Sie den Befehl ausf\u00fchren <code>devspace dev<\/code>. Dieser Befehl erstellt den Container, l\u00e4dt ihn in das Repository, rollt das Deployment im Cluster aus und startet das Port-Forwarding sowie die Synchronisierung des Containers mit dem lokalen Verzeichnis.<\/p>\n<p>Optional wird angeboten, mit dem Terminal in den Container zu wechseln. Das sollten Sie nicht ablehnen, denn in der Realit\u00e4t startet der Container mit dem Befehl sleep, und um die Anwendung real zu testen, muss sie manuell gestartet werden.<\/p>\n<p>Schlie\u00dflich f\u00fchrt der Befehl <code>devspace deploy<\/code> die Anwendung und die damit verbundene Infrastruktur im Cluster aus, nach dem alles im produktiven Modus funktioniert.<\/p>\n<p>Die gesamte Projektkonfiguration befindet sich in der Datei <code>devspace.yaml<\/code>. Neben den Umgebungen f\u00fcr die Entwicklung finden Sie darin auch eine Beschreibung der Infrastruktur, die den Standard-Manifesten von Kubernetes \u00e4hnelt, aber stark vereinfacht ist.<\/p>\n<p><img decoding=\"async\" alt=\"Entwicklungstools f\u00fcr Anwendungen, die in Kubernetes ausgef\u00fchrt werden\" src=\"\/wp-content\/uploads\/2019\/08\/7abbba3806facfb69ba4e3f9e0f18938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Architektur und Hauptschritte zur Arbeit mit DevSpace<\/i><\/p>\n<p>Zus\u00e4tzlich ist es einfach, eine vordefinierte Komponente (z. B. die MySQL-Datenbank) oder ein Helm-Chart zum Projekt hinzuzuf\u00fcgen. Lesen Sie mehr in <noindex><a rel=\"nofollow\" href=\"https:\/\/devspace.cloud\/docs\/\">Dokumentation<\/a><\/noindex> \u2014 es ist nicht kompliziert.<\/p>\n<h3>Skaffold<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/skaffold.dev\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/skaffold\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 7423 Sterne, 4173 Commits, 136 Mitwirkende.<\/li>\n<li> Sprache: Go.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nDieses Tool von Google strebt an, alle Bed\u00fcrfnisse eines Entwicklers abzudecken, dessen Code in irgendeiner Weise im Kubernetes-Cluster ausgef\u00fchrt wird. Es ist nicht so einfach, damit zu arbeiten wie mit devspace: keine Interaktivit\u00e4t, keine Spracherkennung und keine automatische Erstellung. <code>Dockerfile<\/code> wird Ihnen hier nicht angeboten.<\/p>\n<p>Wenn Sie sich davon jedoch nicht einsch\u00fcchtern lassen \u2014 hier ist, was Skaffold erm\u00f6glicht:<\/p>\n<ul>\n<li> \u00dcberwachung von \u00c4nderungen am Quellcode.<\/li>\n<li> Synchronisieren Sie es mit dem Container des Pods, wenn keine Kompilierung erforderlich ist.<\/li>\n<li> Erstellung von Containern mit Code, wenn die Programmiersprache interpretiert ist, oder Kompilierung von Artefakten und Verpackung in Container.<\/li>\n<li> Die resultierenden Bilder automatisch pr\u00fcfen mit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/container-structure-test\">container-structure-test<\/a><\/noindex>.<\/li>\n<li> Markieren und Hochladen von Images in das Docker-Registry.<\/li>\n<li> Bereitstellung der Anwendung im Cluster unter Verwendung von kubectl, Helm oder kustomize.<\/li>\n<li> Port-Forwarding durchf\u00fchren.<\/li>\n<li> Debuggen von Anwendungen, die in Java, Node.js, Python geschrieben sind.<\/li>\n<\/ul>\n<p>\nDer Workflow wird in verschiedenen Variationen deklarativ in der Datei <code>skaffold.yaml<\/code>beschrieben. F\u00fcr das Projekt k\u00f6nnen auch mehrere Profile definiert werden, in denen die Build- und Deployment-Stufen teilweise oder vollst\u00e4ndig ge\u00e4ndert werden. Zum Beispiel kann f\u00fcr die Entwicklung ein f\u00fcr den Entwickler passendes Basisbild und f\u00fcr Staging und Produktion ein minimales angegeben werden (+ verwenden) <code>securityContext<\/code> in Containern oder einen Cluster, in dem die Anwendung bereitgestellt wird, neu definieren.<\/p>\n<p>Die Erstellung von Docker-Containern kann lokal oder remote erfolgen: in <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/cloud-build\/\">Google Cloud Build<\/a><\/noindex> oder im Cluster mithilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">Kaniko<\/a><\/noindex>. Auch Bazel und Jib Maven\/Gradle werden unterst\u00fctzt. F\u00fcr die Tagging-Strategien unterst\u00fctzt Skaffold zahlreiche Optionen: nach Git-Commit-Hash, Datum\/Uhrzeit, SHA256-Pr\u00fcfziffer der Quelldateien usw.<\/p>\n<p>Besonders hervorzuheben ist die M\u00f6glichkeit, Container zu testen. Das bereits erw\u00e4hnte Framework container-structure-test bietet folgende Pr\u00fcfmethoden an:<\/p>\n<ul>\n<li> Ausf\u00fchrung von Befehlen im Kontext des Containers mit Nachverfolgung der Exit-Status und \u00dcberpr\u00fcfung des Textausgabe der Befehle.<\/li>\n<li> \u00dcberpr\u00fcfung der Existenz von Dateien im Container und \u00dcbereinstimmung der Attribute mit den angegebenen.<\/li>\n<li> Kontrolle des Inhalts von Dateien anhand von regul\u00e4ren Ausdr\u00fccken.<\/li>\n<li> Abgleich der Metadaten des Images (<code>ENV<\/code>, <code>ENTRYPOINT<\/code>, <code>VOLUMES<\/code> usw.).<\/li>\n<li> \u00dcberpr\u00fcfung der Kompatibilit\u00e4t von Lizenzen.<\/li>\n<\/ul>\n<p>\nDie 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\u00f6sung (ksync) in Betracht ziehen.<\/p>\n<p><img decoding=\"async\" alt=\"Entwicklungstools f\u00fcr Anwendungen, die in Kubernetes ausgef\u00fchrt werden\" src=\"\/wp-content\/uploads\/2019\/08\/a53647e9d3bf002c292dcae7a774e561.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Die wichtigsten Phasen der Arbeit mit Skaffold<\/i><\/p>\n<p>Insgesamt erlaubt das Tool keine Abstraktion von Kubernetes-Manifests und bietet keine Interaktivit\u00e4t, weshalb es schwierig zu erlernen scheint. Doch das ist auch sein Vorteil \u2014 gro\u00dfe Handlungsspielr\u00e4ume.<\/p>\n<h3>Garden<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/garden.io\/\">Website<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\">GitHub<\/a><\/noindex>.<\/li>\n<li> Kurze GH-Statistik: 1063 Sterne, 1927 Commits, 17 Mitwirkende.<\/li>\n<li> Sprache: TypeScript <i>(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.)<\/i>.<\/li>\n<li> Lizenz: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nWie Skaffold zielt auch Garden darauf ab, die Prozesse zur Bereitstellung des Anwendungscodes im K8s-Cluster zu automatisieren. Dazu m\u00fcssen Sie zun\u00e4chst die Projektstruktur in einer YAML-Datei beschreiben und dann den Befehl <code>garden dev<\/code>. Dieser f\u00fchrt die ganze Magie aus:<\/p>\n<ul>\n<li> Erstellt Container f\u00fcr verschiedene Teile des Projekts.<\/li>\n<li> F\u00fchrt Integrations- und Unit-Tests durch, sofern diese beschrieben wurden.<\/li>\n<li> Stellt alle Komponenten des Projekts im Cluster bereit.<\/li>\n<li> Bei \u00c4nderungen des Quellcodes wird der gesamte Pipeline-Prozess erneut gestartet.<\/li>\n<\/ul>\n<p>\nDer 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.<\/p>\n<p>Das Modul des Projekts kann ein Container, ein Maven-Container, ein Helm-Chart, ein Manifest f\u00fcr <code>kubectl apply<\/code> 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\u00f6nnen Abh\u00e4ngigkeiten haben, wodurch die Reihenfolge des Deployments eines bestimmten Services, der Start von Aufgaben und Tests festgelegt werden kann.<\/p>\n<p>Garden bietet dem Nutzer ein sch\u00f6nes Dashboard (vorerst in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/dashboard\">experimentellem Zustand<\/a><\/noindex>), in dem das Projekt-Diagramm angezeigt wird: Komponenten, Reihenfolge im Build, Ausf\u00fchrung von Aufgaben und Tests sowie deren Beziehungen und Abh\u00e4ngigkeiten. Direkt im Browser kann man auch die Protokolle aller Komponenten des Projekts einsehen und \u00fcberpr\u00fcfen, was eine bestimmte Komponente \u00fcber HTTP ausgibt (sofern f\u00fcr sie eine Resource ingress deklariert ist).<\/p>\n<p><img decoding=\"async\" alt=\"Entwicklungstools f\u00fcr Anwendungen, die in Kubernetes ausgef\u00fchrt werden\" src=\"\/wp-content\/uploads\/2019\/08\/931b48a306fcce025e4dd8aa51d01552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Das Dashboard f\u00fcr Garden<\/i><\/p>\n<p>Dieses Werkzeug hat auch einen Hot-Reload-Modus, der einfach die \u00c4nderungen an den Skripten mit dem Container im Cluster synchronisiert und den Debugging-Prozess erheblich beschleunigt. Garden hat eine gute <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.garden.io\/\">Dokumentation<\/a><\/noindex> und eine annehmbare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/examples\">Auswahl an Beispielen<\/a><\/noindex>, die es erm\u00f6glicht, schnell damit zu beginnen und es zu nutzen. \u00dcbrigens haben wir vor kurzem <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">\u00dcbersetzung des Artikels<\/a><\/noindex> von seinen Autoren ver\u00f6ffentlicht.<\/p>\n<h2>Fazit<\/h2>\n<p>\nSelbstverst\u00e4ndlich ist diese Liste nicht die einzige Sammlung von Werkzeugen zur Entwicklung und Debugging von Anwendungen in Kubernetes. Es gibt noch viele n\u00fctzliche und praktische Tools, die es wert sind, wenn nicht einen eigenen Artikel, dann zumindest eine Erw\u00e4hnung zu erhalten. Erz\u00e4hlen Sie uns, welche Werkzeuge Sie verwenden, mit welchen Problemen Sie konfrontiert wurden und wie Sie diese gel\u00f6st haben!<\/p>\n<h2>P.S.<\/h2>\n<p>\nLesen Sie auch in unserem Blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">Release des Konsolen-XMPP\/Jabber-Clients profanity 0.7.0<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">Garden v0.10.0: Ihr Laptop ben\u00f6tigt kein Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">Kubernetes Tipps &amp; Tricks: \u00fcber lokale Entwicklung und Telepresence<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">Das kubectl-debug-Plugin f\u00fcr das Debugging in Pods von Kubernetes.<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/462707\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u0431\u043e\u0442\u0438\u0442 \u0435\u0433\u043e \u043a\u043e\u0434: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u2014 \u0430 \u043d\u0435 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0435\u0434\u0435\u0442 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37475","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:51+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Werkzeuge f\u00fcr Entwickler von Anwendungen, die in Kubernetes ausgef\u00fchrt werden | ProHoster","description":"Der moderne Ansatz zur.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster","og:description":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:51+00:00","article:modified_time":"2019-10-31T19:17:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37475","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:00:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:26:27","updated":"2026-01-23 18:00:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=37475"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/28120"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}