webentwicklung-frage-antwort-db.com.de

Wie erstelle ich eine lokale Entwicklungsumgebung für Kubernetes?

Kubernetes Es scheint alles um die Bereitstellung von Containern in einer Clusterwolke zu gehen. Was es nicht zu berühren scheint, sind Entwicklungs- und Inszenierungsumgebungen (oder ähnliches).

Während der Entwicklung möchten Sie mit wichtigen Änderungen so nahe wie möglich an der Produktionsumgebung sein:

  • Lokal bereitgestellt (oder zumindest irgendwo, wo Sie und nur Sie auf zugreifen können)
  • Verwenden Sie latest source code für die Seitenaktualisierung (vorausgesetzt, es handelt sich um eine Website; idealerweise wird die automatische Aktualisierung der Seite beim Speichern lokaler Dateien durchgeführt, was möglich ist, wenn Sie Quellcode mounten und etwas wie Yeoman verwenden).

Ebenso kann es erwünscht sein, dass eine nichtöffentliche Umgebung kontinuierliche Integration durchführt.

Unterstützt Kubernetes solche Entwicklungsumgebungen oder ist es etwas, das man bauen muss, in der Hoffnung, dass es während der Produktion noch funktioniert?

94
Wernight

Update (2016-07-15)

Mit dem Release von Kubernetes 1.3 ist Minikube nun die empfohlene Methode, um Kubernetes auf Ihrem lokalen Rechner für die Entwicklung auszuführen. 


Sie können Kubernetes lokal über Docker ausführen. Wenn Sie einen Knoten ausgeführt haben, können Sie einen Pod starten, der über einen einfachen Webserver verfügt und ein Volume von Ihrem Host-Computer aus anlegt. Wenn Sie den Webserver erreichen, liest er vom Volume und wenn Sie die Datei auf Ihrer lokalen Festplatte geändert haben, kann sie die neueste Version bereitstellen. 

58
Robert Bailey

Wir haben an einem Werkzeug dafür gearbeitet. Grundidee ist, dass Sie über einen entfernten Kubernetes-Cluster verfügen, effektiv eine Staging-Umgebung, und dann den Code lokal ausführen, und er wird an den Remote-Cluster weitergeleitet. Sie erhalten einen transparenten Netzwerkzugriff, kopierte Umgebungsvariablen, Zugriff auf Volumes ... so nah wie möglich an der Remote-Umgebung, wobei Ihr Code jedoch lokal ausgeführt wird und unter Ihrer vollen Kontrolle steht.

So können Sie beispielsweise Live-Entwicklung betreiben. Dokumente unter http://telepresence.io

7
Itamar

Die Art des "Hot Reload" ist etwas, das wir hinzufügen möchten, ist aber nicht so einfach, wie es heute sein könnte. Wenn Sie jedoch abenteuerlustig sind, können Sie rsync mit Docker-Exec, kubectl-exec oder osc-exec (alle machen das gleiche ungefähr) machen, um ein lokales Verzeichnis bei jeder Änderung in einen Container zu synchronisieren. Sie können rsync mit kubectl oder osc exec wie folgt verwenden:

# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder
5
Clayton

Ich habe gerade mit Skaffold angefangen

Es ist sehr nützlich, Änderungen im Code automatisch auf einen lokalen Cluster anzuwenden.

Für die Bereitstellung eines lokalen Clusters ist Minikube oder Docker für Mac und Windows am besten geeignet, beide verfügen über eine Kubernetes-Schnittstelle.

4
Ignacio Millán

Ein weiterer guter Ausgangspunkt ist dieses Vagrant-Setup , insb. wenn Ihr Host-Betriebssystem Windows ist. Die offensichtlichen Vorteile sind

  • schnelles und schmerzfreies Setup
  • leicht zu zerstören/neu erstellen der maschine
  • implizite Begrenzung der Ressourcen
  • möglichkeit zum Testen der horizontalen Skalierung durch Erstellen mehrerer Knoten

Die Nachteile - Sie benötigen viel RAM und VirtualBox ist VirtualBox ... zum Guten oder Schlechten.

Ein gemischter Vorteil/Nachteil besteht darin, Dateien über NFS abzubilden. In unserem Setup haben wir zwei Sätze von RC-Definitionen erstellt - eine, die lediglich ein Docker-Image unserer Anwendungsserver herunterlädt. die andere mit 7 zusätzlichen Zeilen, die das Datei-Mapping von HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod einrichten; Überschreiben des Quellcodes aus dem Docker-Image.

Der Nachteil ist der NFS-Dateicache, der problematisch ist, ohne dass er problematisch langsam ist. Selbst wenn Sie mount_options: 'nolock,vers=3,udp,noac' einstellen, werden Caching-Probleme nicht vollständig beseitigt, es funktioniert jedoch meistens. Einige Gulp-Tasks, die in einem Container ausgeführt werden, können 5 Minuten dauern, wenn sie unter Host OS 8 Sekunden dauern. Ein guter Kompromiss scheint mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15' zu sein.

Was das automatische Laden von Code anbelangt, ist dies sprachspezifisch, aber wir sind mit Djangos Devserver für Python und Nodemon für Node.js zufrieden. Für Frontend-Projekte können Sie natürlich viel mit gulp + browserSync + watch tun, aber für viele Entwickler ist es nicht schwierig, von Apache aus zu bedienen und einfach traditionelle Aktualisierungen durchzuführen.

Wir halten 4 Sätze von Yaml-Dateien für Kubernetes. Dev, "devstable", Bühne, Prod. Die Unterschiede zwischen diesen sind

  • umgebungsvariablen, die explizit die Umgebung festlegen (dev/stage/prod)
  • anzahl der Repliken
  • devstable, stage, prod verwendet Docker-Images
  • dev verwendet Docker-Images und ordnet NFS-Ordner mit Quellcode zu.

Es ist sehr nützlich, viele bash-Aliase und Autocomplete zu erstellen. Ich kann einfach rec users eingeben und es wird kubectl delete -f ... ; kubectl create -f ... ausgeführt. Wenn ich möchte, dass das gesamte Setup gestartet wird, tippe ich recfo ein. Es erstellt ein Dutzend Dienste, zieht die neuesten Docker-Images ab, importiert den neuesten Db-Dump aus Staging env und bereinigt alte Docker-Dateien, um Platz zu sparen.

4
analytik

Unter https://github.com/kubernetes/kubernetes/issues/12278 erfahren Sie, wie Sie ein Volume von der Host-Maschine einhängen.

docker run -v hostPath:ContainerPath
2
akshayl

Eine gute Feedbackschleife für die lokale Entwicklung zu haben, ist ein Thema für die rasche Entwicklung im Kubernetes-Ökosystem.

Wenn ich diese Frage zusammenfasse, gibt es einige Tools, die meines Erachtens dieses Ziel gut unterstützen.

Docker für Mac Kubernetes

Docker für Mac Kubernetes ( Docker Desktop ist der generische plattformübergreifende Name) bietet eine hervorragende Option für die lokale Entwicklung. Für die Virtualisierung wird HyperKit verwendet, das auf dem nativen Hypervisor-Framework in macOS anstelle von VirtualBox basiert.

Die Kubernetes-Funktion wurde zum ersten Mal im Edge-Channel als Beta-Version veröffentlicht ( Januar 2018 ) und hat seitdem einen langen Weg zurückgelegt. Sie wurde zum zertifizierten Kubernetes ( April 2018 ) und ging in den Stall Kanal in Juli 2018 .

Nach meiner Erfahrung ist die Arbeit mit Minikube viel einfacher als mit Minikube, insbesondere unter macOS, und insbesondere bei Problemen wie RBAC, Helm, Hypervisor, Private Registry usw.

Helm

Helm ist eine der beliebtesten Optionen, um Ihren Code zu verbreiten und Updates lokal abzurufen. Sie können Ihre Anwendungen über CI/CD als Helm-Charts veröffentlichen (und auch die zugrunde liegenden Docker-Images, auf die sie verweisen). Anschließend können Sie diese Diagramme lokal aus Ihrer Helm-Diagrammregistrierung abrufen und auf Ihrem lokalen Cluster aktualisieren.

Azure-Entwurf

Sie können auch ein Tool wie Azure Draft verwenden, um einfache lokale Bereitstellungen durchzuführen und einfache Helm-Diagramme aus gängigen Sprachvorlagen zu generieren, ähnlich wie Buildpacks, um diesen Teil des Puzzles zu automatisieren.

Gerüst

Skaffold ist wie Azure Draft, aber ausgereifter, umfassender und von Google erstellt. Es hat eine sehr steckbare Architektur. Ich denke, in Zukunft werden mehr Leute es für die lokale App-Entwicklung für Kubernetes verwenden.

Wenn Sie React verwendet haben, stelle ich mir Skaffold als " Create React App for Kubernetes" vor.

Kompose oder Compose auf Kubernetes

Docker Compose ist, obwohl unabhängig von Kubernetes, eine Alternative, mit der einige Unternehmen eine einfache, einfache und portable lokale Entwicklungsumgebung bereitstellen, die der Kubernetes-Umgebung entspricht, die sie in der Produktion ausführen. Wenn Sie diesen Weg einschlagen, bedeutet dies jedoch, dass Ihre Produktions- und lokalen Entwicklungs-Setups voneinander abweichen.

Kompose ist ein Konverter von Docker Compose zu Kubernetes. Dies könnte ein nützlicher Pfad für jemanden sein, der seine Anwendungen bereits lokal als Container-Sammlungen ausführt.

Compose on Kubernetes ist ein kürzlich im Handel erhältliches (Dezember 2018) Angebot von Docker, mit dem Docker Compose-Dateien über einen benutzerdefinierten Controller direkt in einem Kubernetes-Cluster bereitgestellt werden können.

2
Taylor Edmiston

Kubespary ist hilfreich beim Einrichten lokaler Cluster. Meistens verwendete ich vagrant-basierte Cluster auf lokalen Computern.

Kubespray Konfiguration Sie können diese Variablen anpassen, um die gewünschte kubernetes-Version zu erhalten.

1
YAP

Schauen Sie sich https://github.com/okteto/okteto und Okteto Cloud an. Der Vorteil ist, dass Sie die klassische Erfahrung in der Entwicklung haben, als vor Ort zu arbeiten, bevor Sie Docker verwenden. Dort können Sie Hot-Reloads, inkrementelle Builds und Debugger durchführen. Alle Ihre lokalen Änderungen werden jedoch sofort mit einem Remote-Container synchronisiert. Remotecontainer bieten Zugriff auf die Geschwindigkeit der Cloud, ermöglichen eine neue Ebene der Zusammenarbeit und integrieren die Entwicklung in eine produktionsähnliche Umgebung. Außerdem entfällt die Belastung durch lokale Installationen.

Wie bereits von Robert angegeben, ist Minikube der richtige Weg. 

Hier ist eine Kurzanleitung für den Einstieg in Minikube. Die allgemeinen Schritte sind: 

  • Minikube installieren

  • Minikube-Cluster erstellen (in einer virtuellen Maschine, die bei Windows VirtualBox oder Docker für Mac oder HyperV sein kann)

  • Erstellen Sie ein Docker-Image Ihrer Anwendungsdatei (mithilfe von Dockerfile).

  • Führen Sie das Image aus, indem Sie eine Bereitstellung erstellen

  • Erstellen Sie einen Dienst, der Ihre Anwendung verfügbar macht, sodass Sie darauf zugreifen können.

0
Rafa

Sie können "portainer" für Entwicklungszwecke verwenden. Es ist einfach und es ist nicht erforderlich, sich einen Befehl oder ein Yaml-Manifest zu merken.

0
hk'

Der Nachteil von minkube ist, dass eine andere virtuelle Maschine über Ihrer Maschine erzeugt wird. Bei der neuesten minikube-Version müssen mindestens 2 CPU und 2 GB RAM von Ihrem System vorhanden sein. Dies macht es ziemlich schwer, wenn Sie nicht über genügend Ressourcen verfügen.

Dies ist der Grund, warum ich zu microk8s für die Entwicklung von kubernetes gewechselt bin und ich liebe es. microk8s unterstützt DNS, Local-Storage, Dashboard, Istio, Ingress und vieles mehr, alles, was Sie zum Testen Ihrer Microservices benötigen.

Es ist eine schnelle und leichtgewichtige Upstream-Installation von Kubernetes, die von Ihrer lokalen Umgebung isoliert ist. Diese Isolierung wird erreicht, indem alle Binaries für Kubernetes, Docker.io, iptables und CNI in einem einzigen Snap-Paket zusammengefasst werden.

Ein einzelner Knoten-Kubernetes-Cluster kann innerhalb einer Minute mit einem einzigen Befehl installiert werden:

snap install microk8s --classic

Stellen Sie sicher, dass auf Ihrem System kein Docker- oder Kubelet-Dienst ausgeführt wird. Microk8s installiert alle erforderlichen Dienste automatisch.

Bitte beachten Sie den folgenden Link, um andere Add-ons in microk8s zu aktivieren.

https://github.com/ubuntu/microk8s

Sie können den Status überprüfen mit:

[email protected]:~/PycharmProjects/k8sClient$ microk8s.status
microk8s is running
addons:
ingress: disabled
dns: disabled
metrics-server: disabled
istio: disabled
gpu: disabled
storage: disabled
dashboard: disabled
registry: disabled
0
Prafull Ladha

Sie können einen Remote-Kubernetes-Cluster verwenden und Ihre lokalen Computer für die Verbindung mit diesem Cluster konfigurieren. Verwenden Sie die Befehle kubectl cp, um Code in ausgeführte Pods zu kopieren, um den Code während der Entwicklung im laufenden Betrieb zu laden.

0
Rajith