arrow_back

Exécuter une base de données MongoDB dans Kubernetes avec les objets StatefulSet

Exécuter une base de données MongoDB dans Kubernetes avec les objets StatefulSet

1 heure 5 crédits

GSP022

Google Cloud – Ateliers adaptés au rythme de chacun

Aperçu

Kubernetes est un outil d'orchestration de conteneurs Open Source qui gère les aspects complexes de l'exécution des applications en conteneur. Vous pouvez exécuter des applications Kubernetes avec Kubernetes Engine, un service de calcul GCP qui offre une grande variété de personnalisations et d'intégrations. Dans cet atelier, vous allez vous faire la main avec Kubernetes et apprendre à configurer une base de données MongoDB avec un objet StatefulSet. Exécuter une application avec état (une base de données) sur un service sans état (conteneur) peut sembler contradictoire. Toutefois, après quelques exercices pratiques dans cet atelier, vous découvrirez rapidement que ce n'est pas le cas. En fait, en utilisant quelques outils Open Source, vous découvrirez comment Kubernetes est parfaitement compatible avec des services sans état.

Objectifs de l'atelier

Dans cet atelier, vous allez apprendre à réaliser les opérations suivantes :

  • Déployer un cluster Kubernetes, un service sans adresse IP de cluster et un objet StatefulSet

  • Connecter un cluster Kubernetes à un ensemble d'instances dupliquées

  • Augmenter et réduire le nombre de membres d'ensembles d'instances dupliquées

  • Supprimer les fichiers de l'atelier et arrêter les services ci-dessus

Prérequis

Cet atelier est d'un niveau avancé. Une bonne connaissance de Kubernetes ou des applications en conteneur est conseillée. Une expérience de Google Cloud Shell/SDK et de MongoDB est également recommandée. Si vous souhaitez vous familiariser avec ces services, consultez les ateliers suivants :

Lorsque vous êtes prêt, faites défiler la page vers le bas pour passer à la configuration de l'atelier.

Configuration et prérequis

Configuration de Qwiklabs

Avant de cliquer sur le bouton Start Lab (Démarrer l'atelier)

Lisez ces instructions. Les ateliers sont minutés, et vous ne pouvez pas les mettre en pause. Le minuteur, qui démarre lorsque vous cliquez sur Start Lab (Démarrer l'atelier), indique combien de temps les ressources Google Cloud resteront accessibles.

Cet atelier pratique Qwiklabs vous permet de suivre vous-même les activités dans un véritable environnement cloud, et non dans un environnement de simulation ou de démonstration. Des identifiants temporaires vous sont fournis pour vous permettre de vous connecter à Google Cloud le temps de l'atelier.

Conditions requises

Pour réaliser cet atelier, vous devez :

  • avoir accès à un navigateur Internet standard (nous vous recommandons d'utiliser Chrome) ;
  • disposer de suffisamment de temps pour réaliser l'atelier en une fois.

Remarque : Si vous possédez déjà votre propre compte ou projet Google Cloud, veillez à ne pas l'utiliser pour réaliser cet atelier.

Remarque : Si vous utilisez un appareil Chrome OS, exécutez cet atelier dans une fenêtre de navigation privée.

Démarrer l'atelier et se connecter à la console Google Cloud

  1. Cliquez sur le bouton Démarrer l'atelier. Si l'atelier est payant, un pop-up s'affiche pour vous permettre de sélectionner un mode de paiement. Sur la gauche, vous trouverez le panneau Détails concernant l'atelier, qui contient les éléments suivants :

    • Le bouton Ouvrir la console Google
    • Le temps restant
    • Les identifiants temporaires que vous devez utiliser pour cet atelier
    • Des informations complémentaires vous permettant d'effectuer l'atelier
  2. Cliquez sur Ouvrir la console Google. L'atelier lance les ressources, puis ouvre la page Se connecter dans un nouvel onglet.

    Conseil : Réorganisez les onglets dans des fenêtres distinctes, placées côte à côte.

    Remarque : Si la boîte de dialogue Sélectionner un compte s'affiche, cliquez sur Utiliser un autre compte.
  3. Si nécessaire, copiez le nom d'utilisateur inclus dans le panneau Détails concernant l'atelier et collez-le dans la boîte de dialogue Se connecter. Cliquez sur Suivant.

  4. Copiez le mot de passe inclus dans le panneau Détails concernant l'atelier et collez-le dans la boîte de dialogue de bienvenue. Cliquez sur Suivant.

    Important : Vous devez utiliser les identifiants fournis dans le panneau de gauche. Ne saisissez pas vos identifiants Google Cloud Skills Boost. Remarque : Si vous utilisez votre propre compte Google Cloud pour cet atelier, des frais supplémentaires peuvent vous être facturés.
  5. Accédez aux pages suivantes :

    • Acceptez les conditions d'utilisation.
    • N'ajoutez pas d'options de récupération ni d'authentification à deux facteurs (ce compte est temporaire).
    • Ne vous inscrivez pas aux essais offerts.

Après quelques instants, la console Cloud s'ouvre dans cet onglet.

Remarque : Vous pouvez afficher le menu qui contient la liste des produits et services Google Cloud en cliquant sur le menu de navigation en haut à gauche. Icône du menu de navigation

Activer Google Cloud Shell

Google Cloud Shell est une machine virtuelle qui contient des outils pour les développeurs. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud. Google Cloud Shell offre un accès en ligne de commande à vos ressources GCP.

  1. Dans la console GCP, dans la barre d'outils située en haut à droite, cliquez sur le bouton Ouvrir Cloud Shell.

    Icône Cloud Shell

  2. Cliquez sur Continue (Continuez):

    cloudshell_continue

Il faut quelques instants pour mettre en service et se connecter à l'environnement. Lorsque vous êtes connecté, vous êtes déjà authentifié et le projet est défini sur votre PROJECT_ID. Par exemple:

Terminal Cloud Shell

gcloud est l'outil de ligne de commande associé à Google Cloud Platform. Pré-installé sur Cloud Shell, il est également compatible avec la saisie semi-automatique via la touche de tabulation.

Vous pouvez répertorier les noms des comptes actifs à l'aide de cette commande :

gcloud auth list

Résultat :

ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
    $ gcloud config set account `ACCOUNT`
	

Pour répertorier les ID de projet, exécutez la commande suivante :

gcloud config list project
	

Résultat :

[core]
project = <ID_Projet>
	

Exemple de résultat :

[core]
project = qwiklabs-gcp-44776a13dea667a6
	

Définir une zone de calcul

Tout au long de cet atelier, vous allez utiliser l'outil de ligne de commande gcloud pour provisionner nos services. Avant de créer notre cluster Kubernetes, nous devrons définir une zone de calcul afin que les machines virtuelles de notre cluster soient toutes créées dans la même région. Pour ce faire, nous allons utiliser la commande gcloud config set et exécuter la commande suivante dans votre environnement Cloud Shell pour définir votre zone sur us-central1-f :

gcloud config set compute/zone us-central1-f

Remarque : Pour plus d'informations sur les régions et les zones, cliquez sur ce lien.

Créer un cluster

Maintenant que notre zone est définie, nous allons créer un cluster de conteneurs. Exécutez la commande suivante pour instancier un cluster nommé hello-world :

gcloud container clusters create hello-world

Cette commande crée un cluster avec trois nœuds ou des machines virtuelles (comportement par défaut). Vous pouvez configurer des indicateurs supplémentaires pour cette commande afin de modifier le nombre de nœuds, les autorisations par défaut et d'autres variables. Pour plus d'informations, consultez la documentation.

Le lancement du cluster peut prendre quelques minutes. Une fois le lancement terminé, vous devriez obtenir un résultat semblable à celui-ci :

NAME         Location       MATER_VERSION   MASTER_IP       ...
hello-world  us-central1-f  1.9.7-gke.3     35.184.131.251  ...

Cliquez sur Vérifier ma progression pour vérifier l'objectif.

Créer un nouveau cluster

Configuration

Maintenant que notre cluster est opérationnel, il est temps de l'intégrer à MongoDB. Nous allons utiliser un ensemble d'instances dupliquées afin de garantir la disponibilité élevée et la redondance de nos données, qui sont essentielles pour l'exécution des applications de production. Avant de nous lancer, nous allons effectuer les opérations suivantes :

Exécutez la commande suivante pour cloner l'ensemble d'instances dupliquées MongoDB/Kubernetes à partir du dépôt Github :

gsutil -m cp -r gs://spls/gsp022/mongo-k8s-sidecar .

Une fois le clonage effectué, accédez au répertoire StatefulSet à l'aide de la commande suivante :

cd ./mongo-k8s-sidecar/example/StatefulSet/

Une fois que vous avez vérifié que les fichiers ont été téléchargés et que vous avez accédé au répertoire approprié, vous êtes prêt à créer une ressource StorageClass Kubernetes.

Créer la ressource StorageClass

Une ressource StorageClass indique à Kubernetes le type de stockage que vous voulez utiliser pour les nœuds de base de données. Sur la plate-forme Google Cloud, deux options de stockage sont disponibles : SSD et disques durs.

En examinant le répertoire StatefulSet (à l'aide de la commande ls), vous pouvez voir les fichiers de configuration SSD et HDD à la fois pour Azure et GCP. Exécutez la commande suivante pour examiner le fichier googlecloud_ssd.yaml :

cat googlecloud_ssd.yaml

Résultat :

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

Cette configuration crée une nouvelle ressource StorageClass appelée "fast" qui repose sur des volumes SSD. Exécutez la commande suivante pour déployer la ressource StorageClass :

kubectl apply -f googlecloud_ssd.yaml

Maintenant que notre ressource StorageClass est configurée, notre objet StatefulSet peut demander un volume qui sera automatiquement créé.

Cliquez sur Vérifier ma progression pour vérifier l'objectif.

Créer la StorageClass

Déployer le service sans adresse IP de cluster et l'objet StatefulSet

Rechercher et inspecter les fichiers

Afin de découvrir plus en détail en quoi consiste le service sans adresse IP de cluster et les objets StatefulSet, nous allons ouvrir le fichier de configuration (mongo-statefulset.yaml) dans lequel ils résident.

nano mongo-statefulset.yaml

Vous devez obtenir le résultat suivant (sans les pointeurs vers le service sans adresse IP de cluster et le contenu StatefulSet) :

apiVersion: v1   <-----------   Headless Service configuration
kind: Service
metadata:
  name: mongo
  labels:
    name: mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    role: mongo
---
apiVersion: apps/v1    <------- StatefulSet configuration
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 3
  selector:
    matchLabels:
      role: mongo
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rs0
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
        - name: mongo-sidecar
          image: cvallance/mongo-k8s-sidecar
          env:
            - name: MONGO_SIDECAR_POD_LABELS
              value: "role=mongo,environment=test"
  volumeClaimTemplates:
  - metadata:
      name: mongo-persistent-storage
      annotations:
        volume.beta.kubernetes.io/storage-class: "fast"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 100Gi

Supprimez les indicateurs suivants du fichier (lignes 49 et 50):

- "--smallfiles"
- "--noprealloc"

Assurez-vous que cette section de votre fichier se présente comme suit:

containers:
        - name: mongo
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rs0
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db

Quittez l'éditeur nano avec CTRL + X > Y > ENTER.

Service sans adresse IP de cluster : présentation

La première section de mongo-statefulset.yaml renvoie à un service sans adresse IP de cluster. Dans la terminologie Kubernetes, un service décrit des stratégies ou des règles pour accéder à des pods spécifiques. En résumé, un service sans adresse IP de cluster est un service qui n'impose pas l'équilibrage de charge. Combiné à des objets StatefulSet, il nous fournit des DNS individuels pour accéder à nos pods, et ainsi un moyen pour établir individuellement la connexion avec l'ensemble de nos nœuds MongoDB. Dans le fichier yaml, vous pouvez vous assurer que le service est sans adresse IP de cluster en vérifiant que le champ clusterIP est défini sur None (Sans).

StatefulSet : présentation

La configuration StatefulSet constitue la seconde section de mongo-statefulset.yaml. C'est le principe de base de cette application : c'est la charge de travail qui exécute MongoDB et qui orchestre vos ressources Kubernetes. En examinant le fichier yaml, nous constatons que le première section décrit l'objet StatefulSet. Ensuite, la section "Metadata" (Métadonnées) permet de définir les libellés et le nombre d'instances dupliquées.

Vient ensuite la spécification du pod. terminationGracePeriodSeconds permet de fermer correctement le pod lorsque vous réduisez le nombre d'instances dupliquées. Les configurations des deux conteneurs sont ensuite affichées. Le premier exécute MongoDB avec des indicateurs de ligne de commande qui configurent le nom de l'ensemble d'instances répliquées. Il installe également le volume de stockage persistant dans /data/db : l'emplacement où MongoDB enregistre ses données. Le deuxième conteneur exécute le sidecar. Ce conteneur sidecar va configurer automatiquement l'ensemble d'instances dupliquées MongoDB. Comme indiqué précédemment, un "sidecar" est un conteneur auxiliaire qui aide le conteneur principal à traiter ses tâches.

Enfin, la dernière section présente la configuration de volumeClaimTemplates. qui communique avec la classe de stockage précédemment créée pour le provisionnement du volume. Il provisionne un disque de 100 Go pour chaque instance dupliquée MongoDB.

Déployer le service sans adresse IP de cluster et l'objet StatefulSet

Maintenant que nous savons en quoi consistent un service sans adresse IP et un objet StatefulSet, nous pouvons passer à l'étape suivante et les déployer. Les deux étant empaquetés dans mongo-statefulset.yaml, nous pouvons les exécuter tous les deux à l'aide de la commande suivante :

kubectl apply -f mongo-statefulset.yaml

Vous devez obtenir le résultat suivant :

service "mongo" created
statefulset "mongo" created

Cliquez sur Vérifier ma progression pour vérifier l'objectif.

Déploiement du service Headless et StatefulSet

Se connecter à l'ensemble d'instances dupliquées MongoDB

Maintenant que nous avons un cluster en cours d'exécution et que notre ensemble d'instances dupliquées est déployé, nous pouvons avancer et nous y connecter.

Attendre le déploiement complet de l'ensemble d'instances dupliquées MongoDB

L'objet StatefulSet Kubernetes déploie chaque pod tour à tour. Il attend que le membre de l'ensemble d'instances dupliquées MongoDB démarre complètement et crée le disque de sauvegarde avant de lancer le membre suivant. Exécutez la commande suivante pour vérifier que les trois membres sont opérationnels :

kubectl get statefulset

Résultat - les trois membres sont opérationnels.

NAME      DESIRED   CURRENT   AGE
mongo     3         3         3m

Lancer et afficher l'ensemble d'instances dupliquées MongoDB

À ce stade, vous devez avoir trois pods créés dans votre cluster. Ils correspondent aux trois nœuds de votre ensemble de répliques MongoDB. Exécutez la commande suivante pour les afficher :

kubectl get pods

(Résultat) :

NAME        READY     STATUS    RESTARTS   AGE
mongo-0     2/2       Running   0          3m
mongo-1     2/2       Running   0          3m
mongo-2     2/2       Running   0          3m

Attendez que les trois membres soient créés avant de poursuivre.

Connectez-vous au premier membre de l'ensemble d'instances dupliquées :

kubectl exec -ti mongo-0 mongo

Vous disposez maintenant d'un environnement REPL connecté à MongoDB.

Nous allons maintenant instancier l'ensemble d'instances dupliquées avec une configuration par défaut à l'aide de la commande rs.initiate() :

rs.initiate()

Imprimez la configuration de l'ensemble d'instances dupliquées, puis exécutez la commande rs.conf() :

rs.conf()

Cette commande fournit les détails du membre courant de l'ensemble d'instances dupliquées rs0. Dans cet atelier, un seul membre est affiché. Pour obtenir les détails de tous les membres, vous devez exposer l'ensemble des instances dupliquées définies par le biais de services supplémentaires tels que nodeport ou load balancer.

rs0:OTHER> rs.conf()
{
        "_id" : "rs0",
        "version" : 1,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [
                {
                        "_id" : 0,
                        "host" : "localhost:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {
                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("5c526b6501fa2d29fc65c48c")
        }
}

Saisissez "exit" (quitter), puis appuyez sur la touche Entrée pour quitter la boucle REPL.

Mettre à l'échelle l'ensemble des instances dupliquées MongoDB

Kubernetes et les objets StatefulSet présentent un grand avantage : ils vous offrent la possibilité d'augmenter ou de diminuer le nombre d'instances dupliquées MongoDB grâce à une seule commande.

Pour que le nombre de membres de l'ensemble d'instances dupliquées passe de trois à cinq, exécutez la commande suivante :

kubectl scale --replicas=5 statefulset mongo

Cinq pods MongoDB sont disponibles en l'espace de quelques minutes. Exécutez la commande suivante pour les afficher :

kubectl get pods

Le résultat doit ressembler à l'exemple suivant :

NAME      READY     STATUS    RESTARTS   AGE
mongo-0   2/2       Running   0          41m
mongo-1   2/2       Running   0          39m
mongo-2   2/2       Running   0          37m
mongo-3   2/2       Running   0          4m
mongo-4   2/2       Running   0          2m

Pour que le nombre de membres de l'ensemble d'instances dupliquées passe de cinq à trois, exécutez la commande suivante :

kubectl scale --replicas=3 statefulset mongo

Trois pods MongoDB sont disponibles en l'espace de quelques minutes. Exécutez la commande suivante pour les afficher :

kubectl get pods

Le résultat doit ressembler à l'exemple suivant :

NAME      READY     STATUS    RESTARTS   AGE
mongo-0   2/2       Running   0          41m
mongo-1   2/2       Running   0          39m
mongo-2   2/2       Running   0          37m

Cliquez sur Vérifier ma progression pour vérifier l'objectif.

Mise à l'échelle du jeu de réplicas MongoDB

Utiliser l'ensemble d'instances dupliquées MongoDB

Chaque pod d'un objet StatefulSet assisté par un service sans adresse IP de cluster aura un nom DNS stable. Le format du modèle est : <nom-pod>.<nom-service>

Cela signifie que les noms DNS de l'ensemble d'instances dupliquées MongoDB sont les suivants :

mongo-0.mongo
mongo-1.mongo
mongo-2.mongo

Vous pouvez utiliser ces noms directement dans l'UI de la chaîne de connexion de votre application.

L'utilisation d'une base de données ne fait pas partie des notions abordées dans cet atelier. Toutefois, dans ce cas, l'URI de la chaîne de connexion est la suivante :

"mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo:27017/dbname_?"

Supprimer les fichiers de l'atelier

Dans la mesure où nous utilisons Qwiklabs, toutes vos ressources et votre projet seront nettoyés et supprimés pour vous à l'issue de l'atelier. Cependant, nous souhaitons vous expliquer comment nettoyer les ressources vous-même afin que vous puissiez limiter vos dépenses et avoir un comportement responsable dans le cloud lorsque vous serez dans votre propre environnement.

Pour nettoyer les ressources déployées, exécutez les commandes suivantes afin de supprimer l'objet StatefulSet, le service sans adresse IP de cluster et les volumes provisionnés.

Supprimez l'objet StatefulSet :

kubectl delete statefulset mongo

Supprimez le service :

kubectl delete svc mongo

Supprimez les volumes :

kubectl delete pvc -l role=mongo

Enfin, vous pouvez supprimer le cluster de test :

gcloud container clusters delete "hello-world"

Appuyez sur Y, puis sur Entrée pour continuer la suppression du cluster de test.

Félicitations !

Avec Kubernetes Engine, vous disposez d'une solution efficace et flexible pour exécuter des conteneurs sur Google Cloud Platform. Les objets StatefulSet vous permettent d'exécuter des charges de travail avec état telles que les bases de données sur Kubernetes.

Points abordés

  • Création d'un ensemble d'instances dupliquées MongoDB avec des objets StatefulSet Kubernetes
  • Connexion à l'ensemble d'instances dupliquées MongoDB
  • Mise à l'échelle de l'ensemble d'instances dupliquées

ac89564fa3705b3a.png Solutions_Kubernetes-125.png

Terminer votre quête

Cet atelier d'auto-formation fait partie des quêtes Qwiklabs Cloud Architecture et Kubernetes Solutions. Une quête est une série d'ateliers associés qui constituent une formation. Si vous terminez cette quête, vous obtiendrez le badge ci-dessus attestant de votre réussite. Vous pouvez rendre publics les badges que vous recevez et ajouter leur lien dans votre CV en ligne ou sur vos comptes de réseaux sociaux. Inscrivez-vous à cette quête pour obtenir immédiatement les crédits associés à cet atelier si vous l'avez suivi. Découvrez les autres quêtes Qwiklabs disponibles.

Suivre votre prochain atelier

Continuez votre quête avec le prochain atelier ou consultez nos suggestions :

Étapes suivantes et informations supplémentaires

Google Cloud Training & Certification

...helps you make the most of Google Cloud technologies. Our classes include technical skills and best practices to help you get up to speed quickly and continue your learning journey. We offer fundamental to advanced level training, with on-demand, live, and virtual options to suit your busy schedule. Certifications help you validate and prove your skill and expertise in Google Cloud technologies.

Dernière mise à jour du manuel : 01 novembre 2020
Dernier test de l'atelier: 01 novembre 2020

Copyright 2020 Google LLC Tous droits réservés. Google et le logo Google sont des marques de Google LLC. Tous les autres noms d'entreprises et de produits peuvent être des marques des entreprises auxquelles ils sont associés.