Kubernetes не может вытащить образ из частного хранилища образов докера

У меня проблема с kubernetes (миникуб) и вытащить изображения из локального хранилища изображений на докере. Хранилище Docker создано:

docker run --entrypoint htpasswd registry:2 -Bbn zordon examplePassword > /mnt/LINUX/auth/htpasswd

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/LINUX/dockerreg:/var/lib/registry \
  -v /mnt/LINUX/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

Затем я хочу создать простой модуль с изображением, которое было успешно загружено в локальный репозиторий:

curl localhost:5000/v2/_catalog
{"repositories":["car/configuration"]}

Я также создал секрет на кластере миникуб с:

kubectl create secret docker-registry docregkey --docker-server=localhost:5000 --docker-username=zordon --docker-password=examplePassword --docker-email=test@dock.mail

и определим простой Pod:

    apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: car/configuration:latest
    imagePullPolicy: Always
  restartPolicy: Always
  imagePullSecrets:
  - name: docregkey

к сожалению я получаю еще

Не удалось получить изображение "машина / конфигурация: последняя": ошибка rpc: code = Unknown desc = Ответ об ошибке от демона: удаленный доступ запрещен для машины / конфигурации, хранилище не существует или может потребоваться "вход в докер"

Как я могу решить эту проблему?

10 ответов

Чтобы minikube мог извлекать данные из вашего собственного локального реестра докеров, тег влияет на политику извлечения. Согласно документам изображений, политика извлеченияIfNotPresent по умолчанию, ЗА ИСКЛЮЧЕНИЕМ, если

  1. ты используешь :latest как тег для изображения, чтобы использовать
  2. ИЛИ вы опускаете тег изображения для использования.

В этих случаях политика извлечения по умолчанию будет Always, который попытается извлечь из концентратора докеров. Это приведет к тому, что minikube не сможет получить локальные изображения, у которых нет тега или "последнего" тега.

Мораль истории в том, что не стоит полагаться на значение по умолчанию, потому что оно слишком запутанно:)

Поэтому всегда явно указывайте политику извлечения:

  1. при развертывании в minikube политика pull должна бытьIfNotPresent или Never для локальных образов
  2. при развертывании в облачном хосте (например, AWS) политика извлечения должна быть такой же, как для общедоступных образов (см. ниже)
  3. политика притяжения должна быть Always для тех общедоступных изображений, которые используют такие теги, как "последний" или "стабильный" (поскольку изображение, на которое указывает тег, со временем будет меняться), и IfNotPresent для тегов, которые всегда указывают на одно и то же изображение (чтобы не получать больше, чем необходимо)

Это означает, что если вы избегаете использования таких тегов, как последняя, ​​стабильная и т. Д., Следует соблюдать только одно правило:

  1. явно установить imagePullPolicy в вашей спецификации (или в командной строке в случае запуска) на IfNotPresent, так как это всегда будет сначала искать его локально и перейти в общедоступный реестр, если он не найден локально, и это будет работать, независимо от того, развертываете ли вы его в minikube или в облаке.

Проблема в политике извлечения изображений: вы установили для thist значение Always (настройка по умолчанию), и это означает, что Docker Deamon всегда пытается извлечь образ из внешнего реестра Docker, и вместо этого вы хотите использовать локальный.

попробуй ту добавить --image-pull-policy=Never при создании развертывания

хороший урок по использованию локально созданного изображения здесь (это помогло мне):

https://kubernetes.io/docs/tutorials/hello-minikube/

Потому что Minikube - это VM, а не ваш локальный хост. Вы попробуйте этот код eval $(minikube docker-env) https://kubernetes.io/docs/getting-started-guides/minikube/

  1. Открытый терминал
  2. eval $(minikube docker-env)
  3. сборка докера.
  4. kubectl создать -f deploy.yaml

просто действителен этот терминал. если закрыли терминал, снова откройте терминал и напишите eval $(minikube docker-env)

eval $(minikube docker-env) этот код построить образ в миникубе

Та же проблема со мной заключалась в том, что когда я создаю образ с помощью локального Docker, он не добавляется в список образов minikube.

Разрешение было добавить изображение вручную:

      minikube image load image-name:tag

Я хотел выполнить однострочное решение в моем терминале. Все остальное, что я пробовал, было слишком сложным для аутентификации с помощью Minikube.

Это моя команда для входа в систему aws ecr, которую я запускаю каждый день, потому что токен истекает. Примеры ниже для Debian 9 с AWS ECR.

ракушка

kubectl create secret docker-registry aws-ecr-credentials \
--docker-server=$ECR_REGISTRY \
--docker-username=AWS \
--docker-password=$(aws ecr get-login | awk '{print $6}') \
--docker-email=$IAM_EMAIL \
--namespace=$KUBE_NAMESPACE

template.yml

spec:
  imagePullSecrets:
    - name: aws-ecr-credentials

Проблема связана с именем изображения, которое вы упоминаете в файле yaml POD.

изображение: автомобиль / конфигурация: последние

Это попытается извлечь из глобального реестра, а не из локального реестра. Измените имя образа, чтобы включить хранилище.

образ: localhost:5000/ автомобиль / конфигурация: последний

И убедитесь, что вы включили небезопасный реестр в конфигурацию демона Docker, если ваш реестр не защищен.

Когда вы запускаете Kubernetes в Docker for Desktop, ваши приложения совместно используют один и тот же реестр изображений в Docker и Kubernetes. Список всех изображений:

docker images --all

Выберите их и запустите с измененным атрибутом --image-pull-policy=Never, Например:

kubectl run ContainerName --image=myimage/server --port=8080 --image-pull-policy=Never 

По умолчанию kubelet будет пытаться извлечь каждое изображение из указанного реестра. Однако если imagePullPolicy свойство контейнера установлено в IfNotPresent или же Neverзатем используется локальное изображение (предпочтительно или исключительно, соответственно). Ссылка на сайт

Это значит, что Kubernetes извлекает образ из локального реестра, а не из удаленного облака.

Частный реестр в Миникубе

kubectl создать -f kube-registry.yaml

(Возьмите kube-registry.yaml из этого списка на github.)

и вам нужен мини-куб с переадресацией портов на локальный хост (просто время сборки образа)

kubectl port-forward --namespace kube-system \
$(kubectl get po -n kube-system | grep kube-registry-v0 | \
awk '{print $1;}') 5000:5000

После этого от хозяина curl localhost:5000 должен вернуть действительный ответ из реестра докера, работающего на миникубе

Репо: http://localhost:5000/v2/_catalog

Извлеките изображение: localhost:5000/image_name:image_tag

Ссылка: https://blog.hasura.io/sharing-a-local-registry-for-minikube-37c7240d0615

Попробуйте войти в докер на всех узлах (если это среда кластера - войдите в докер на ведущем и рабочем узле).

[ [email protected] ****]# вход в докер

Войдите в систему, используя свой идентификатор Docker, чтобы отправлять и извлекать изображения из Docker Hub. Если у вас нет Docker ID, перейдите на https://hub.docker.com , чтобы создать его. Имя пользователя Пароль:

Войти успешно!

Затем попробуйте вручную загрузить изображения на все узлы.

URL-адрес извлечения докера

Лучший способ использовать minikube с локальным реестром, который я нашел, был здесь:

Справочник по реестру Minikube

По сути, вы добавите надстройку реестра в minikube и выполните переадресацию портов и перенаправление для доступа к нему как внутри кластера kubernetes, так и с вашего хост-компьютера.

Я попробовал еще одну вещь, ссылочный реестр внутри кластера, используя:

      registry.kube-system.svc.cluster.local

Как это:

      image: registry.kube-system.svc.cluster.local/postgres:latest

Но это не сработало.

Для работы я получил IP-адрес кластера в службу реестра:

      kubectl get service --namespace kube-system

И ссылается так:

      image: 10.99.112.119/postgres:latest
Другие вопросы по тегам