web-dev-qa-db-fra.com

Comment utiliser les images du menu fixe avec Minikube?

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           
166
Kapil Gupta

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:

  1. Définissez les variables d'environnement avec eval $(minikube docker-env)
  2. Construisez l'image avec le démon Docker de Minikube (par exemple docker build -t my-image .)
  3. Définissez l'image dans la spécification du pod comme la balise de construction (par exemple my-image)
  4. Réglez le 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.

245
svenwltr

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
111
jjinking

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.

86
Farhad Farahi

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 nom imagePullPolicy est défini sur Always par défaut. Vous pouvez utiliser cette commande pour obtenir un imagePullPolicy de IfNotPresent, qui fonctionnera pour minikube:

kubectl run --image=<container> --generator=run-pod/v1

Dan Lorenc

https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM

7
chrisjones

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)
6

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.

3
Jason

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.

2
Julien Nyambal

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.

0
nithin