У меня есть несколько образов докеров, которые я хочу использовать с minikube. Я не хочу сначала загружать, а затем загружать одно и то же изображение вместо того, чтобы напрямую использовать локальное изображение. Как мне это сделать?

Что я пробовал:
1. Я пробовал запускать эти команды (по отдельности, удаляя экземпляры minikube оба раза и начиная с нуля)

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never

Вывод:

NAME                    READY     STATUS              RESTARTS   AGE
hdfs-2425930030-q0sdl   0/1       ContainerCreating   0          10m

Он просто застревает в каком-то состоянии, но никогда не достигает состояния готовности.


2. Я попытался создать реестр, а затем поместить в него изображения, но это тоже не сработало. Возможно, я сделал это неправильно, но я не могу найти подходящих инструкций для выполнения этой задачи.

Пожалуйста, предоставьте инструкции по использованию локальных образов докеров в локальном экземпляре кубернетов.
ОС: ubuntu 16.04
Докер: Докер версии 1.13.1, сборка 092cba3
Кубернетес:

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.1", Compiler:"gc", Platform:"linux/amd64"}

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

Изменить:

Изображения загружены в eval $ (minikube docker-env:

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
fluxcapacitor/jupyterhub                              latest              e5175fb26522        4 weeks ago         9.59 GB
fluxcapacitor/zeppelin                                latest              fe4bc823e57d        4 weeks ago         4.12 GB
fluxcapacitor/prediction-pmml                         latest              cae5b2d9835b        4 weeks ago         973 MB
fluxcapacitor/scheduler-airflow                       latest              95adfd56f656        4 weeks ago         8.89 GB
fluxcapacitor/loadtest                                latest              6a777ab6167c        5 weeks ago         899 MB
fluxcapacitor/hdfs                                    latest              00fa0ed0064b        6 weeks ago         1.16 GB
fluxcapacitor/sql-mysql                               latest              804137671a8c        7 weeks ago         679 MB
fluxcapacitor/metastore-1.2.1                         latest              ea7ce8c5048f        7 weeks ago         1.35 GB
fluxcapacitor/cassandra                               latest              3cb5ff117283        7 weeks ago         953 MB
fluxcapacitor/apachespark-worker-2.0.1                latest              14ee3e4e337c        7 weeks ago         3.74 GB
fluxcapacitor/apachespark-master-2.0.1                latest              fe60b42d54e5        7 weeks ago         3.72 GB
fluxcapacitor/package-java-openjdk-1.8                latest              1db08965289d        7 weeks ago         841 MB
gcr.io/google_containers/kubernetes-dashboard-amd64   v1.5.1              1180413103fd        7 weeks ago         104 MB
fluxcapacitor/stream-kafka-0.10                       latest              f67750239f4d        2 months ago        1.14 GB
fluxcapacitor/pipeline                                latest              f6afd6c5745b        2 months ago        11.2 GB
gcr.io/google-containers/kube-addon-manager           v6.1                59e1315aa5ff        3 months ago        59.4 MB
gcr.io/google_containers/kubedns-amd64                1.9                 26cf1ed9b144        3 months ago        47 MB
gcr.io/google_containers/kube-dnsmasq-amd64           1.4                 3ec65756a89b        5 months ago        5.13 MB
gcr.io/google_containers/exechealthz-amd64            1.2                 93a43bfb39bf        5 months ago        8.37 MB
gcr.io/google_containers/pause-amd64           

Ответы (26)

Как описано в README, вы можете повторно использовать демон Docker из Minikube с помощью eval $ (minikube docker-env).

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

  1. Установите переменные среды с помощью eval $ (minikube docker-env)
  2. Создайте образ с помощью демона Docker из Minikube (например, docker build -t my-image.)
  3. Установите изображение в спецификации модуля как тег сборки (например, my-image)
  4. Установите imagePullPolicy на Never, иначе Kubernetes попытается загрузить образ.

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

Notes:

  • This Answer isnt limited to minikube!

  • If wanting to create the registry on minikube's Docker then run eval $(minikube docker-env) first (to make docker available on the host machine's terminal).
    Otherwise enter in the virtual machine via minikube ssh, and then proceed with the following steps

  • depending on your operative system, minikube will automatically mount your homepath onto the VM.

  • as Eli stated, you'll need to add the local registry as insecure in order to use http (may not apply when using localhost but does apply if using the local hostname)
    Don't use http in production, make the effort for securing things up.


Use a local registry:

docker run -d -p 5000:5000 --restart=always --name local-registry registry:2

Now tag your image properly:

docker tag ubuntu localhost:5000/ubuntu

Note that localhost should be changed to dns name of the machine running registry container.

Now push your image to local registry:

docker push localhost:5000/ubuntu

You should be able to pull it back:

docker pull localhost:5000/ubuntu

Now change your yaml file to use the local registry.

Think about mounting volumes at appropriate location, to persist the images on the registry.

Один из подходов - создать образ локально, а затем выполнить:

docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)

minikube docker-env может не возвращать правильную информацию, запущенную под другим пользователем / sudo. Вместо этого вы можете запустить sudo -u yourUsername minikube docker-env.

Он должен вернуть что-то вроде:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/chris/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)

Adding to to @Farhad 's answer based on this answer,

This are the steps to setup a local registry.

Setup in local machine

Setup hostname in local machine: edit /etc/hosts to add this line

docker.local 127.0.0.1

Now start a local registry (remove -d to run non-daemon mode) :

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Now tag your image properly:

docker tag ubuntu docker.local:5000/ubuntu

Now push your image to local registry:

docker push docker.local:5000/ubuntu

Verify that image is pushed:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Setup in minikube

ssh into minikube with: minukube ssh

edit /etc/hosts to add this line

docker.local 

Verify access:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Now if you try to pull, yo might get an http access error.

Enable insecure access:

If you are always planning to use minkube with this local setup then create a minikube to use insecure registry by default (wont work on existing cluster).

minikube start --insecure-registry="docker.local:5000"

else follow below steps:

systemctl stop docker

edit the docker serice file: get path from systemctl status docker

it might be :

/etc/systemd/system/docker.service.d/10-machine.conf or /usr/lib/systemd/system/docker.service

append this text (replace 192.168.1.4 with your ip)

--insecure-registry docker.local:5000 --insecure-registry 192.168.1.4:5000

to this line

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

systemctl daemon-reload
systemctl start docker

try pulling:

docker pull docker.local:5000/ubuntu

Now change your yaml file to use local registry.

  containers:
    - name: ampl-django
      image: dockerhub/ubuntu

to

  containers:
    - name: ampl-django
      image: docker.local:5000/nymbleup

Don't use http in production, make the effort for securing things up.

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

В случае, если вы используете minikube с - vm-driver = none, вы можете легко повторно использовать локальные изображения, установив для image_pull_policy значение Never:

kubectl run hello-foo --image=foo --image-pull-policy=Never

или установка поля imagePullPolicy для котейнеров в соответствующих манифестах .yaml.

вы можете повторно использовать оболочку докера с помощью eval $ (minikube docker-env), в качестве альтернативы вы можете использовать docker save | загрузка докеров через оболочки.

Одна из идей - сохранить образ докера локально, а затем загрузить его в minikube следующим образом:

Допустим, у вас уже есть образ puckel / docker-airflow.

  1. Сохранить образ на локальный диск -

    docker save puckel / docker-airflow> puckel_docker_airflow.tar

  2. Теперь войдите в env докеров minikube -

    eval $ (minikube docker-env)

  3. Загрузить это локально сохраненное изображение -

    загрузка докера

Это так просто и работает как шарм.

шаги для запуска локальных образов докеров в кубернетах
1. eval $ (minikube -p minikube docker-env)
2. в файле артефакта в разделе спецификации -> контейнеры
добавить imagePullPolicy: IfNotPresent
или imagePullPolicy: Never

apiVersion: "v1"
kind: Pod
metadata:
    name: web
    labels:
        name: web
        app: demo
spec:
    containers:
        - name: web
          image: web:latest
          imagePullPolicy: IfNotPresent
          ports:
              - containerPort: 5000
                name: http
                protocol: TCP


3. затем запустите kubectl create -f

• 100001 вытащите его локально, а затем добавьте его с помощью приведенной ниже команды в контекст minikube, который является ничем иным, как другим экземпляром Linux.

 minikube cache add :

пока что не забудьте установить imagePullPolicy: Never в yamls развертывания kubernetes, так как это обеспечит использование локально добавленных образов вместо попыток удаленного извлечения их из реестра.

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

Для minikube на Docker:

Вариант 1: Использование реестра minikube

  1. Проверьте свои порты minikube докер пс

Вы увидите что-то вроде: 127.0.0.1: 32769-> 5000 / tcp Это означает, что ваш реестр minikube находится на порту 32769 для внешнего использования, а внутри - на порту 5000.

  1. Создайте свой образ докера, пометив его: сборка докера -t 127.0.0.1:32769/hello.

  2. Перенести образ в реестр minikube: docker push 127.0.0.1:32769/hello

  3. Проверить есть ли: curl http://localhost: 32769 / v2 / _catalog

  4. Создайте развертывание с использованием внутреннего порта: kubectl create deployment hello --image = 127.0.0.1: 5000 / hello

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

eval $(minikube -p  docker-env)
docker images

предостережение: если используется только один профиль с именем «minikube», то раздел «-p» является избыточным, но если используется больше, не забывайте об этом; Лично я стандартную (миникубе) удаляю, чтобы не ошибаться.

Вариант 2: Без использования реестра

  1. Перейти на Docker контейнера minikube: eval $ (minikube -p <ПРОФИЛЬ> docker-env)
  2. Создайте свой образ: сборка докеров -t привет.
  3. Создайте какое-нибудь развертывание: kubectl create deployment hello --image = hello

В конце измените развертывание ImagePullPolicy с Always на IfNotPresent:

привет при развертывании редактирования kubectl

на основе предыдущего ответа на использование eval $ (minikube docker-env) для загрузки среды докеров minikube, для упрощения переключения добавьте следующую функцию в rc-файл вашей оболочки:

dockube() {
  if [[ $1 = 'which' ]]; then
    if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
      echo $MINIKUBE_ACTIVE_DOCKERD
    else
      echo 'system'
    fi
    return
  fi

  if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
    eval $(minikube docker-env -u)
    echo "now using system docker"
  else
    eval $(minikube -p minikube docker-env)
    echo "now using minikube docker"
  fi
}

dockube без аргументов будет переключаться между системой и средой docker minikube, а dockube, который вернет, какой из них используется.

Что у меня сработало, на основе решения @svenwltr:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)             # unix shells
minikube docker-env | Invoke-Expression # PowerShell

# Build image
docker build -t foo:0.0.1 .

# Run in minikube
kubectl run hello-foo --image=foo:0.0.1 --image-pull-policy=Never

# Check that it's running
kubectl get pods

я нашел этот метод из Оператор ClickHouse Сборка из исходников И это помогает и спасает мне жизнь!

docker save altinity/clickhouse-operator | (eval $(minikube docker-env) && 
docker load)

Чтобы добавить к предыдущим ответам, если у вас есть образ tarball, вы можете просто загрузить его в локальный набор изображений докера загрузка образа докера -i /path/image.tar. Пожалуйста, не забудьте запустите его после eval $ (minikube docker-env), поскольку minikube не передает образы локально установленному движку докеров.

Сейчас есть аддон Minikube Registry, это, наверное, самый простой способ. Вот как это использовать: https://minikube.sigs.k8s.io/docs/tasks/registry/insecure/

Обратите внимание, что у меня были проблемы с DNS, возможно, это ошибка.

В minikube 1.20, кеш minikube add imagename: tag устарел.

Вместо этого используйте minikube image load imagename: tag

Более простой метод, который отвечает на исходный вопрос «Как использовать локальные образы докеров с Minikube?» - сохранить образ в tar-файл и загрузить его в minikube:

# export the docker image to a tar file
docker save --output my-image.tar the.full.path.to/the/docker/image:the-tag
# set local environment variables so that docker commands go to the docker in minikube
eval $(minikube docker-env)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i
# import the docker image from the tar file into minikube
docker load --input my-image.tar
# cleanup - put docker back to normal
eval $(minikube docker-env -u)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env -u') DO @%i

Затем для запуска образа используется следующая команда. Обязательно укажите параметр --image-pull-policy = Never.

kubectl run my-image --image=the.full.path.to/the/docker/image:the-tag --image-pull-policy=Never --port=80

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

 minikube image rm image :  
 minikube image load : --daemon

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

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

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1 

Информацию о генераторе я нашел на форуме Kubernetes-dev:

Если вы используете kubectl run, он генерирует для вас манифест, для которого imagePullPolicy установлено значение Always по умолчанию. Вы можете использовать эту команду, чтобы получить imagePullPolicy of IfNotPresent, который будет работать для minikube:

kubectl run --image = --generator = run-pod / v1

Дэн Лоренк

https://groups.google.com/forum/#! Topic / kubernetes-dev / YfvWuFr_XOM

Из документации kubernetes:

https://kubernetes.io/docs/concepts/containers/images/#updating-изображения

Политика извлечения по умолчанию - IfNotPresent, которая заставляет Kubelet пропускать извлечение изображения, если оно уже существует. Если вы хотите всегда принудительно тянуть, вы можете выполнить одно из следующих действий:

  • установите для imagePullPolicy контейнера значение Always;
  • используйте: latest в качестве тега для изображения;
  • включить контроллер допуска AlwaysPullImages.

Или читайте иначе: использование тега: latest заставляет всегда извлекать изображения. Если вы используете eval $ (minikube docker-env), как упоминалось выше, то либо не используйте какой-либо тег, либо назначьте тег своему локальному образу, вы можете избежать попыток Kubernetes принудительно вытащить его.

minikube addons enable registry -p minikube

💡 Аддон реестра с докером использует 32769, пожалуйста, используйте это вместо по умолчанию 5000
📘 Для получения дополнительной информации см .: https://minikube.sigs.k8s.io/docs/drivers/docker

docker tag ubuntu $(minikube ip -p minikube):32769/ubuntu
docker push $(minikube ip -p minikube):32769/ubuntu

ИЛИ

minikube addons enable registry
docker tag ubuntu $(minikube ip):32769/ubuntu
docker push $(minikube ip):32769/ubuntu

Вышеупомянутого достаточно для целей разработки. Я делаю это на Archlinux.

Есть один эссе и эффективный способ отправить ваш локальный образ Docker прямо в minikube, что сэкономит время на повторное создание образов в minikube.

minikube image load 

(minikube cache add - старый устаревший способ, для справки)

Подробнее здесь

Здесь упоминаются все возможные способы загрузки изображений в minikube: https://minikube.sigs.k8s.io/docs/handbook/pushing/

  1. настройка minikube docker-env
  2. снова создайте тот же образ докера (используя minikube docker-env)
  3. измените imagePullPolicy на Never в вашем развертывании

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

 "eval $(minikube docker-env)"

Если вы запустите команду ниже, она покажет, где ваш minikube ищет докер.

~$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.37.192:2376"
export DOCKER_CERT_PATH="/home/ubuntu/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

**# To point your shell to minikube's docker-daemon, run:**
# eval $(minikube -p minikube docker-env)

Вам придется снова создавать образы после установки minikube docker-env, иначе это не удастся.

В дополнение к загрузка изображения minikube <имя изображения>, ознакомьтесь с последним (ноябрь 2021 года на момент написания) выпуском Minikube.

v1.24.0

Добавить флаг - no-kubernetes для запуска minikube без Kubernetes
См. PR 12848,

Это дает вам:

mk start --no-kubernetes
minikube v1.24.0-beta.0 на Darwin 11.6 (arm64)
Автоматически выбирается драйвер докера
Запуск minikube без Kubernetes minikube в кластере minikube
Получение базового образа ...
Создание контейнера докеров (ЦП = 2, память = 1988 МБ) ...
Сделанный! minikube готов без Kubernetes!

Что попробовать без Kubernetes

  • "minikube ssh" в SSH в узел minikube.
  • "minikube docker-env" для создания образов, указав на докер внутри minikube
  • "minikube image" для создания образов без докера

Если кто-то хочет вернуться в локальную среду после установки env minikube, используйте следующую команду.

eval $(docker-machine env -u)

что, если бы вы могли просто запустить k8s в виртуальной машине докера? для этого есть встроенная поддержка с более поздними версиями рабочего стола Docker ... вам просто нужно включить эту поддержку.

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now-kubernetes/

как я это узнал:

при чтении документации для helm они дают вам краткое руководство по установке minikube. этот учебник устанавливает minikube в виртуальную машину, отличную от docker.

поэтому, когда пришло время устанавливать мои диаграммы управления, я не мог заставить helm / k8s извлекать образы, которые я создал с помощью докера. вот как я пришел к этому вопросу.

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

отказ от ответственности: не уверен, как переключение между контейнерами windows / linux на что-нибудь повлияет.

2022 WebDevInsider