Wie erstelle ich eine lokale Entwicklungsumgebung für Kubernetes?

115

Bei Kubernetes geht es anscheinend nur darum, Container in einer Clusterwolke bereitzustellen. Was es nicht zu berühren scheint, sind Entwicklungs- und Staging-Umgebungen (oder ähnliches).

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

  • Lokal bereitgestellt (oder zumindest an einem Ort, auf den Sie und nur Sie zugreifen können )
  • Verwenden Sie den neuesten Quellcode für die Seitenaktualisierung (vorausgesetzt, es handelt sich um eine Website; im Idealfall wird die Seite beim lokalen Speichern der Datei automatisch aktualisiert. Dies ist möglich, wenn Sie den Quellcode einbinden und einige Dinge wie Yeoman verwenden ).

In ähnlicher Weise möchte man möglicherweise, dass eine nicht öffentliche Umgebung eine kontinuierliche Integration durchführt .

Unterstützt Kubernetes eine solche Entwicklungsumgebung oder muss sie erstellt werden, in der Hoffnung, dass sie während der Produktion noch funktioniert?

Wernight
quelle
Schauen Sie sich Openshift Origin an. Es ist die nächste Version von Openshift und basiert auf Kubernetes. Wird eigenständig in einem Docker-Container ausgeführt.
Mark O'Connor
@ MarkO'Connor Ich wollte mehr auch in Google Cloud bereitstellen, aber das sind mehr Bereitstellungslösungen. Wenn Sie eine Lösung mit OpenShift Origin haben, die die lokale Entwicklung ermöglicht (meistens das Neuladen der neuesten lokalen Datei), dann teilen Sie diese bitte als Antwort mit, ich wäre interessiert.
Wernight
Haben Sie eine Lösung dafür gefunden? In meinem lokalen Entwicklungscluster laufen Kubernetes auf Mesos. Ich plane, Microservices in go zu erstellen, die in Containern auf Kubernetes bereitgestellt werden. Ich würde gerne in der Lage sein, meine Änderungen zu speichern und die Binärdatei automatisch erstellen und die Pods neu starten zu lassen. Ich hatte nicht wirklich eine Änderung, um es zu testen, aber ich denke, das Einbauen der Binärdatei auf dem VM und das anschließende Neustarten des Pods kann etwas langsam sein.
F21
2
@ F21 Es ist mehr als ein Jahr her, seit dies veröffentlicht wurde. Gibt es einen guten lokalen Entwicklungsworkflow mit Kubernetes?
Jatin
Sie können sich die microk8sleichtgewichtige k8s-Installation für Ihren lokalen Computer ansehen. Ich habe eine Antwort für das gleiche gepostet, wie man es installiert. Die Installation dauert nur etwa eine Minute.
Prafull Ladha

Antworten:

67

Update (15.07.2016)

Mit der Veröffentlichung von Kubernetes 1.3 ist Minikube nun die empfohlene Methode, um Kubernetes für die Entwicklung auf Ihrem lokalen Computer auszuführen.


Sie können Kubernetes lokal über Docker ausführen . Sobald ein Knoten ausgeführt wird, können Sie einen Pod starten, der über einen einfachen Webserver verfügt und ein Volume von Ihrem Hostcomputer bereitstellt. Wenn Sie den Webserver aufrufen, wird er vom Volume gelesen. Wenn Sie die Datei auf Ihrer lokalen Festplatte geändert haben, kann die neueste Version bereitgestellt werden.

Robert Bailey
quelle
3
Die Ärzte sagen, dass dies nicht mehr die empfohlene Methode ist und dass "Minikube die empfohlene Methode zum Ausführen von Kubernetes auf Ihrem lokalen Computer ist".
Jatin
Ich denke nicht, dass Minikube für die Entwicklung von K8s selbst geeignet ist, habe ich Recht?
Harryz
Es hängt davon ab, was Sie entwickeln. Es gibt viele Teile von k8s, in denen es sinnvoll ist, Minikube für die Entwicklung zu verwenden. Wenn Sie an Sicherheitsrichtlinien für Pod-Netzwerke oder CNI-Plugins arbeiten, ist dies jedoch nicht sehr sinnvoll.
Robert Bailey
1
Der Link "Kubernetes lokal über Docker" ist unterbrochen. Hat jemand ein Update?
Pwnosaurus
1
Minikube hat vor einiger Zeit das lokale Docker-Setup ersetzt und die Dokumentation für die lokale Docker-Version wurde anschließend entfernt. Funktioniert Minikube für Ihre Bedürfnisse? Sie können kubeadm auch innerhalb einer VM verwenden, um einen lokalen Einzelknotencluster zu instanziieren.
Robert Bailey
9

Wir haben an einem Tool gearbeitet, um dies zu tun. Die Grundidee ist, dass Sie einen Remote-Kubernetes-Cluster haben, effektiv eine Staging-Umgebung, und dann Code lokal ausführen und er an den Remote-Cluster weitergeleitet wird. Sie erhalten transparenten Netzwerkzugriff, kopierte Umgebungsvariablen, Zugriff auf Volumes ... so nah wie möglich an der Remote-Umgebung, aber Ihr Code wird lokal und unter Ihrer vollen Kontrolle ausgeführt.

Sie können also beispielsweise eine Live-Entwicklung durchführen. Dokumente unter http://telepresence.io

Itamar
quelle
5

Die Art von "Hot Reload" ist etwas, das wir hinzufügen wollen, aber nicht so einfach wie es heute sein könnte. Wenn Sie sich jedoch abenteuerlustig fühlen, können Sie rsync mit Docker Exec, Kubectl Exec oder Osc Exec verwenden (alle machen ungefähr dasselbe), um ein lokales Verzeichnis bei jeder Änderung mit einem 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
Clayton
quelle
Hot Reload ist und sollte von dem von Ihnen verwendeten Webframework verwaltet werden. Hier richtet yeoman dies normalerweise ein. Was fehlt, ist, wie man es aktiviert. Es muss ein lokales Volume bereitgestellt werden. Wenn @ Roberts Antwort funktioniert, sollte dies eine gültige Lösung sein.
Wernight
4

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

  • schnelle und schmerzlose Einrichtung
  • leicht zu zerstören / die Maschine neu zu erstellen
  • 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 ist das Zuordnen von Dateien über NFS. In unserem Setup haben wir zwei Sätze von RC-Definitionen erstellt - einen, der nur ein Docker-Image unserer Anwendungsserver herunterlädt. die andere mit 7 zusätzlichen Zeilen, die die Dateizuordnung von HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes-Pod einrichten; Überschreiben des Quellcodes aus dem Docker-Image.

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

Das automatische Neuladen von Code ist sprachspezifisch, aber wir sind mit Djangos Devserver für Python und Nodemon für Node.js zufrieden. Bei Frontend-Projekten können Sie natürlich viel mit so etwas wie gulp + browserSync + watch tun, aber für viele Entwickler ist es nicht schwierig, von Apache aus zu dienen und nur herkömmliche Hard-Refreshs durchzuführen.

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

  • env-Variablen, die die Umgebung explizit festlegen (dev / stage / prod)
  • Anzahl der Repliken
  • devstable, stage, prod verwendet Docker-Bilder
  • dev verwendet Docker-Images und ordnet den NFS-Ordner dem Quellcode zu.

Es ist sehr nützlich, viele Bash-Aliase zu erstellen und automatisch zu vervollständigen - ich kann einfach tippen rec usersund es wird funktionieren kubectl delete -f ... ; kubectl create -f .... Wenn ich möchte, dass die gesamte Einrichtung gestartet wird, recfotippe ich ein und es werden ein Dutzend Dienste neu erstellt, die neuesten Docker-Images abgerufen, der neueste Datenbankspeicherauszug aus Staging env importiert und alte Docker-Dateien bereinigt, um Speicherplatz zu sparen.

analytik
quelle
4

Ich habe gerade mit Skaffold angefangen

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

Um einen lokalen Cluster bereitzustellen, ist Minikube oder nur Docker für Mac und Windows der beste Weg. Beide enthalten eine Kubernetes-Oberfläche.

Ignacio Millán
quelle
2

Eine nette Rückkopplungsschleife für die lokale Entwicklung ist ein Thema der schnellen Entwicklung im Kubernetes-Ökosystem.

Um diese Frage aufzuschlüsseln, gibt es einige Tools, von denen ich glaube, dass sie 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 erstmals im Januar 2018 als Beta auf dem Edge-Kanal veröffentlicht und hat seitdem einen langen Weg zurückgelegt. Sie wurde im April 2018 zu einer zertifizierten Kubernetes-Funktion und wurde im Juli 2018 zum stabilen Kanal .

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

Helm

Für die Verteilung Ihres Codes und das lokale Abrufen von Updates ist Helm eine der beliebtesten Optionen. Sie können Ihre Anwendungen über CI / CD als Helm-Diagramme veröffentlichen (und auch die zugrunde liegenden Docker-Bilder, auf die sie verweisen). Anschließend können Sie diese Diagramme lokal aus Ihrer Helm-Diagrammregistrierung abrufen und in Ihrem lokalen Cluster aktualisieren.

Azure-Entwurf

Sie können auch ein Tool wie Azure Draft verwenden , um einfache lokale Bereitstellungen durchzuführen und grundlegende Helmdiagramme aus gängigen Sprachvorlagen zu erstellen, ähnlich wie Buildpacks, um dieses Puzzleteil zu automatisieren.

Gerüst

Skaffold ähnelt Azure Draft, ist jedoch ausgereifter, hat einen viel breiteren Anwendungsbereich und wurde 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 zwar nicht mit Kubernetes verwandt, stellt jedoch eine Alternative dar, mit der einige Unternehmen eine einfache, einfache und tragbare lokale Entwicklungsumgebung bereitstellen, die der Kubernetes-Umgebung entspricht, die sie in der Produktion ausführen. Wenn Sie diesen Weg gehen, müssen Sie jedoch Ihre Produktions- und lokalen Entwicklungskonfigurationen voneinander trennen.

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 Containersammlungen ausführt.

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

Taylor Edmiston
quelle
1

Kubespary ist hilfreich beim Einrichten lokaler Cluster. Meistens habe ich Vagrant-basierte Cluster auf lokalen Computern verwendet.

Kubespray-Konfiguration Sie können diese Variablen so anpassen, dass sie die gewünschte Kubernetes-Version haben.

KLÄFFEN
quelle
1

Der Nachteil der Verwendung minkubebesteht darin, dass eine andere virtuelle Maschine über Ihrer Maschine erzeugt wird. Auch mit neuestenminikube Version sind mindestens 2 CPUs und 2 GB RAM von Ihrem System erforderlich, was es ziemlich schwer macht, wenn das System nicht über genügend Ressourcen verfügt.

Dies ist der Grund, warum ich microk8sfür die Entwicklung auf Kubernetes gewechselt bin und ich liebe es. microk8sunterstützt DNS, Local-Storage, Dashboard, Istio, Ingress und vieles mehr - alles, was Sie zum Testen Ihrer Microservices benötigen.

Es handelt sich um eine schnelle und leichte Upstream-Kubernetes-Installation, die von Ihrer lokalen Umgebung isoliert ist. Diese Isolation wird erreicht, indem alle Binärdateien 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. Microk8sinstalliert alle erforderlichen Dienste automatisch.

Bitte schauen Sie sich den folgenden Link an, um andere Add-Ons zu aktivieren microk8s.

https://github.com/ubuntu/microk8s

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

velotio@velotio-ThinkPad-E470:~/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
Prafull Ladha
quelle
> Stellen Sie sicher, dass auf Ihrem System kein Docker- oder Kubelet-Dienst ausgeführt wird. Aber ich habe Docker bereits lokal installiert und verwende Container neben Kubernetes. Bedeutet das, dass ich microk8s nicht lokal installieren kann?
Attila Szeremi
1

Schauen Sie sich https://github.com/okteto/okteto und Okteto Cloud an . Das Wertversprechen besteht darin, die klassische Entwicklungserfahrung zu haben, als vor dem Docker lokal zu arbeiten, wo Sie Hot-Reloads, inkrementelle Builds, Debugger ... durchführen können. Alle Ihre lokalen Änderungen werden jedoch sofort mit einem Remote-Container synchronisiert. Remote-Container 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.

Pablo Chico de Guzman
quelle
0

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

Hier ist eine Kurzanleitung, um mit Minikube zu beginnen. Die allgemeinen Schritte sind:

  • Installieren Sie minikube

  • Erstellen Sie einen Minikube-Cluster (in einer virtuellen Maschine, die unter 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, damit Sie darauf zugreifen können.

Saty
quelle