Comprendre les StatefulSets
Installation semi-manuelle
Créez un Statefulset MongoDB.
Appliquez le fichier mongo-simple.yaml pour créer le StatefulSet. Appliquez ensuite le fichier mongo-service.yaml afin de créer le service headless.
Vérifiez que les pods démarrent bien dand l’odre.
Instanciez un shell dans un pod ubuntu (kubectl run -i --rm --tty shell --image=ubuntu -- bash
), installez nslookup
ou dig
et tentez une résolution DNS de :
mongo
mongo-1.mongo
Que constatez vous ?
Pour initialiser mongoDB utilisez les commandes suivantes :
kubectl exec -it mongo-0 -- mongo
# Dans le conteneur
rs.initiate({_id: "rs0", members:[{_id: 0, host: "mongo-0.mongo:27017"}]});
rs.add("mongo-1.mongo:27017");
rs.add("mongo-2.mongo:27017");
Tenter un passage à l’échelle du StatefulSet avec kubectl scale
, que se passe t’il?
Installation automatisée
Quels sont les axes d’amélioration pour ce StatefulSet?
Supprimer d’abord le StatefulSet MongoDB.
Ajout d’un script de configuration automatisée
Appliquer le fichier mongo-configmap.yaml.
Ajout d’un stockage persistent
En s’inspirant de cet example, modifier le fichier mongo.yaml pour ajouter une section volumeClaimTemplates
Vérifier que ls StatefulSet a bien démarré puis lister les PVs
et les PVCs
.
Vérifier également que tous les noeuds sont abonnés au cluster avec la commande suivante:
kubectl exec -it mongo-0 -- mongo --eval="printjson(rs.status())"
Remarque
Le script de configuration présent dans le configmap
n’est pas extrêmement robuste et présente des effets de bord. Si un des pods
mongo
n’est pas présent dans le replicaset
mongo
alors une solution simple est de supprimer le pod
concerné afin qu’il soit recréé automatiquement et que le script de configuration soit de nouveau exécuté.
Chargement des données
curl -O https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
cat primer-dataset.json | kubectl exec -it mongo-0 -- mongoimport --db test --collection restaurants --drop
Enfin, tester l’accés aux données :
kubectl exec -it mongo-0 -- mongo test --eval "db.restaurants.find()"
Félicitations, Vous avez manipulé toutes les briques de base pour déployer une application sur un cluster Kubernetes 🚀 !