J'ai plusieurs images de docker que je veux utiliser avec minikube
. Je ne veux pas d'abord télécharger, puis télécharger la même image au lieu d'utiliser directement l'image locale. Comment puis-je faire cela?
Trucs j'ai essayé:
1. J'ai essayé d'exécuter ces commandes (séparément, en supprimant les instances de minikube deux fois et en démarrant à l'état neuf)
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never
Sortie:
NAME READY STATUS RESTARTS AGE
hdfs-2425930030-q0sdl 0/1 ContainerCreating 0 10m
Il reste bloqué sur un statut mais n'atteint jamais le statut Prêt.
2. J'ai essayé de créer un registre puis d'y insérer des images, mais cela n'a pas fonctionné non plus. J'ai peut-être mal agi, mais je ne trouve pas les instructions appropriées pour effectuer cette tâche.
Veuillez fournir des instructions pour utiliser les images du menu fixe dans l'instance kubernetes locale.
OS: 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"}
Si quelqu'un pouvait m'aider à trouver une solution qui utilise docker-compos pour le faire, ce serait génial. Merci.
Modifier :
Images chargées dans 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
Comme le décrit le fichier _ , vous pouvez réutiliser le démon Docker de Minikube avec eval $(minikube docker-env)
.
Donc, pour utiliser une image sans la télécharger, vous pouvez suivre ces étapes:
eval $(minikube docker-env)
docker build -t my-image .
)my-image
)imagePullPolicy
sur Never
, sinon Kubernetes essaiera de télécharger l'image. Remarque importante: Vous devez exécuter eval $(minikube docker-env)
sur chaque terminal que vous souhaitez utiliser, car il ne définit que les variables d'environnement de la session Shell en cours.
Ce qui a fonctionné pour moi, basé sur la solution de @svenwltr:
# Start minikube
minikube start
# Set docker env
eval $(minikube docker-env)
# Build image
docker build -t foo:0.0.1 .
# Run in minikube
kubectl run hello-foo --image=foo:0.0.1 --image-pull-policy=Never
# Check that it's running
kubectl get pods
Cette réponse n'est pas limitée aux minikube!
Utilisez un registre local:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
Maintenant, marquez correctement votre image:
docker tag ubuntu localhost:5000/ubuntu
Notez que localhost doit être remplacé par le nom DNS de la machine qui exécute le conteneur de registre.
Poussez maintenant votre image dans le registre local:
docker Push localhost:5000/ubuntu
Vous devriez pouvoir le retirer:
docker pull localhost:5000/ubuntu
Maintenant, changez votre fichier yaml pour utiliser le registre local.
Pensez à monter le volume à l'emplacement approprié pour conserver les images dans le registre.
mettre à jour:
comme Eli l'a déclaré, vous devez ajouter le registre local comme non sécurisé pour pouvoir utiliser http (peut ne pas s'appliquer lors de l'utilisation de localhost mais s'applique si vous utilisez le nom d'hôte local)
N'utilisez pas http en production, faites l'effort de sécuriser les choses.
En plus de la réponse acceptée, vous pouvez également atteindre vos objectifs initiaux (création d'un déploiement à l'aide de la commande run
) à l'aide de la commande suivante:
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1
J'ai trouvé les informations sur le générateur sur le forum Kubernetes-dev:
Si vous utilisez
kubectl run
, il génère un manifeste dont le nomimagePullPolicy
est défini surAlways
par défaut. Vous pouvez utiliser cette commande pour obtenir unimagePullPolicy
deIfNotPresent
, qui fonctionnera pourminikube
:
kubectl run --image=<container> --generator=run-pod/v1
Dan Lorenc
https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM
Une approche consiste à construire l'image localement et à effectuer ensuite:
docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)
minikube docker-env
pourrait ne pas renvoyer les informations correctes exécutées sous un autre utilisateur/Sudo. Au lieu de cela, vous pouvez exécuter Sudo -u yourUsername minikube docker-env
.
Il devrait retourner quelque chose comme:
export DOCKER_TLS_VERIFY="1"
export DOCKER_Host="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/chris/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your Shell:
# eval $(minikube docker-env)
De la documentation de kubernetes:
https://kubernetes.io/docs/concepts/containers/images/#updating-images
La politique d'extraction par défaut est IfNotPresent, ce qui force le Kubelet à ignorer l'extraction d'une image si elle existe déjà. Si vous souhaitez toujours forcer un pull, vous pouvez effectuer l’une des opérations suivantes:
- définissez l'imagePullPolicy du conteneur sur Toujours;
- use: latest en tant que balise pour l'image à utiliser;
- activer le contrôleur d'admission AlwaysPullImages.
Ou lisez l’autre: L’utilisation de la dernière balise oblige toujours à tirer les images. Si vous utilisez la eval $(minikube docker-env)
comme mentionné ci-dessus, n'utilisez aucune balise ou n'attribuez une balise à votre image locale pour éviter que Kubernetes n'essaye de la tirer de force.
Pour ajouter aux réponses précédentes, si vous avez une image tarball, vous pouvez simplement la charger dans votre ensemble d'images du docker local docker image load -i /path/image.tar
.Veuillez penser à l'exécuter aprèseval $(minikube docker-env)
, car minikube ne partage pas les images avec le moteur de docker installé localement.
Si quelqu'un souhaite revenir à l'environnement local après avoir défini minikube env, utilisez la commande suivante.
eval $(docker-machine env -u)
Ajout à la réponse de @Farhad sur la base de cette réponse ,
Ce sont les étapes pour configurer un registre local.
Installation sur la machine locale
Configurez le nom d’hôte sur la machine locale: modifiez /etc/hosts
pour ajouter cette ligne.
docker.local 127.0.0.1
Maintenant, démarrez un registre local (supprimez -d pour exécuter le mode non-démon):
docker run -d -p 5000:5000 --restart=always --name registry registry:2
Maintenant, marquez correctement votre image:
docker tag ubuntu docker.local:5000/ubuntu
Poussez maintenant votre image dans le registre local:
docker Push docker.local:5000/ubuntu
Vérifiez que l'image est poussée:
curl -X GET http://docker.local:5000/v2/ubuntu/tags/list
Installation dans minikube
ssh en minikube avec: minukube ssh
edit /etc/hosts
pour ajouter cette ligne
docker.local <your Host machine's ip>
Vérifier l'accès:
curl -X GET http://docker.local:5000/v2/ubuntu/tags/list
Maintenant, si vous essayez de tirer, vous risquez d'obtenir une erreur d'accès http.
Activer l'accès non sécurisé :
Si vous envisagez toujours d'utiliser minkube avec cette configuration locale, créez un minikube pour utiliser le registre non sécurisé par défaut (ne fonctionnera pas sur un cluster existant).
minikube start --insecure-registry="docker.local:5000"
sinon suivez les étapes ci-dessous:
systemctl stop docker
éditer le fichier de serice docker: obtenir le chemin de systemctl status docker
ça pourrait être :
/etc/systemd/system/docker.service.d/10-machine.conf ou /usr/lib/systemd/system/docker.service
ajoutez ce texte (remplacez 192.168.1.4 par votre adresse IP)
--insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4:5000
à cette ligne
ExecStart = démon/usr/bin/docker -H tcp: //0.0.0.0: 2376 -H unix: ///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label fournisseur = virtualbox --insecure-registry 10.0.0.0/24
systemctl daemon-reload
systemctl start docker
essayez de tirer:
docker pull docker.local:5000/ubuntu
Maintenant, changez votre fichier yaml pour utiliser le registre local.
containers: - name: ampl-Django image: dockerhub/ubuntu
à
containers: - name: ampl-Django image: docker.local:5000/nymbleup
N'utilisez pas http en production, faites l'effort de sécuriser les choses.