Ich habe mehrere Docker-Bilder, mit denen ich arbeiten möchte minikube
. Ich möchte nicht zuerst dasselbe Bild hochladen und dann herunterladen müssen, anstatt nur das lokale Bild direkt zu verwenden. Wie mache ich das?
Dinge, die ich versucht habe:
1. Ich habe versucht, diese Befehle auszuführen (separat, beide Male die Instanzen von minikube löschen und neu starten)
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never
Ausgabe :
NAME READY STATUS RESTARTS AGE
hdfs-2425930030-q0sdl 0/1 ContainerCreating 0 10m
Es bleibt nur bei einem bestimmten Status hängen, erreicht aber nie den Bereitschaftszustand.
2. Ich habe versucht, eine Registrierung zu erstellen und dann Bilder darin abzulegen, aber das hat auch nicht funktioniert. Ich habe das möglicherweise falsch gemacht, aber ich kann keine richtigen Anweisungen für diese Aufgabe finden.
Bitte geben Sie Anweisungen zur Verwendung lokaler Docker-Images in der lokalen Kubernetes-Instanz.
Betriebssystem: Ubuntu 16.04
Docker: Docker Version 1.13.1, Build 092cba3
Kubernetes:
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.1", Compiler:"gc", Platform:"linux/amd64"}
Wenn mir jemand helfen könnte, eine Lösung zu finden, die Docker-Compose verwendet, wäre das großartig. Vielen Dank.
Bearbeiten:
Bilder geladen in eval $(minikube docker-env
:
REPOSITORY TAG IMAGE ID CREATED SIZE
fluxcapacitor/jupyterhub latest e5175fb26522 4 weeks ago 9.59 GB
fluxcapacitor/zeppelin latest fe4bc823e57d 4 weeks ago 4.12 GB
fluxcapacitor/prediction-pmml latest cae5b2d9835b 4 weeks ago 973 MB
fluxcapacitor/scheduler-airflow latest 95adfd56f656 4 weeks ago 8.89 GB
fluxcapacitor/loadtest latest 6a777ab6167c 5 weeks ago 899 MB
fluxcapacitor/hdfs latest 00fa0ed0064b 6 weeks ago 1.16 GB
fluxcapacitor/sql-mysql latest 804137671a8c 7 weeks ago 679 MB
fluxcapacitor/metastore-1.2.1 latest ea7ce8c5048f 7 weeks ago 1.35 GB
fluxcapacitor/cassandra latest 3cb5ff117283 7 weeks ago 953 MB
fluxcapacitor/apachespark-worker-2.0.1 latest 14ee3e4e337c 7 weeks ago 3.74 GB
fluxcapacitor/apachespark-master-2.0.1 latest fe60b42d54e5 7 weeks ago 3.72 GB
fluxcapacitor/package-java-openjdk-1.8 latest 1db08965289d 7 weeks ago 841 MB
gcr.io/google_containers/kubernetes-dashboard-amd64 v1.5.1 1180413103fd 7 weeks ago 104 MB
fluxcapacitor/stream-kafka-0.10 latest f67750239f4d 2 months ago 1.14 GB
fluxcapacitor/pipeline latest f6afd6c5745b 2 months ago 11.2 GB
gcr.io/google-containers/kube-addon-manager v6.1 59e1315aa5ff 3 months ago 59.4 MB
gcr.io/google_containers/kubedns-amd64 1.9 26cf1ed9b144 3 months ago 47 MB
gcr.io/google_containers/kube-dnsmasq-amd64 1.4 3ec65756a89b 5 months ago 5.13 MB
gcr.io/google_containers/exechealthz-amd64 1.2 93a43bfb39bf 5 months ago 8.37 MB
gcr.io/google_containers/pause-amd64
quelle
minikube start --disk-size 100g
. Eine andere Lösung wäre, alte Bilder mitdocker images
und zu löschendocker rmi
.eval $(minikube docker-env)
nach dem Schließen des Terminals, in dem Sie arbeiten, ausgeführt werden, bevor Sie versuchen, Bilder neu zu erstellen. Sie haben gerade 6 Stunden lang mit einem Bild gekämpft, das im Minikube nicht aktualisiert wurde. Es sah so aus, als würde ein Paket nicht aktualisiert. . wirklich nur nicht das Bild aktualisieren, auf das Minikube verwies.IfNotPresent
bedeutet, dass wir lediglich die Umgebungsvariablen festlegen müssen.eval $(minikube docker-env -u)
Was für mich funktioniert hat, basierend auf der Lösung von @svenwltr:
quelle
Diese Antwort ist nicht auf Minikube beschränkt!
Verwenden Sie eine lokale Registrierung:
Kennzeichnen Sie nun Ihr Bild richtig:
Beachten Sie, dass localhost in DNS-Name des Computers geändert werden sollte, auf dem der Registrierungscontainer ausgeführt wird.
Schieben Sie nun Ihr Bild in die lokale Registrierung:
Sie sollten es zurückziehen können:
Ändern Sie nun Ihre yaml-Datei, um die lokale Registrierung zu verwenden.
Überlegen Sie, ob Sie das Volume an einer geeigneten Stelle bereitstellen möchten, um die Images in der Registrierung beizubehalten.
aktualisieren:
Wie Eli angegeben hat, müssen Sie die lokale Registrierung als unsicher hinzufügen, um http verwenden zu können (gilt möglicherweise nicht bei Verwendung von localhost, gilt jedoch bei Verwendung des lokalen Hostnamens).
Verwenden Sie http nicht in der Produktion, sondern bemühen Sie sich, die Dinge zu sichern.
quelle
<registryIP>:5000/ubuntu
Hinzufügen zu @Farhads Antwort basierend auf dieser Antwort ,
Dies sind die Schritte zum Einrichten einer lokalen Registrierung.
Einrichtung auf dem lokalen Computer
Hostnamen auf lokalem Computer einrichten: Bearbeiten
/etc/hosts
, um diese Zeile hinzuzufügenStarten Sie nun eine lokale Registrierung (entfernen Sie -d, um den Nicht-Daemon-Modus auszuführen):
Kennzeichnen Sie nun Ihr Bild richtig:
Schieben Sie nun Ihr Bild in die lokale Registrierung:
Stellen Sie sicher, dass das Bild verschoben wird:
Setup in Minikube
ssh in minikube mit:
minukube ssh
bearbeiten
/etc/hosts
, um diese Zeile hinzuzufügenÜberprüfen Sie den Zugriff:
Wenn Sie jetzt versuchen zu ziehen, wird möglicherweise ein http-Zugriffsfehler angezeigt.
Unsicheren Zugriff aktivieren :
Wenn Sie immer planen, minkube mit diesem lokalen Setup zu verwenden, erstellen Sie einen Minikube, um standardmäßig eine unsichere Registrierung zu verwenden (funktioniert nicht in vorhandenen Clustern).
Andernfalls befolgen Sie die folgenden Schritte:
Bearbeiten Sie die Docker-Serice-Datei: Pfad abrufen von
systemctl status docker
es könnte sein :
füge diesen Text hinzu (ersetze 192.168.1.4 durch deine IP)
zu dieser Zeile
versuchen Sie zu ziehen:
Ändern Sie nun Ihre yaml-Datei, um die lokale Registrierung zu verwenden.
zu
Verwenden Sie http nicht in der Produktion, sondern bemühen Sie sich, die Dinge zu sichern.
quelle
Neben der akzeptierten Antwort können Sie
run
mit dem folgenden Befehl auch das erreichen, was Sie ursprünglich wollten (Erstellen einer Bereitstellung mit dem Befehl):Ich habe die Informationen zum Generator im Kubernetes-dev-Forum gefunden:
https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM
quelle
Ein Ansatz besteht darin, das Image lokal zu erstellen und dann Folgendes zu tun:
minikube docker-env
Möglicherweise werden nicht die richtigen Informationen zurückgegeben, die unter einem anderen Benutzer / sudo ausgeführt werden. Stattdessen kannst du rennensudo -u yourUsername minikube docker-env
.Es sollte etwas zurückgeben wie:
quelle
docker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)
arbeitete für michWenn jemand nach dem Festlegen der Minikube-Umgebung in die lokale Umgebung zurückkehren möchte, verwenden Sie den folgenden Befehl.
quelle
Aus den kubernetes-Dokumenten:
https://kubernetes.io/docs/concepts/containers/images/#updating-images
Oder lesen Sie anders herum: Wenn Sie das Tag: latest verwenden, werden Bilder immer gezogen. Wenn Sie das
eval $(minikube docker-env)
oben erwähnte verwenden, verwenden Sie entweder kein Tag oder weisen Sie Ihrem lokalen Image ein Tag zu. Sie können vermeiden, dass Kubernetes versucht, es gewaltsam abzurufen.quelle
Es gibt jetzt ein Minikube-Registrierungs-Addon. Dies ist wahrscheinlich der einfachste Weg. So verwenden Sie es: https://minikube.sigs.k8s.io/docs/tasks/registry/insecure/
Beachten Sie, dass ich DNS-Probleme hatte, möglicherweise ein Fehler.
quelle
Eine einfachere Methode, die die ursprüngliche Frage "Wie werden lokale Docker-Bilder mit Minikube verwendet?" Beantwortet, besteht darin, das Bild in einer TAR-Datei zu speichern und in Minikube zu laden:
Das Ausführen des Images umfasst dann einen Befehl wie den folgenden. Stellen Sie sicher, dass Sie den Parameter "--image-pull-policy = Never" angeben.
quelle
docker save
mitsudo
, und legen Siesudo chmod 664 my-image.tar
es für meinen aktuellen Benutzer zur Verfügung zu stellen.Wenn Sie ein Tarball-Image haben, können Sie es einfach in
docker image load -i /path/image.tar
Ihren lokalen Docker-Satz von Bildern laden. Bitte denken Sie daran, es danacheval $(minikube docker-env)
auszuführen, da minikube keine Bilder für die lokal installierte Docker-Engine freigibt.quelle
Andere Antworten setzen voraus, dass Sie Minikube mit VM verwenden, sodass auf Ihre lokalen Images von Minikube VM nicht zugegriffen werden kann.
Wenn Sie minikube mit verwenden
--vm-driver=none
, können Sie lokale Bilder einfach wiederverwenden, indem Sieimage_pull_policy
auf Nie einstellen :oder Einstellfeld
imagePullPolicy
für Cotainer in entsprechenden.yaml
Manifesten.quelle
Eine Idee wäre, das Docker-Image lokal zu speichern und später wie folgt in minikube zu laden:
Nehmen wir zum Beispiel an, Sie haben bereits ein Puckel / Docker-Luftstrom-Bild.
Speichern Sie das Image auf der lokalen Festplatte -
docker save puckel/docker-airflow > puckel_docker_airflow.tar
Geben Sie jetzt in Minikube Docker env -
eval $(minikube docker-env)
Laden Sie das lokal gespeicherte Bild -
docker load < puckel_docker_airflow.tar
So einfach ist das und es wirkt wie ein Zauber.
quelle
Set the imagePullPolicy to Never
. Wenn Ihr Image mit einer Adresse versehen ist, z. B.us.icr.io/mydiv/my-service:v0.0.1
versucht eine Bereitstellung, dieses Image remote abzurufen. Da Sie das Bild bereits manuell kopiert haben, müssen Sie verhindern, dass k8s das Bild von einer Adresse (Container-Registrierung) abruft, auf die es nicht zugreifen kann.Was wäre, wenn Sie nur k8s in Dockers VM ausführen könnten? Es gibt native Unterstützung dafür mit den neueren Versionen von Docker Desktop ... Sie müssen nur diese Unterstützung aktivieren.
https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now- kubernetes /
wie ich das herausgefunden habe:
Während Sie die Dokumente für helm lesen, erhalten Sie eine kurze Anleitung zur Installation von minikube. Dieses Tutorial installiert Minikube in einer VM, die sich vom Docker unterscheidet.
Als es an der Zeit war, meine Helmkarten zu installieren, konnte ich helm / k8s nicht dazu bringen, die Bilder abzurufen, die ich mit Docker erstellt hatte. So bin ich hier zu dieser Frage gekommen.
Also ... wenn Sie mit jeder Version von k8s leben können, die mit Docker Desktop geliefert wird, und Sie damit leben können, was auch immer mit VM Docker läuft, dann ist diese Lösung vielleicht ein bisschen einfacher als einige der anderen.
Haftungsausschluss: Ich bin mir nicht sicher, wie sich das Wechseln zwischen Windows- / Linux-Containern auf irgendetwas auswirken würde.
quelle
Es gibt einen Aufsatz und eine effektive Möglichkeit, Ihr lokales Docker-Image direkt in die Minikube zu verschieben. Dies spart Zeit beim erneuten Erstellen der Bilder in der Minikube.
Weitere Details hier
Alle möglichen Methoden zum Verschieben von Bildern in den Minikube werden hier erwähnt: https://minikube.sigs.k8s.io/docs/handbook/pushing/
quelle
Sie können die Docker-Shell entweder wiederverwenden
eval $(minikube docker-env)
oder alternativdocker save | docker load
über die Shells hinweg nutzen.quelle
Was hier tatsächlich passiert, ist, dass Ihr Minikube Ihren Docker-Daemon nicht erkennen kann, da es sich um einen unabhängigen Dienst handelt. Sie müssen zuerst Ihre Minikube-Docker-Umgebung festlegen, indem Sie den folgenden Befehl verwenden, um dies zu überprüfen
Wenn Sie den folgenden Befehl ausführen, wird angezeigt, wo Ihre Minikube nach Docker sucht.
Sie müssen erneut Images erstellen, sobald Sie minikube docker-env eingerichtet haben, sonst schlägt es fehl.
quelle
Ich finde diese Methode von ClickHouse Operator Build From Sources und sie hilft und rettet mein Leben!
quelle
Schritte zum Ausführen lokaler Docker-Images in Kubernetes
1. eval $ (minikube -p minikube docker-env)
2. Fügen Sie in der Artefaktdatei unter Spezifikationsabschnitt -> Container
imagePullPolicy: IfNotPresent
oder imagePullPolicy: Never hinzu
3. dann laufen
kubectl create -f <filename>
quelle