2017-10-21 51 views
1

J'essaie de faire fonctionner mon application sur minikube, accessible à l'adresse ip minikube. Voici les commandes que j'utilise pour le faire fonctionner. Tout fonctionne comme je le veux (si j'essaie de me connecter, il renvoie le 401 attendu puisque le mongo DB est vide).Comment inclure des données avec l'image mongo dans les kubernetes

Je voudrais réellement inclure une base de données dans mon application avec, disons, un utilisateur existant. Je ne peux pas trouver une façon claire d'inclure des données (disons dans un fichier tar qui fonctionne avec mongo) avec ce que je fais. Comment puis-je accomplir cela?

### Get mongo up 
docker pull mongo:3.2 
kubectl run mongo --image=mongo:3.2 --port=27017 
kubectl expose deployment mongo 

### Get API up 
cd /api 
docker build -t api:v1 . 
kubectl run api --image=api:v1 --port=3000 --env="MONGODB_URI=mongodb://mongo:27017/myapp-dev" 
kubectl apply -f api-deployment.yml 
kubectl expose deployment api --type=LoadBalancer 

### Get dashboard up 
docker build -t myapp-dashboard:v1 . 
kubectl apply -f ./tooling/minikube/myapp-dashboard-qa-config-map.yml 
kubectl apply -f ./tooling/minikube/myapp-dashboard-deployment.yml 
kubectl expose deployment myapp-dashboard --type=LoadBalancer 

### Ingress setup 
minikube addons enable ingress 
kubectl create -f ingress.yml 
kubectl apply -f ./tooling/minikube/ingress.yml 

Répondre

1

La bonne façon de le faire en utilisant l'infrastructure initdb dans l'image mongo. Le mongo:3.2 inclut un entrypoint shell script qui itère à travers /docker-entrypoint-initdb.d/*.{sh,js} (dans le conteneur).

Selon le type de données que vous devez insérer dans la base de données nouvellement créée à l'aide d'un ConfigMap ou d'un Secret, le volume est le chemin à parcourir. Mais vous ne pouvez pas faire cela avec kubectl run.

1. Créer une mongo.yaml comme ceci:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: mongo 
spec: 
    template: 
    metadata: 
     labels: 
     app: mongo 
    spec: 
     containers: 
     - image: mongo:3.2 
     name: mongo 
     ports: 
     - containerPort: 27017 
     volumeMounts: 
     - name: mongo-initdb 
      mountPath: /docker-entrypoint-initdb.d 
     volumes: 
     - name: mongo-initdb 
     configMap: 
      name: mongo-initdb 

2. Créer createuser.sh comme celui-ci (juste un example):

mongo <<EOF 
use reporting 
db.createUser(
    { 
    user: "reportsUser", 
    pwd: "12345678", 
    roles: [ 
     { role: "read", db: "reporting" }, 
     { role: "read", db: "products" }, 
     { role: "read", db: "sales" }, 
     { role: "readWrite", db: "accounts" } 
    ] 
    } 
) 
EOF 

3. Créer le ConfigMap:

$ kubectl create configmap mongo-initdb --from-file=createuser.sh 
configmap "mongo-initdb" created 

4. Créer le déploiement de mongo (au lieu de kubectl run mongo --image=mongo:3.2 --port=27017):

$ kubectl apply -f mongo.yaml 
deployment "mongo" created 

5. Vérifiez les journaux:

$ kubectl logs -f deploy/mongo 
[...] 
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/createuser.sh 
MongoDB shell version: 3.2.17 
[...] 
Successfully added user: { 
[...] 

Comme je l'ai mentionné une solution très similaire peut être fait en utilisant Secrets pour les données sensibles. La commande kubectl create configmap --from-file=... accepte également le nom d'un répertoire au lieu d'un fichier et fonctionnera comme prévu.

+0

Salut, merci pour la réponse! Je l'ai eu travailler avec votre exemple, mais j'essaye maintenant d'importer une base de données, et faire face à quelques problèmes. A l'intérieur du script 'createuser.sh' j'essaye de courber' myapp-db.tar.bz2' pour que je puisse le 'mongorestore', mais je le casse et les logs disent 'curl: command not found'. J'ai essayé d'ajouter des scripts 'apt-get' mais les journaux disent' Impossible d'ouvrir le fichier de verrouillage/var/lib/dpkg/lock-open (13: permission refusée) '. Comment puis-je exécuter correctement les scripts ici? Je posterai mon dossier complet shell ci-dessous: – swagrov

+0

'mongo myapp-dev --eval "db.dropDatabase()" apt-get update && apt-get install boucle && apt-get install bzip2 https papillotes://cdn.filestackcontent.com/xxxxxxxx -o myapp-db.tar.bz2 bzip2 -dc mapp-db.tar.bz2 | tar xvf - mongorestore --db myapp-dev myapp-dev mongo myapp-dev --eval 'db.users.mise à jour ({}, {$ set: {hashedPassword: "fwaPwkoIpS4y4aWA + uljXWIlyjTxUzkU + IgK4 + B8m + ZhyBrWwM/N/oGfUj0ERAcwnXCOImkOvbvDMH/BAmN8FA ==", sel: "YfnL4jUxfbYY6Y3/w8P8KA =="}}, {multi: true}) ' mongo myapp-dev --eval' db.getCollection ("users"). DropIndex ("referral_1") '' – swagrov

+0

Les scripts initdb ne sont pas exécutés en tant que root, c'est pourquoi vous ne pouvez pas faire' apt-get update/installer »à partir de là. Dans la section 'containers:' sous 'name' etc, ajoutez simplement' command: ["sh", "-c", "apt-get mise à jour && apt-get install ... && exec docker-entrypoint.sh"] ' . Cela devrait faire l'affaire en tant que solution rapide. Mieux encore, construisez votre propre image mongo qui a curl :-) –