docker #kubernetes #kubernetes-helm
#docker #kubernetes
Вопрос:
У меня есть следующее изображение, созданное Dockerfile:
REPOSITORY TAG IMAGE ID CREATED SIZE
ruby/lab latest f1903b1508cb 2 hours ago 729.6 MB
И у меня есть следующий файл YAML:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ruby-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: ruby
spec:
containers:
- name: ruby-app
image: ruby/lab
imagePullPolicy: IfNotPresent
ports:
- containerPort: 4567
Когда я создаю развертывание, я получил следующую информацию в модулях:
ruby-deployment-3830038651-sa4ii 0/1 ImagePullBackOff 0 7m
ruby-deployment-3830038651-u1tvc 0/1 ImagePullBackOff 0 7m
И ошибка Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found
снизу:
8m 2m 6 {kubelet minikube} spec.containers{ruby} Normal Pulling pulling image "ruby/lab:latest"
8m 2m 6 {kubelet minikube} spec.containers{ruby} Warning Failed Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found
8m 2m 6 {kubelet minikube} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "ruby" with ErrImagePull: "Error: image ruby/lab not found"
Действительно ли для этого необходимо иметь реестр в docker? Я просто хочу выполнить локальное тестирование и передать свой код / репозиторий другу для целей тестирования
Спасибо
Ответ №1:
Вы можете указать своему клиенту docker на демон docker виртуальной машины, выполнив
eval $(minikube docker-env)
Затем вы можете создать свой образ в обычном режиме и создать свои ресурсы kubernetes, используя kubectl. Убедитесь, что у вас есть
imagePullPolicy: IfNotPresent
в ваших спецификациях YAML или JSON.
Кроме того, существует флаг для передачи небезопасных реестров виртуальной машине minikube. Однако это должно быть указано при первом создании компьютера.
minikube start --insecure-registry
Вы также можете прочитать это при использовании частного реестра
http://kubernetes.io/docs/user-guide/images /
Комментарии:
1. @CPB можете ли вы отметить это как ответ, если это решит вашу проблему, пожалуйста?
2. это сработало для меня без
minikube start --insecure-registry
. Мне было неясно, куда поместить imagePullPolicy, но я узнал. Это должно быть в вашем развертывании. yaml.spec.template.containers.imagePullPolicy
3. Что, если я не использую minikube, но хочу загрузить изображение в удаленный кластер? Может ли kubectl загрузить изображение?
4. @MattRickard: я не использую minikube, я использую kubectl, kubernetes cluster, у меня нет реестра docker image. Могу ли я использовать локальный образ для развертывания?
5.
minikube start --insecure-registry true
Ответ №2:
AFAIR minikube запускается на виртуальной машине, поэтому он не будет видеть изображения, которые вы создали локально на хост-компьютере, но … как указано в https://github.com/kubernetes/minikube/blob/master/docs/reusing_the_docker_daemon.md вы можете использовать eval $(minikube docker-env)
для фактического использования демона docker, работающего на minikube, и в дальнейшем создавать свой образ в докере minikubes и, таким образом, ожидать, что он будет доступен для minikubes k8sдвижок без извлечения из внешнего реестра
Комментарии:
1. Я не использую minikube, я использую kubectl, kubernetes. Как я могу это исправить?
2. Я сделал это, но он по-прежнему не может найти локальный образ.
3. Если вы публикуете свой образ с помощью SBT, а SBT выполняется как существующий процесс-демон, который был создан в другом пространстве процессов, тогда он не унаследует среду, определенную
minikube docker-env
Ответ №3:
Чтобы использовать изображение, не загружая его, вы можете выполнить следующие действия: Важно, чтобы вы находились в той же оболочке, поскольку вы устанавливаете переменные среды!
- Задайте переменные среды с помощью eval $(minikube docker-env)
- Создайте образ (например, docker build -t my-image .)
- Установите изображение в спецификации модуля, как тег сборки (например, my-image)
- Установите для imagePullPolicy значение Never, иначе Kubernetes попытается загрузить образ.
Ответ №4:
Я столкнулся с аналогичной проблемой с minikube v1.9.2, Kubernetes v1.18.0, Docker 19.03.2 на Centos 8.1.1911. Все на одной машине, используемой для разработки, я выбрал для локального небезопасного реестра docker.
Следующие шаги были полезны для меня, чтобы поделиться локальным небезопасным реестром docker с локальной средой kubernetes / minikube и разрешить узлам kube (а также minikube) доступ к Интернету:
- Отключите брандмауэр, чтобы разрешение DNS работало внутри контейнеров Docker (требуется перезагрузка):
systemctl disable firewalld
В противном случае во время запуска minikube будет предложено следующее:
Возможно, виртуальной машине не удается разрешить внешние записи DNS
, к которым виртуальная машина не может получить доступ k8s.gcr.io , возможно, вам потребуется настроить прокси-сервер или установить —image-repository.
Я потратил на это несколько дней. - Извлеките IP сетевого интерфейса, созданного и используемого docker, в моем случае у меня есть
docker0
имя интерфейса с IP172.17.0.1
. Локальный небезопасный реестр будет доступен minikube на этом IP-адресе. - Настройте Docker на чтение / запись из небезопасного реестра, добавив следующее в
/etc/docker/daemon.json
:
{"insecure-registries" : ["172.17.0.1:5000"]}
- Перезапустите Docker:
systemctl restart docker.service
- Запустите minikube с
minikube start --insecure-registry="172.17.0.1:5000"
(если он уже запущен или еще не запущен, запуститеminikube delete
перед запуском) - Создайте, пометьте и отправьте свое приложение в локальный небезопасный реестр:
docker build -t mydemo/demo .
docker tag mydemo/demo 172.17.0.1:5000/myminikubedemo
docker push 172.17.0.1:5000/myminikubedemo
- Теперь, когда вы создаете развертывание.в дескрипторе yaml для вашего приложения укажите правильный путь к изображению, а затем примените:
kubectl create deployment mydemo --image=172.17.0.1:5000/myminikubedemo --dry-run=client -o=yaml > deployment.yaml
kubectl apply -f deployment.yaml
Ответ №5:
docker pull извлекает все изображения вручную в каждом узле или запускает набор демонов для извлечения всех изображений