web-dev-qa-db-fra.com

HostPath avec minikube - Kubernetes

MISE À JOUR: je me suis connecté au minikubevm et je vois mon répertoire Host monté mais il n'y a pas de fichiers là-bas. De plus, lorsque je crée un fichier là-bas, il ne sera pas dans ma machine hôte. Tout lien existe entre eux

J'essaie de monter un répertoire Host pour développer mon application avec kubernetes.

Comme le doc l'a recommandé, j'utilise minikube pour exécuter mon cluster kubernetes sur mon PC. L'objectif est de créer un environnement de développement avec docker et kubernetes pour développer mon application. Je veux monter un répertoire local pour que mon docker lise l'application de code à partir de là. Mais ce n'est pas du travail. Toute aide serait vraiment appréciée.

mon application de test (server.js):

var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);

mon Dockerfile:

FROM node:latest
WORKDIR /code
ADD code/ /code
EXPOSE 8080
CMD server.js

ma configuration pod kubernetes: (pod-configuration.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: apiserver
spec:
  containers:
  - name: node
    image: myusername/nodetest:v1
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: api-server-code-files
      mountPath: /code
  volumes:
  - name: api-server-code-files
    hostPath:
      path: /home/<myuser>/Projects/nodetest/api-server/code

mon dossier est:

/home/<myuser>/Projects/nodetest/
- pod-configuration.yaml
- api-server/
    - Dockerfile
    - code/
        - server.js

Lorsque j'exécute mon image docker sans le volume hostPath, cela fonctionne bien sûr, mais le problème est que, à chaque changement, je dois recréer mon image qui n'est vraiment pas puissante pour le développement, c'est pourquoi j'ai besoin du volume hostPath.

Une idée ? pourquoi je n'arrive pas à monter mon répertoire local?

Merci pour l'aide.

20
Eliel Haouzi

EDIT: Il semble que la solution soit soit d'utiliser un conteneur privilégié , soit de monter manuellement votre dossier personnel pour permettre au MiniKube VM de lire à partir de votre hostPath - - https://github.com/boot2docker/boot2docker#virtualbox-guest-additions . (Nous remercions Eliel d'avoir compris cela).

Il est absolument possible de configurer un volume hostPath avec minikube - mais il y a beaucoup de bizarreries et il n'y a pas un très bon support pour ce problème particulier.

Essayez de supprimer ADD code/ /code à partir de votre Dockerfile. instruction "AJOUTER" de Docker copie le code de votre machine hôte dans le /code répertoire. C'est pourquoi la reconstruction de l'image met à jour avec succès votre code.

Lorsque Kubernetes essaie de monter le conteneur du /code répertoire vers le chemin de l'hôte, il constate que ce répertoire est déjà plein du code qui a été intégré dans l'image. Si vous retirez cela de l'étape de génération, Kubernetes devrait être capable de monter avec succès le chemin de l'hôte lors de l'exécution.

Assurez-vous également de vérifier les autorisations du code/ répertoire sur votre machine hôte.

Ma seule autre pensée est liée au montage dans le répertoire racine. J'ai rencontré des problèmes lors du montage de volumes Kubernetes hostPath vers/depuis des répertoires dans le répertoire racine (je suppose que cela était lié aux autorisations). Donc, autre chose à essayer serait un mountPath comme /var/www/html.

Voici un exemple d'un volume hostPath fonctionnel:

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  volumes:
    - name: example-volume
      hostPath:
        path: '/Users/example-user/code'
  containers:
    - name: example-container
      image: example-image
      volumeMounts:
        - mountPath: '/var/www/html'
          name: example-volume
12
springle

Ils ont maintenant donné le minikube mount qui fonctionne sur tous les environnements

https://github.com/kubernetes/minikube/blob/master/docs/Host_folder_mount.md

Essayé sur Mac:

$ minikube mount ~/stuff/out:/mnt1/out
Mounting /Users/macuser/stuff/out into /mnt1/out on the minikube VM
This daemon process needs to stay alive for the mount to still be accessible...
ufs starting

Et en pod:

apiVersion: v1
kind: Pod
metadata:
  name: myServer
spec:
  containers:
  - name: myServer
    image: myImage
    volumeMounts:
    - mountPath: /mnt1/out
      name: volume
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
  volumes:
  - name: volume
    hostPath:
      path: /mnt1/out
3
enator