Извлеките локальный образ для запуска модуля в Kubernetes

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:

Чтобы использовать изображение, не загружая его, вы можете выполнить следующие действия: Важно, чтобы вы находились в той же оболочке, поскольку вы устанавливаете переменные среды!

  1. Задайте переменные среды с помощью eval $(minikube docker-env)
  2. Создайте образ (например, docker build -t my-image .)
  3. Установите изображение в спецификации модуля, как тег сборки (например, my-image)
  4. Установите для 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) доступ к Интернету:

  1. Отключите брандмауэр, чтобы разрешение DNS работало внутри контейнеров Docker (требуется перезагрузка):
    systemctl disable firewalld В противном случае во время запуска minikube будет предложено следующее:
    Возможно, виртуальной машине не удается разрешить внешние записи DNS
    , к которым виртуальная машина не может получить доступ k8s.gcr.io , возможно, вам потребуется настроить прокси-сервер или установить —image-repository.

    Я потратил на это несколько дней.
  2. Извлеките IP сетевого интерфейса, созданного и используемого docker, в моем случае у меня есть docker0 имя интерфейса с IP 172.17.0.1 . Локальный небезопасный реестр будет доступен minikube на этом IP-адресе.
  3. Настройте Docker на чтение / запись из небезопасного реестра, добавив следующее в /etc/docker/daemon.json :
    {"insecure-registries" : ["172.17.0.1:5000"]}
  4. Перезапустите Docker:
    systemctl restart docker.service
  5. Запустите minikube с
    minikube start --insecure-registry="172.17.0.1:5000"
    (если он уже запущен или еще не запущен, запустите minikube delete перед запуском)
  6. Создайте, пометьте и отправьте свое приложение в локальный небезопасный реестр:
    docker build -t mydemo/demo .
    docker tag mydemo/demo 172.17.0.1:5000/myminikubedemo
    docker push 172.17.0.1:5000/myminikubedemo
  7. Теперь, когда вы создаете развертывание.в дескрипторе 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 извлекает все изображения вручную в каждом узле или запускает набор демонов для извлечения всех изображений