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
по умолчанию, ЗА ИСКЛЮЧЕНИЕМ, если
- ты используешь
:latest
как тег для изображения, чтобы использовать - ИЛИ вы опускаете тег изображения для использования.
В этих случаях политика извлечения по умолчанию будет Always
, который попытается извлечь из концентратора докеров. Это приведет к тому, что minikube не сможет получить локальные изображения, у которых нет тега или "последнего" тега.
Мораль истории в том, что не стоит полагаться на значение по умолчанию, потому что оно слишком запутанно:)
Поэтому всегда явно указывайте политику извлечения:
- при развертывании в minikube политика pull должна быть
IfNotPresent
илиNever
для локальных образов - при развертывании в облачном хосте (например, AWS) политика извлечения должна быть такой же, как для общедоступных образов (см. ниже)
- политика притяжения должна быть
Always
для тех общедоступных изображений, которые используют такие теги, как "последний" или "стабильный" (поскольку изображение, на которое указывает тег, со временем будет меняться), иIfNotPresent
для тегов, которые всегда указывают на одно и то же изображение (чтобы не получать больше, чем необходимо)
Это означает, что если вы избегаете использования таких тегов, как последняя, стабильная и т. Д., Следует соблюдать только одно правило:
- явно установить
imagePullPolicy
в вашей спецификации (или в командной строке в случае запуска) наIfNotPresent
, так как это всегда будет сначала искать его локально и перейти в общедоступный реестр, если он не найден локально, и это будет работать, независимо от того, развертываете ли вы его в minikube или в облаке.
Проблема в политике извлечения изображений: вы установили для thist значение Always (настройка по умолчанию), и это означает, что Docker Deamon всегда пытается извлечь образ из внешнего реестра Docker, и вместо этого вы хотите использовать локальный.
попробуй ту добавить --image-pull-policy=Never
при создании развертывания
хороший урок по использованию локально созданного изображения здесь (это помогло мне):
Потому что Minikube - это VM, а не ваш локальный хост. Вы попробуйте этот код eval $(minikube docker-env)
https://kubernetes.io/docs/getting-started-guides/minikube/
- Открытый терминал
eval $(minikube docker-env)
- сборка докера.
- 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