web-dev-qa-db-fra.com

(Kubernetes + Minikube) ne peut pas obtenir l'image du menu fixe à partir du registre local

J'ai installé le menu fixe sur ma machine et également le minikube qui contient un menu fixe, donc j'ai probablement deux instances de menu fixe s'exécutant sur une machine virtuelle différente

Je construis une image et la marque, puis la pousse dans le registre local et la transmet avec succès. Je peux également la retirer du registre et aussi lorsque j’exécute curl pour obtenir la liste des tags que j’ai obtenu, et voici ce que j’ai fait.

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker Push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

toutes les étapes ci-dessus fonctionnent correctement, sans aucun problème.

Mon problème est quand je lance minikube et tente d'accéder à cette image dans le registre local à l'intérieur

Alors, quand je lance les prochaines commandes

1- Sudo minikube start --insecure-registry 127.0.0.1:5000
2- eval $(minikube docker-env)
3- minikube ssh
4- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

en dernière étape (point 4) il m'a donné le message suivant

curl: (7) Échec de la connexion au port 5000 127.0.0.1: connexion refusée.

Je peux donc accéder au registre des images depuis ma machine, mais pas depuis minikube, ce qui pose bien sûr des problèmes lorsque je déploie cette image à l'aide de Kubernetes sur minikube et que le déploiement a échoué car il est impossible de se connecter à http://127.0.0.1 : 5000

Pouvez-vous m'aider à configurer minikube pour qu'il visualise mon registre local afin que mon problème soit résolu, puis-je déployer l'image sur minikube avec kubernetes avec succès?

METTRE À JOUR

J'utilise ce fichier Yaml (je l'ai nommé ConsolePre.yaml) pour déployer mon image à l'aide de kubernetes.

apiVersion: v1
  kind: Service
  metadata:
    name: tripbru-console
    labels:
      app: tripbru-console
  spec:
    ports:
      - port: 9080
        targetPort: 9080
        nodePort: 30181
    selector:
      app: tripbru-console
      tier: frontend
    type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tripbru-console
  labels:
    app: tripbru-console
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: tripbru-console
        tier: frontend
    spec:
      containers:
      - image: docker.local:5000/eliza/console:0.0.1
        name: tripbru-console
        ports:
        - containerPort: 9080
          name: tripbru-console

et quand je lance la commande suivante pour appliquer les modifications

Sudo kubectl apply -f /PATH_TO_YAML_FILE/ConsolePre.yaml

le résultat est 

NAME                                      READY     STATUS         RESTARTS   AGE
po/tripbru-console-1655054400-x3g87       0/1       ErrImagePull   0          1m

et quand je lance la commande décris

Sudo kubectl décrit le pod tripbru-console-1655054400-x3g87

j'ai trouvé le message suivant dans le résultat de la description

Réponse d'erreur du démon: {"message": "Get https: //docker.local: 5000/v1/_ping : appelez tcp: lookup docker.local sur 10.0.2.3:53: lu udp 10.0.2.15:57792-\u003e10.0.2.3:53: délai d'attente i/o "}

et j’ai configuré docker.local xxx.xxx.xx.4 dans minikube/etc/hosts, donc je ne sais pas d’où proviennent 10.0.2.3:53 et 10.0.2.15:57792.

Alors, comment puis-je résoudre ce problème aussi. 

Merci :)

6
mibrahim.iti

Le problème réside dans votre idée d'utiliser 127.0.0.1 où vous voulez. C'est faux.

Donc, si votre IP de la machine est 192.168.0.101. Puis ci-dessous fonctionne

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker Push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

Parce que docker run mappe le registre à 127.0.0.1:5000 et 192.168.0.101:5000. Maintenant, sur votre machine, seul ce 127.0.0.1 fonctionnera. Maintenant, quand vous utilisez

3- minikube ssh

Vous obtenez à l'intérieur de la machine minikube et qui n'a pas de registre en cours d'exécution sur 127.0.0.1:5000. Donc l'erreur. Le registre n’est pas accessible à l’intérieur de cette machine à l’aide de l’IP de la machine.

La façon dont je résous généralement ce problème consiste à utiliser le nom d'hôte à la fois localement et à l'intérieur des autres ordinateurs virtuels.

Donc, sur votre machine, créez une entrée dans /etc/hosts

docker.local 127.0.0.1

Et changez vos commandes en

1- docker build -t docker.local:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 docker.local:5000/eliza/console:0.0.1
4- docker Push docker.local:5000/eliza/console:0.0.1
5- curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

Et lorsque vous utilisez minikube ssh, saisissez docker.local dans /etc/hosts

docker.local 192.168.0.101

Alors curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

Edit-1

Pour le problème TLS, vous devez arrêter le service de menu fixe dans minikube. 

systemctl stop docker

Puis éditez /etc/systemd/system/docker.service.d/10-machine.conf et changez

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

à

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 provider = virtualbox --insecure-registry 10.0.0.0/24 --insecure-registry docker.local: 5000 - insecure-registry 192.168.1.4:5000

Rechargez ensuite le démon et démarrez le service Docker.

systemctl daemon-reload
systemctl start docker

Après cela, essayez de tirer

docker pull docker.local:5000/eliza/console:0.0.1

Et la commande devrait fonctionner

11
Tarun Lalwani

Comment accéder aux processus s'exécutant sur hostmachine à partir d'un conteneur Docker?

C'est une question populaire au pays des dockers. Vois ici. https://stackoverflow.com/a/24326540/6785908 Il existe également d'autres moyens, par exemple, pour Docker sur mac, docker.for.mac.localhost nom DNS sera résolu en machine hôte.

De https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers

Le Mac a une adresse IP changeante (ou aucune si vous n’avez pas d’accès réseau ). À partir de 17.06, nous vous recommandons de vous connecter au nom DNS spécial réservé à Mac, docker.for.mac.localhost, qui résoudra à l'adresse IP interne utilisée par l'hôte.

En supposant que l'objectif principal de ce minikube soit d'effectuer des tests locaux, il existe un moyen plus simple de déployer votre conteneur docker (cela n'a même pas besoin d'un registre docker local).

Méthode 2: pointez votre interface de ligne de commande docker vers le démon Docker qui s'exécute dans votre minikube, puis exécutez la commande docker build à cet emplacement.

La première chose à comprendre est que, lorsque vous installez docker sur votre ordinateur, celui-ci se compose de deux parties: 1) un docker cli avec lequel vous pouvez interagir avec le docker daemon 2) un docker daemon. Dans cette méthode, nous allons pointer notre docker local cli vers le démon docker de minikube et exécuter docker build.

https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/getting-started-guides/minikube.md#reusing-the-docker-daemon

citant les parties pertinentes ici 

Lorsque vous utilisez un seul VM de Kubernetes, il est très pratique de réutiliser le fichier le démon Docker intégré de minikube; car cela signifie que vous n'avez pas à le faire construire un registre docker sur votre ordinateur hôte et pousser l'image dans ça - vous pouvez juste construire dans le même démon docker que minikube ce qui accélère les expériences locales. Assurez-vous de marquer votre Docker image avec autre chose que "dernière" et utilisez cette balise pendant que vous tirez l'image. Sinon, si vous ne spécifiez pas la version de votre fichier image, elle sera considérée comme la dernière en date, avec la stratégie d’image par défaut de Toujours en conséquence, ce qui peut éventuellement entraîner ErrImagePull comme vous peut ne pas avoir de version de votre image Docker dans le fichier Registre docker par défaut (généralement DockerHub) pour le moment.

Pour pouvoir travailler avec le démon docker sur votre hôte mac/linux, utilisez la commande docker-env dans votre shell:

eval $ (minikube docker-env)

Vous devriez maintenant pouvoir utiliser docker sur la ligne de commande de votre machine hôte mac/linux en conversant avec le démon docker situé dans la machine virtuelle minikube:

faire une commande de liste de conteneurs docker: docker ps. Il devrait afficher même les conteneurs liés au système kubernetes (car votre cli est maintenant dirigé vers un démon docker sur lequel votre minikube est en cours d'exécution).

Maintenant, construisez votre image de menu fixe. Ensuite, il sera disponible dans le minikube pour vous.

3
so-random-dude

Vous pouvez exécuter cette commande pour diriger votre CLI docker vers minikube: eval $ (minikube docker-env). Vous pourrez ensuite construire vos images à cet emplacement ou les exporter de n'importe où et les importer.

0
Lev Kuznetsov