tutorial images imagepullpolicy hub crear contenedor linux docker kubernetes docker-compose

linux - images - minikube docker ubuntu



¿Cómo usar las imágenes locales del acoplador con Minikube? (9)

Tengo varias imágenes acoplables 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 en ambas ocasiones y comenzando de nuevo)

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

Salida:

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

Simplemente se atasca en algún estado, pero nunca alcanza el estado listo.


2. Intenté crear un registro y luego poner imágenes en él, pero tampoco funcionó. Podría haberlo hecho incorrectamente, pero no puedo encontrar las instrucciones adecuadas para hacer esta tarea.

Proporcione instrucciones para usar imágenes locales de acoplador en la instancia local de kubernetes.
SO: ubuntu 16.04
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"}

Si alguien pudiera ayudarme a obtener una solución que use docker-compose para hacer esto, sería increíble. Gracias.

Editar:

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


Además de la respuesta aceptada, también puede lograr lo que deseaba originalmente (crear una implementación con el comando run ) con el siguiente comando:

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

Encontré la información sobre el generador en el foro Kubernetes-dev:

Si está utilizando kubectl run , genera un manifiesto para usted que tiene imagePullPolicy establecido en Always de forma predeterminada. Puede usar este comando para obtener una imagePullPolicy de IfNotPresent , que funcionará para minikube :

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

Dan Lorenc

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


Agregando a la respuesta de @Farhad basada en esta respuesta ,

Estos son los pasos para configurar un registro local.

Configuración en máquina local

Configure el nombre de host en la máquina local: edite /etc/hosts para agregar esta línea

docker.local 127.0.0.1

Ahora inicie un registro local (elimine -d para ejecutar el modo no demonio):

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

Ahora etiquete su imagen correctamente:

docker tag ubuntu docker.local:5000/ubuntu

Ahora empuje su imagen al registro local:

docker push docker.local:5000/ubuntu

Verifique que la imagen sea empujada:

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

Configuración en minikube

ssh en minikube con: minukube ssh

edite /etc/hosts para agregar esta línea

docker.local <your host machine''s ip>

Verificar acceso:

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

Ahora, si intenta tirar, es posible que obtenga un error de acceso http.

Habilitar acceso inseguro :

Si siempre planea usar minkube con esta configuración local, cree un minikube para usar el registro inseguro de forma predeterminada (no funcionará en el clúster existente).

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

de lo contrario, siga los pasos a continuación:

systemctl stop docker

edite el archivo docker serice: obtenga la ruta desde el systemctl status docker

puede ser :

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

agregue este texto (reemplace 192.168.1.4 con su ip)

--seguridad-registro docker.local: 5000 --seguridad-registro 192.168.1.4:5000

a esta línea

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

intenta tirar:

docker pull docker.local:5000/ubuntu

Ahora cambie su archivo yaml para usar el registro local.

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

a

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

No use http en producción, haga el esfuerzo de asegurar las cosas.


Como lo describe el archivo README , puede reutilizar el demonio Docker de Minikube con eval $(minikube docker-env) .

Entonces, para usar una imagen sin subirla, puede seguir estos pasos:

  1. Establezca las variables de entorno con eval $(minikube docker-env)
  2. Construya la imagen con el Docker daemon de Minikube (por ejemplo, docker build -t my-image . ) docker build -t my-image .
  3. Establezca la imagen en la especificación del pod como la etiqueta de compilación (por ejemplo, my-image )
  4. Establezca imagePullPolicy en Never ; de lo contrario, Kubernetes intentará descargar la imagen.

Nota importante: debe ejecutar eval $(minikube docker-env) en cada terminal que desee usar, ya que solo establece las variables de entorno para la sesión de shell actual.


De los documentos de kubernetes:

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

La política de extracción predeterminada es IfNotPresent, lo que hace que Kubelet omita extraer una imagen si ya existe. Si desea forzar siempre un tirón, puede realizar una de las siguientes acciones:

  • establezca la imagePullPolicy del contenedor en Siempre;
  • uso: último como la etiqueta para la imagen a utilizar;
  • habilite el controlador de admisión AlwaysPullImages.

O lea de la otra manera: el uso de la última etiqueta obliga a las imágenes a extraerse siempre. Si usa eval $(minikube docker-env) como se mencionó anteriormente, entonces no use ninguna etiqueta o asigne una etiqueta a su imagen local, puede evitar que Kubernetes intente tirarlo por la fuerza.


Lo que funcionó para mí, basado en la solución de @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


Para agregar a las respuestas anteriores, si tiene una imagen tarball, simplemente puede cargarla en su conjunto local de imágenes de la docker image load -i /path/image.tar . Recuerde ejecutarla después de eval $(minikube docker-env) , ya que minikube no comparte imágenes con el motor acoplable instalado localmente.


Si alguien está buscando regresar al entorno local después de configurar el minikube env, use el siguiente comando.

eval $(docker-machine env -u)


Un enfoque es construir la imagen localmente y luego hacer:

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

minikube docker-env podría no devolver la información correcta que se ejecuta bajo un usuario / sudo diferente. En su lugar, puede ejecutar sudo -u yourUsername minikube docker-env .

Debería devolver algo como:

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)


¡Esta respuesta no se limita al minikube!

Use un registro local:

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

Ahora etiquete su imagen correctamente:

docker tag ubuntu localhost:5000/ubuntu

Tenga en cuenta que localhost debe cambiarse al nombre dns de la máquina que ejecuta el contenedor de registro.

Ahora empuje su imagen al registro local:

docker push localhost:5000/ubuntu

Debería poder retirarlo:

docker pull localhost:5000/ubuntu

Ahora cambie su archivo yaml para usar el registro local.

Piense en el volumen de montaje en la ubicación adecuada para conservar las imágenes en el registro.

actualizar:

como dijo Eli, deberá agregar el registro local como inseguro para usar http (puede que no se aplique cuando se usa localhost pero se aplica si se usa el nombre de host local)

No use http en producción, haga el esfuerzo de asegurar las cosas.