Как использовать локальные образы докеров с 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. Я попытался создать реестр, а затем поместить в него изображения, но это тоже не сработало. Возможно, я сделал это неправильно, но я не могу найти надлежащие инструкции для выполнения этой задачи.
Пожалуйста, предоставьте инструкции по использованию локальных образов докера в локальном экземпляре kubernetes.
ОС: 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
33 ответа
Как описано в README, вы можете повторно использовать демон Docker из Minikube с eval $(minikube docker-env)
,
Таким образом, чтобы использовать изображение, не загружая его, вы можете выполнить следующие действия:
- установить переменные среды с
eval $(minikube docker-env)
- создать образ с помощью Docker Minukube (например,
docker build -t my-image .
) - установите изображение в спецификации модуля как тег сборки (например,
my-image
) - установить
imagePullPolicy
вNever
В противном случае Kubernetes попытается загрузить изображение.
Важное примечание: вы должны бежать eval $(minikube docker-env)
на каждом терминале, который вы хотите использовать, поскольку он устанавливает только переменные среды для текущего сеанса оболочки.
Что сработало для меня, основываясь на решении @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's running
kubectl get pods
Есть одно эссе и эффективный способ отправить ваш локальный образ Docker прямо в minikube, что сэкономит время на повторное создание образов в minikube.
minikube cache add <Image name>
Подробнее здесь
Здесь упоминаются все возможные методы загрузки изображений в minikube: https://minikube.sigs.k8s.io/docs/handbook/pushing/
Этот ответ не ограничивается миникубе!
Используйте локальный реестр:
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, чтобы использовать локальный реестр.
Подумайте о подключении тома в соответствующем месте, чтобы сохранить образы в реестре.
Добавляя к ответу @Farhad на основе этого ответа,
Это шаги для настройки локального реестра.
Настройка на локальном компьютере
Установить имя хоста на локальном компьютере: изменить /etc/hosts
добавить эту строку
docker.local 127.0.0.1
Теперь запустите локальный реестр (удалите -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 в minikube с помощью: minukube ssh
редактировать /etc/hosts
добавить эту строку
docker.local <your host machine's ip>
Проверить доступ:
curl -X GET http://docker.local:5000/v2/ubuntu/tags/list
Теперь, если вы попытаетесь вытащить, вы можете получить ошибку доступа http.
Включить небезопасный доступ:
Если вы всегда планируете использовать minkube с этой локальной настройкой, создайте minikube для использования небезопасного реестра по умолчанию (не будет работать с существующим кластером).
minikube start --insecure-registry="docker.local:5000"
иначе выполните следующие шаги:
systemctl stop docker
отредактируйте файл docker serice: получите путь из 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 в продакшене, постарайтесь обеспечить безопасность.
Более новые версии minikube позволяют загружать изображение из локального экземпляра докера, запустив
minikube image rm image <imagename>:<version>
minikube image load <imagename>:<version> --daemon
команда загрузки может показывать ошибку, но изображение все равно загружается в ваш экземпляр minikube
Одна вещь, которую следует помнить относительно minikube, заключается в том, что хост minikube не совпадает с вашим локальным хостом, поэтому я понял, что для использования локальных образов для тестирования с помощью minikube вы должны сначала создать свой образ докера локально или вытащить его локально а затем добавьте его, используя приведенную ниже команду, в контекст minikube, который является ничем иным, как другим экземпляром Linux.
minikube cache add <image>:<tag>
но не забудьте установить imagePullPolicy: Never
в ваших yamls развертывания kubernetes, так как это обеспечит использование добавленных локально образов вместо попыток удаленного извлечения их из реестра.
Один из подходов состоит в том, чтобы создать изображение локально, а затем выполнить:
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)
В дополнение к принятому ответу вы также можете достичь того, чего изначально хотели (создавая развертывание с использованием 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
Дэн Лоренц
Если кто-то хочет вернуться в локальную среду после установки окружения minikube, используйте следующую команду.
eval $(docker-machine env -u)
Более простой метод, который отвечает на исходный вопрос "Как использовать локальные образы докеров с 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
Из документов Кубернеца:
https://kubernetes.io/docs/concepts/containers/images/
Политика извлечения по умолчанию - IfNotPresent, которая заставляет Kubelet пропускать вытягивание изображения, если оно уже существует. Если вы хотите всегда принудительно тянуть, вы можете выполнить одно из следующих действий:
- установите для imagePullPolicy контейнера значение Always;
- использовать: последний как тег для изображения для использования;
- включить контроллер доступа AlwaysPullImages.
Или читайте по-другому: использование тега: latest заставляет изображения всегда извлекаться. Если вы используете eval $(minikube docker-env)
как уже упоминалось выше, либо не используйте тег, либо присвойте тег локальному изображению, чтобы Kubernetes не пытался принудительно его вытянуть.
Одна из идей - сохранить образ докера локально, а затем загрузить его в minikube следующим образом:
Скажем, например, у вас уже есть образ puckel / docker-airflow.
Сохраните это изображение на локальный диск -
docker save puckel/docker-airflow > puckel_docker_airflow.tar
Теперь войдите в minikube docker env -
eval $(minikube docker-env)
Загрузите это локально сохраненное изображение -
docker load < puckel_docker_airflow.tar
Это так просто и работает как шарм.
Для пользователей Windows, как я это делаю.
Я использую рабочий стол Docker для размещения своего образа MiniKube и использую PowerShell в качестве консоли.
Сначала я создаю свой кластер MiniKube:
minikube start --bootstrapper=kubeadm --vm-driver=docker --profile "cluster1"
Например, допустим, у меня естьDockerfile
содержит:
FROM nginx
2 шага: создайте образ и загрузите его в миникуб
docker build -t mynginximage .
minikube image load mynginximage
Или 1 шаг: сборка прямо в MiniKube
minikube image build -t mynginximage .
Чтобы запустить мой образ в MiniKube
kubectl run myweb --image=mynginximage --image-pull-policy=Never
или черезmynginxpod.yaml
файл:
apiVersion: v1
kind: Pod
metadata:
name: myweb
spec:
containers:
- name: myweb
image: mynginximage
imagePullPolicy: Never
ports:
- containerPort: 80
Иkubectl apply -f .\mynginxpod.yaml
Теперь, чтобы проверить это, запустите:
kubectl get pods myweb
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 25s
Чтобы получить к нему доступ:
kubectl exec --stdin --tty myweb -- /bin/bash
Чтобы разоблачить его:
kubectl port-forward nginx 3333:80
minikube addons enable registry -p minikube
docker tag ubuntu $(minikube ip -p minikube):5000/ubuntu
docker push $(minikube ip -p minikube):5000/ubuntu
ИЛИ
minikube addons enable registry
docker tag ubuntu $(minikube ip):5000/ubuntu
docker push $(minikube ip):5000/ubuntu
Сказанного выше достаточно для целей разработки. Я делаю это на Archlinux.
Теперь есть надстройка Minikube Registry, это, наверное, самый простой способ. Вот как его использовать: https://minikube.sigs.k8s.io/docs/tasks/registry/insecure/
Обратите внимание, что у меня были проблемы с DNS, возможно, это ошибка.
Есть два простых способа загрузить локальные изображения в Minikube.
Всегда устанавливайте imagePullPolicy: Never в развертывании yaml.
Например:
spec:
containers:
- name: myapp
image: pz/demo
imagePullPolicy: Never
ports:
- containerPort: 8080
К счастью, есть две простые команды, которые помогут в этом.
- Первая — это команда загрузки изображения. Вы можете загрузить образ Docker со своего локального компьютера в кластер Minikube с помощью следующей команды.
Общий
minikube image load <IMAGE_NAME>
Пример
minikube image load pz/demo
После загрузки образа в кластер Minikube вы можете перезапустить свои поды вышеописанного развертывания и заметить, что они запускаются нормально.
- При использовании предыдущего способа вы всегда создаете образ Docker на своем локальном компьютере, а затем перемещаете его в контейнер Minikube, что опять же занимает немного времени, хотя и не так много.
Используя команду сборки образа Minikube, мы можем создать образ непосредственно внутри контейнера Minikube.
Общий
minikube image build -t <IMAGE_NAME> <PATH_TO_DOCKERFILE>
Пример
minikube image build -t pz/demo /New APP/Dockerfile
С помощью команды сборки образа minikube образ мгновенно становится доступным для Minikkube, и его не нужно явно загружать на втором этапе с помощью команды загрузки образа minikube.
Используя один из обоих методов, чтобы получить образ Docker нашего приложения в Minikube и перезапустить модули, мы можем перепроверить журналы развертывания:
Кроме того, чтобы убедиться, что все работает должным образом, мы можем перенаправить наш локальный порт 8080 на 8080 развертывания, используя:
kubectl port-forward deployment/myapp 8080:8080
Перепроверив браузер, мы видим, что локально собранное приложение отлично работает в кластере Minikube.
Ссылка: https://levelup.gitconnected.com/two-easy-ways-to-use-local-docker-images-in-minikube-cd4dcb1a5379
Вы должны знать, что докер на вашей локальной машине отделен от докера в вашем кластере .
Таким образом, вы должны загрузить/скопировать образ Docker с вашего локального компьютера в кластер minikube :
minikube image load <IMAGE_NAME>
или альтернативно при работе сminikube
, вы можете создавать образы прямо внутри него:
#instead of:
docker image build -t <IMAGE_NAME> .
#do:
minikube image build -t <IMAGE_NAME> .
Чтобы добавить к предыдущим ответам, если у вас есть tarball-изображение, вы можете просто загрузить его в свой локальный докер-набор изображений docker image load -i /path/image.tar
. Пожалуйста, не забудьте запустить его после eval $(minikube docker-env)
, поскольку minikube не делится изображениями с локально установленным механизмом докера.
Для minikube на Docker:
Вариант 1. Использование реестра minikube
- Проверьте свои порты minikube
docker ps
Вы увидите что-то вроде:
127.0.0.1:32769->5000/tcp
Это означает, что ваш реестр minikube находится на порту 32769 для внешнего использования, а внутри - на порту 5000.
Создайте свой образ докера, пометив его:
docker build -t 127.0.0.1:32769/hello .
Перенесите образ в реестр minikube:
docker push 127.0.0.1:32769/hello
Проверьте, есть ли оно:
curl http://localhost:32769/v2/_catalog
Создайте развертывание с использованием внутреннего порта:
kubectl create deployment hello --image=127.0.0.1:5000/hello
Ваше изображение сейчас находится в контейнере minikube, чтобы увидеть его, напишите:
eval $(minikube -p <PROFILE> docker-env)
docker images
предостережение: если используется только один профиль с именем "minikube", то раздел "-p " является избыточным, но если используется больше, не забывайте об этом; Лично я стандартную (миникубе) удаляю, чтобы не ошибаться.
Вариант 2: не использовать реестр
- Переключиться на контейнер minikube Docker:
eval $(minikube -p <PROFILE> docker-env)
- Создайте свой образ:
docker build -t hello .
- Создайте развертывание:
kubectl create deployment hello --image=hello
В конце измените развертывание ImagePullPolicy с Always на IfNotPresent:
kubectl edit deployment hello
В дополнение к
minikube image load <image name>
, ознакомьтесь с последней версией Minikube (ноябрь 2021 года на момент написания).
Добавлять
--no-kubernetes
флаг для запуска minikube без Kubernetes
См. PR 12848, для
Это дает вам:
mk start --no-kubernetes
minikube v1.24.0-beta.0 on Darwin 11.6 (arm64)
Automatically selected the docker driver
Starting minikube without Kubernetes minikube in cluster minikube
Pulling base image ...
Creating docker container (CPUs=2, Memory=1988MB) ...
Done! minikube is ready without Kubernetes!
Что попробовать без Kubernetes
- "
minikube ssh
"по SSH в узел миникуба.- "
minikube docker-env
"создавать изображения, указывая на докер внутри minikube- "
minikube image
"создавать образы без докера
Другие ответы предполагают, что вы используете minikube с виртуальной машиной, поэтому ваши локальные образы недоступны из виртуальной машины minikube.
Если вы используете minikube с --vm-driver=none
, вы можете легко повторно использовать локальные изображения, установив image_pull_policy
никогда:
kubectl run hello-foo --image=foo --image-pull-policy=Never
или установка imagePullPolicy
поле для котейнеров в соответствующих .yaml
проявляет.
построение предыдущего ответа для использования
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
без аргумента будет переключаться между системой и средой докера minikube, и
dockube which
вернет, какой из них используется.
Шаги для запуска локальных образов докеров в кубернетах
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 <filename>
- настроить minikube docker-env
- снова создайте тот же образ докера (используя minikube docker-env)
- измените imagePullPolicy на Never в вашем развертывании
На самом деле, что здесь происходит, ваш Minikube не может распознать ваш демон docker, поскольку это независимый сервис. Вы должны сначала настроить среду minikube-docker, используя команду ниже, чтобы проверить
"eval $(minikube docker-env)"
Если вы запустите команду ниже, она покажет, где ваш мини-куб ищет докер.
~$ 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, иначе это не удастся.
Что , если бы вы могли просто запустить 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 в виртуальную машину, отличную от докера.
поэтому, когда пришло время установить мои диаграммы управления, я не смог заставить helm / k8s извлекать образы, которые я создал с помощью докера. вот как я пришел к этому вопросу.
так что... если вы можете жить с любой версией k8s, поставляемой с рабочим столом докера, и вы можете жить с ней, работающей в любом докере vm, тогда, возможно, это решение будет немного проще, чем некоторые другие.
отказ от ответственности: не уверен, как переключение между контейнерами Windows / Linux повлияет на что-либо.
Укороченная версия
Загрузите в репозиторий Minikube:
minikube image load imageName
Подтвердите загрузку:
minikube image ls
Альтернативное решение:
Допустим, у меня уже естьNginx
изображение локально.
docker save -o nginx.tar nginx:1.19.0-alpine
minikube ssh
docker load -i /path/to/nginx.tar
Теперь вы можете создать развертывание Kubernetes, используя локальный образ Docker.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.19.0-alpine
imagePullPolicy: IfNotPresent # Note: you can also user 'Never'
ports:
- containerPort: 80
Окончательно:
kubectl apply -f my-deployment.yml
Я нашел этот метод в ClickHouse Operator Build From Sources, и он помогает мне спасти мне жизнь!
docker save altinity/clickhouse-operator | (eval $(minikube docker-env) &&
docker load)
На миникубе 1.20,
minikube cache add imagename:tag
устарел.
Вместо этого используйте
minikube image load imagename:tag