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:
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?
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.
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
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
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.
Ein weiterer guter Ausgangspunkt ist dieses Vagrant-Setup , insb. wenn Ihr Host-Betriebssystem Windows ist. Die offensichtlichen Vorteile sind
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
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.
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
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 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 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.
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.
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.
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.
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.
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.
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.
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.
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
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.