Подтвердить что ты не робот

Как использовать локальные образы докеров с Minikube?

У меня есть несколько изображений докеров, которые я хочу использовать с 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           
4b9b3361

Ответ 1

Как описано в 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) на каждом терминале, который вы хотите использовать, поскольку он только устанавливает переменные среды для текущего сеанса оболочки.

Ответ 2

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

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)

# 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 running
kubectl get pods

Ответ 3

Этот ответ не ограничивается миникубе!

Используйте локальный реестр:

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

Теперь пометьте свое изображение правильно:

docker tag ubuntu localhost:5000/ubuntu

Обратите внимание, что localhost должен быть изменен на DNS-имя компьютера, на котором запущен контейнер реестра.

Теперь поместите ваше изображение в локальный реестр:

docker push localhost:5000/ubuntu

Вы должны быть в состоянии вытащить его обратно:

docker pull localhost:5000/ubuntu

Теперь измените ваш файл yaml, чтобы использовать локальный реестр.

Подумайте о монтировании тома в соответствующем месте, чтобы сохранить образы в реестре.

Обновить:

как сказал Эли, вам нужно добавить локальный реестр как небезопасный, чтобы использовать http (может не применяться при использовании localhost, но применяется при использовании локального имени хоста)

Не используйте http в производстве, приложите усилия для обеспечения безопасности.

Ответ 4

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

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

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

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

kubectl run --image=<container> --generator=run-pod/v1

Дэн Лоренц

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

Ответ 5

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

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)

Ответ 6

Из кубернетов docs:

https://kubernetes.io/docs/concepts/containers/images/#updating-images

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

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

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

Ответ 7

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

Ответ 8

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

eval $(docker-machine env -u)

Ответ 9

Добавление к @Farhad ответу на основе этого ответа,

Это шаги для настройки локального реестра.

Настройка на локальном компьютере

Настройте имя хоста на локальном компьютере: отредактируйте /etc/hosts, чтобы добавить эту строку

docker.local 127.0.0.1

Теперь запустите локальный реестр (удалите -d, чтобы запустить не -d режим демона):

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

Теперь пометьте свое изображение правильно:

docker tag ubuntu docker.local:5000/ubuntu

Теперь отправьте изображение в локальный реестр:

docker push docker.local:5000/ubuntu

Убедитесь, что изображение выдвинуто:

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

Настройка в миникубе

ssh в миникуб с: minukube ssh

отредактируйте /etc/hosts, чтобы добавить эту строку

docker.local <your host machine ip>

Подтвердить доступ:

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

Теперь, если вы попытаетесь вытащить, у вас может появиться ошибка доступа http.

Включить небезопасный доступ:

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

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

еще выполните следующие шаги:

systemctl stop docker

отредактируйте файл обслуживания докера: получите путь от systemctl status docker

это может быть:

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

добавить этот текст (замените 192.168.1.4 на ваш ip)

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

на эту линию

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

попробуйте потянуть:

docker pull docker.local:5000/ubuntu

Теперь измените свой файл yaml на использование локального реестра.

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

на

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

Не используйте http в производстве, приложите усилия для обеспечения безопасности.