(Kubernetes + Minikube) не может получить образ докера из локального реестра

У меня есть установочный докер на моей машине, а также мини-куб, в котором есть докер, так что, вероятно, у меня есть два экземпляра докера, работающих на разных виртуальных машинах.

Я создаю образ и помечаю его, затем помещаю в локальный реестр, и он успешно выдвигается, и я могу также извлечь его из реестра, а также, когда я запускаю curl для получения списка тегов, я получил результат, и вот что я сделал

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

Все вышеперечисленные шаги работают нормально, без проблем.

Моя проблема, когда я запускаю Minikube и пытаюсь получить доступ к этому изображению в локальном реестре внутри него

Поэтому, когда я запускаю следующие команды

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

на последнем шаге (пункт 4) он дал мне следующее сообщение

curl: (7) Не удалось подключиться к порту 127.0.0.1 5000: соединение отклонено

Таким образом, я могу получить доступ к реестру образов с моей машины, но не из мини-куба, что, конечно же, создает проблемы при развертывании этого образа с помощью Kubernetes на мини-кубе и сбое при развертывании из-за невозможности подключиться к http://127.0.0.1:5000/

Можете ли вы помочь мне настроить Minikube, чтобы увидеть мой локальный реестр, чтобы моя проблема была решена, тогда я могу успешно развернуть образ в Minikube, используя Kubernetes?

ОБНОВИТЬ

Я использую этот файл yaml (я назвал его ConsolePre.yaml), чтобы развернуть мой образ, используя 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

и когда я запускаю следующую команду, чтобы применить изменения

sudo kubectl apply -f /PATH_TO_YAML_FILE/ConsolePre.yaml

результат

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

и когда я запускаю опишите команду

sudo kubectl описать pod tripbru-console-1655054400-x3g87

я нашел следующее сообщение в описании результата

Ответ об ошибке от демона: {"message":"Получить https://docker.local:5000/v1/_ping: dial tcp: lookup docker.local на 10.0.2.3:53: прочитать udp 10.0.2.15:57792-\u003e10.0.2.3:53: тайм-аут ввода-вывода "}

и я настроил docker.local xxx.xxx.xx.4 в minikube /etc/hosts, поэтому я не знаю, откуда взялись 10.0.2.3:53 и 10.0.2.15:57792.

Так как я могу решить эту проблему тоже.

Спасибо:)

4 ответа

Решение

Проблема в том, что вы используете 127.0.0.1 где угодно. Это не верно.

Так что, если ваш компьютер IP 192.168.0.101. Тогда ниже работает

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

Поскольку запуск Docker отображает реестр на 127.0.0.1:5000 и 192.168.0.101:5000. Теперь на твоей машине только эта 127.0.0.1 буду работать. Теперь, когда вы используете

3- minikube ssh

Вы попадаете в машину minikube, и на ней нет реестра, работающего на 127.0.0.1:5000. Итак, ошибка. Реестр недоступен на этом компьютере с использованием IP-адреса компьютера.

Обычно я решаю эту проблему, используя имя хоста как локально, так и внутри других виртуальных машин.

Итак, на вашей машине создайте запись в /etc/hosts

docker.local 127.0.0.1

И измените свои команды на

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

А потом, когда вы используете minikube ssh, сделайте запись для docker.local в /etc/hosts

docker.local 192.168.0.101

затем curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

Edit-1

Для решения проблемы TLS необходимо остановить службу докера внутри мини-куба.

systemctl stop docker

Затем отредактируйте /etc/systemd/system/docker.service.d/10-machine.conf и изменить

ExecStart=/usr/bin/docker daemon -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

в

ExecStart=/usr/bin/docker daemon -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 - небезопасный реестр 192.168.1.4:5000

Затем перезагрузите демон и запустите службу Docker.

systemctl daemon-reload
systemctl start docker

После этого попробуй потянуть

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

И команда должна работать

Как получить доступ к процессам, запущенным на хост-машине, из контейнера Docker?

Это популярный вопрос в мире докеров. Посмотреть здесь. /questions/22894696/kak-podklyuchitsya-k-lokalnomu-uzlu-mashinyi-iz-kontejnera-docker/22894701#22894701 Есть и другие способы, например, для Docker на Mac, docker.for.mac.localhost DNS-имя будет разрешено на хост-машине

С https://docs.docker.com/docker-for-mac/networking/

У Mac есть изменяющийся IP-адрес (или его нет, если у вас нет доступа к сети). Начиная с 17.06, мы рекомендуем подключаться к специальному DNS-имени только для Mac с именем docker.for.mac.localhost, которое будет разрешать внутренний IP-адрес, используемый хостом.

Предполагая, что основной целью этого мини-куба является локальное тестирование, существует более простой способ развертывания док-контейнера (для этого даже не нужен локальный реестр докеров)

Способ 2. Направьте интерфейс командной строки Docker на демон Docker, работающий в вашем мини-кубе, а затем выполните там команду docker build.

Первое, что нужно понять, это то, что когда вы устанавливаете Docker на свой компьютер, он состоит из 2 частей: 1) Docker Cli, с которым вы можете взаимодействовать с Docker Daemon. 2) Docker Daemon. В этом методе мы указываем наш локальный docker cli на демон docker minikube и выполняем docker build,

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

цитируя соответствующие части здесь

При использовании одной виртуальной машины Kubernetes очень удобно повторно использовать встроенный в Minikube демон Docker; поскольку это означает, что вам не нужно создавать реестр докеров на хост-машине и вставлять в него образ - вы можете просто встроить тот же демон докеров, что и minikube, что ускоряет локальные эксперименты. Просто убедитесь, что вы пометили свое изображение Docker чем-то отличным от "последней" и используете этот тег, пока вы тянете изображение. В противном случае, если вы не укажете версию своего изображения, оно будет считаться: последним, с политикой извлечения изображения, равной Всегда соответственно, что может в конечном итоге привести к ErrImagePull, поскольку у вас может не быть версий вашего изображения Docker там по умолчанию Реестр докеров (обычно DockerHub) пока нет.

Чтобы иметь возможность работать с демоном docker на вашем компьютере mac/linux, используйте команду docker-env в вашей оболочке:

eval $ (minikube docker-env)

Теперь вы сможете использовать docker в командной строке на вашем компьютере mac/linux, общаясь с демоном docker внутри виртуальной машины minikube:

выполните команду docker container list: docker ps, Он должен отображать даже контейнеры, относящиеся к системе kubernetes (потому что теперь ваш клиент указывает на демон-докер, на котором работает ваш мини-куб).

Теперь создайте свой образ докера. Тогда он будет доступен в миникубе для вас.

Minikube runs inside a docker container, so you should see it as a separate machine. Now, inside this machine Kubernetes runs, NOTE it is important to understand that we have the Minikube environment and the Kubernetes environment. This is important to understand because it is not the same to connect to the local registry from Minikube than from Kubernetes (which resides on Minikube). Here the difference:enter image description here

When you create a Job / Deployment / Statefulset, the creation is done by minikube, so it does not know if there is any service that connects to our local registry in docker. Curiously, our "registry" service does work within pods, that is, once our Job / Deployment / Statefulset has been created, then you can access our "registry" service without problems.So what is the solution to all this?Minikube can easily connect to our local registry, through 192.168.49.1:5000.If you want your Jobs / Deployments / Statefulsets to be created with images from a local registry, then just add 192.168.49.1:5000 to your image and voila.enter image description here On the other hand, if you want to be able to access your local registry from within pods, you will need a service and an endpoint.

Considerations: Remember that it is very important that you allow minikube to access your local registry by:

      minikube start --insecure-registries 192.168.49.1:5000

It is rare that minikube uses another ip other than 192.168.49.1, just in case it is better to check with:

      minikube ssh 'grep host.minikube.internal / etc / hosts | cut -f1 '

This is all assuming you have a registry created in docker with port 5000 exposed.

Вы можете выполнить эту команду, чтобы указать свой интерфейс командной строки док-станции для minikube: eval $(minikube docker-env), а затем вы можете создавать свои изображения там или экспортировать их из любого места, где они есть, и импортировать.

Другие вопросы по тегам