¿Cómo puedo usar imágenes locales de Docker con Minikube?
Tengo varias imágenes de Docker que quiero usar con Minikube . No quiero tener que cargar primero y luego descargar la misma imagen en lugar de usar la imagen local directamente. ¿Cómo hago esto?
Cosas que probé:
1. Intenté ejecutar estos comandos (por separado, eliminando las instancias de Minikube ambas veces y comenzando de nuevo)
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never
Producción:
NAME READY STATUS RESTARTS AGE
hdfs-2425930030-q0sdl 0/1 ContainerCreating 0 10m
Simplemente se queda atascado en algún estado pero nunca llega al estado listo.
2. Intenté crear un registro y luego poner imágenes en él, pero tampoco funcionó. Es posible que lo haya hecho incorrectamente, pero no encuentro las instrucciones adecuadas para realizar esta tarea.
Proporcione instrucciones para utilizar imágenes de Docker locales en una instancia de Kubernetes local.
SO: Ubuntu 16.04 (Xenial Xerus)
Docker: Docker versión 1.13.1, compilación 092cba3
Kubernetes:
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"}
¿Cuál es una solución que utiliza Docker-compose para hacer esto?
Imágenes cargadas en eval $(minikube docker-env)
:
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"}
¿Cuál es una solución que utiliza Docker-compose para hacer esto?
Imágenes cargadas en 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
Como describe el manual , puede reutilizar el demonio Docker de Minikube con eval $(minikube docker-env)
.
Entonces, para usar una imagen sin cargarla, puedes seguir estos pasos:
- Establezca las variables de entorno con
eval $(minikube docker-env)
- Construya la imagen con el demonio Docker de Minikube (por ejemplo,
docker build -t my-image .
) - Establezca la imagen en la especificación del pod como la etiqueta de compilación (por ejemplo,
my-image
) - Establezca el
imagePullPolicy
valor enNever
; de lo contrario, Kubernetes intentará descargar la imagen.
Nota importante: debe ejecutarlo eval $(minikube docker-env)
en cada terminal que desee utilizar, ya que solo establece las variables de entorno para la sesión de shell actual.
Lo que funcionó para mí, según la solución de 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
Existe una forma fácil y eficaz de enviar su imagen de Docker local directamente a Minikube, lo que le ahorrará tiempo al volver a crear las imágenes en Minikube.
minikube image load <image name>
( minikube cache add <image name>
—la antigua forma obsoleta, como referencia)
Más detalles están aquí .
Todos los métodos posibles para enviar imágenes a Minikube se mencionan aquí: Enviar imágenes
Notas:
¡Esta respuesta no se limita a Minikube!
Si desea crear el registro en Docker de Minikube, ejecútelo
eval $(minikube docker-env)
primero (para que estédocker
disponible en la terminal de la máquina host).
De lo contrario, ingrese a la máquina virtual a través deminikube ssh
y luego continúe con los siguientes pasosDependiendo de su sistema operativo, Minikube montará automáticamente su ruta de inicio en la VM.
como dijo Eli, deberá agregar el registro local como inseguro para poder usar http (puede que no se aplique cuando se usa localhost, pero sí se aplica si se usa el nombre de host local). No utilice http en producción. Haga el esfuerzo de asegurar las cosas.
Utilice un registro local:
docker run -d -p 5000:5000 --restart=always --name local-registry registry:2
Ahora etiqueta tu imagen correctamente:
docker tag ubuntu localhost:5000/ubuntu
Tenga en cuenta que localhost debe cambiarse por el nombre DNS de la máquina que ejecuta el contenedor de registro.
Ahora envíe su imagen al registro local:
docker push localhost:5000/ubuntu
Deberías poder retirarlo:
docker pull localhost:5000/ubuntu
Ahora cambie su archivo YAML para usar el registro local.
Piense en montar volúmenes en la ubicación adecuada para conservar las imágenes en el registro.