Para facilitar el desarrollo en Docker, el código se adjunta a los contenedores a través de volúmenes. De esa forma, no hay necesidad de reconstruir las imágenes cada vez que se cambia el código.
Entonces, ¿es correcto pensar en usar la misma idea en Kubernetes?
PD: Sé que los conceptos PersistentVolume y PersistentVolumeClaim permiten adjuntar volumen, pero están destinados a datos.
Para facilitar el desarrollo, necesito usar el volumen tanto para el código como para los datos. Esto me evitará reconstruir las imágenes en cada cambio de código.
A continuación, esto es lo que estoy tratando de hacer en minikube:
El despliegue
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: php-hostpath spec: replicas: 1 template: metadata: labels: app: php-hostpath spec: containers: - name: php-hostpath image: php:7.0-apache ports: - containerPort: 80 volumeMounts: - name: vol-php-hostpath mountPath: /var/www/html volumes: - name: vol-php-hostpath hostPath: path: '/home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube/src/'el servicio
apiVersion: v1 kind: Service metadata: name: php-hostpath namespace: default labels: app: php-hostpath spec: selector: app: php-hostpath ports: - port: 80 targetPort: 80 type: "LoadBalancer"El servicio y la implementación están bien creados en minikube:
$ kubectl get pods -l app=php-hostpath NAME READY STATUS RESTARTS AGE php-hostpath-3796606162-bt94w 1/1 Running 0 19m $ kubectl get service -l app=php-hostpath NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE php-hostpath 10.0.0.110 <pending> 80:30135/TCP 27m La carpeta src y el archivo src/index.php también están bien creados.
<?php echo "This is my first docker project";Ahora quiero comprobar que todo se está ejecutando:
$ kubectl exec -ti php-hostpath-3796606162-bt94w bash root@php-hostpath-3796606162-bt94w:/var/www/html# ls root@php-hostpath-3796606162-bt94w:/var/www/html# exit exit ¡La carpeta src y el archivo index.php no están en /var/www/html !
¿Me he perdido algo?
PD: si estuviera en producción env, no pondré mi código en un volumen. Gracias,
Según este documento , el uso compartido de carpetas de host aún no está implementado en el controlador KVM. Este es el controlador que estoy usando en realidad.
Para superar esto, hay 2 soluciones:
Use el controlador de virtualbox para que pueda montar su volumen hostPath cambiando la ruta en su /home/THE_USR/... a /hosthome/THE_USR/...
Monte su volumen en la VM de minikube según el comando $ minikube mount /home/THE_USR/... . El comando le devolverá la ruta de su volumen montado en la máquina virtual minikube. Se da ejemplo.
(a) montar un volumen en la máquina virtual minikube
el minikube mount devolvió esa ruta /mount-9p
$ minikube mount -v 3 /home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube Mounting /home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube into /mount-9p on the minikubeVM This daemon process needs to stay alive for the mount to still be accessible... 2017/03/31 06:42:27 connected 2017/03/31 06:42:27 >>> 192.168.42.241:34012 Tversion tag 65535 msize 8192 version '9P2000.L' 2017/03/31 06:42:27 <<< 192.168.42.241:34012 Rversion tag 65535 msize 8192 version '9P2000'(b) Especificación de la ruta en el despliegue
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: php-hostpath spec: replicas: 1 template: metadata: labels: app: php-hostpath spec: containers: - name: php-hostpath image: php:7.0-apache ports: - containerPort: 80 volumeMounts: - name: vol-php-hostpath mountPath: /var/www/html volumes: - name: vol-php-hostpath hostPath: path: /mount-9p(c) Comprobar si el montaje del volumen funcionó bien
amine@amine-Inspiron-N5110:~/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube$ kubectl exec -ti php-hostpath-3498998593-6mxsn bash root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo "This is my first docker project"; root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo 'This is my first hostPath on kubernetes'; root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo 'This is my first hostPath on kubernetes'; root@php-hostpath-3498998593-6mxsn:/var/www/html#PD: este tipo de montaje de volumen es solo un entorno de desarrollo. Si estuviera en entorno de producción, el código no se montará: estará en la imagen.
PD: recomiendo el virtualbox en lugar de KVM.
Espero que ayude a otros.
Hay hostPath que le permite vincular el montaje de un directorio en el nodo en un contenedor.
En un clúster de varios nodos, querrá restringir su módulo de desarrollo a un nodo en particular con nodeSelector (use la etiqueta kubernetes.io/hostname: mydevhost ).
Con minikube , mire la sección Carpetas de host montadas.
En mi honesta opinión, puedes hacerlo, pero no deberías. Una de las características de usar contenedores es que puedes tener artefactos (contenedores) con siempre el mismo comportamiento. Una nueva versión de su código debería generar un nuevo contenedor. De esta manera, puede estar seguro, al realizar pruebas, de que cualquier problema nuevo detectado estará directamente relacionado con el nuevo código.
Un enfoque híbrido (que tampoco me gusta pero creo que es mejor) es crear una ventana acoplable que descargue su código (seleccionando la versión correcta con envs) y lo ejecute.
Usar hostPaths no es una mala idea, pero puede ser un desastre si tiene un clúster no tan pequeño. Por supuesto, puede usar PV, después de todo, su código son datos. Puede usar un sistema de archivos de almacenamiento distribuido como NFS para hacerlo.