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?

  • support du passage à l’échelle
  • configuration automatique du cluster MongoDB
  • mise en oeuvre d’un stockage persistent.

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 🚀 !