Déployer une application avec état

Cette page explique comment déployer une application avec état à l'aide de Google Kubernetes Engine (GKE).

Présentation

Les applications avec état enregistrent les données dans un stockage sur disque persistant destiné au serveur, aux clients et aux autres applications. Une application avec état est, par exemple, une base de données ou un espace de stockage de paires clé/valeur où les données sont enregistrées et récupérées par d'autres applications.

Le stockage persistant peut être provisionné de manière dynamique, de sorte que les volumes sous-jacents n'ont pas besoin d'être créés à la demande. Dans Kubernetes, le provisionnement dynamique est configuré en créant une StorageClass. Dans GKE, une classe StorageClass par défaut vous permet de provisionner de manière dynamique des disques persistants Compute Engine.

Kubernetes utilise le contrôleur StatefulSet pour déployer des applications avec état en tant qu'objets StatefulSet. Les pods des StatefulSets ne sont pas interchangeables : chaque pod possède un identifiant unique qui est maintenu, peu importe l'emplacement lié à sa planification.

Les applications avec état diffèrent des applications sans état, dans lesquelles les données client ne sont pas enregistrées sur le serveur entre les sessions.

Apprenez-en plus sur le stockage persistant dans les clusters multizones et régionaux.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

Si le message d'erreur One of [--zone, --region] must be supplied: Please specify location s'affiche, effectuez les tâches ci-dessous.

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut pour les clusters zonaux ou une région pour les clusters régionaux ou Autopilot.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project PROJECT_ID
  • Si vous utilisez des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone COMPUTE_ZONE
  • Si vous utilisez des clusters Autopilot ou régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region COMPUTE_REGION
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update
  • Assurez-vous que votre application conteneurisée est stockée dans un registre d'images, tel qu'Artifact Registry.

Vous pouvez suivre le guide de démarrage rapide pour activer l'API GKE, créer un cluster et en savoir plus sur GKE.

Demander un stockage persistant dans un StatefulSet

Les applications peuvent demander un stockage permanent à l'aide d'un objet PersistentVolumeClaim.

En règle générale, vous devez créer des objets PersistentVolumeClaim en plus de créer le pod. Cependant, les objets StatefulSet incluent un tableau volumeClaimTemplates, qui génère automatiquement les objets PersistentVolumeClaim. Chaque instance dupliquée de StatefulSet obtient son propre objet PersistentVolumeClaim.

Vous pouvez également utiliser un disque préexistant dans un objet StatefulSet.

Créer un StatefulSet

Pour créer une ressource StatefulSet, utilisez la commande kubectl apply.

La commande kubectl apply utilise des fichiers manifestes pour créer, mettre à jour et supprimer des ressources dans votre cluster. Il s'agit d'une méthode déclarative de configuration d'objet. Cette méthode conserve les écritures effectuées sur les objets actifs sans fusionner les modifications dans les fichiers de configuration d'objet.

Linux

Le fichier manifeste suivant est un exemple simple d'objet StatefulSet régi par un objet Service qui a été créé séparément :

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  selector:
    matchLabels:
      app: APP_NAME
  serviceName: "SERVICE_NAME"
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: APP_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: ...
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: ...
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
      annotations:
        ...
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Remplacez l'élément suivant :

  • STATEFULSET_NAME : nom de l'objet StatefulSet.
  • SERVICE_NAME : nom du service.
  • APP_NAME : nom de l'application exécutée dans les pods.
  • CONTAINER_NAME : nom des conteneurs dans les pods.
  • PORT_NAME : nom du port ouvert par l'objet StatefulSet.
  • PVC_NAME : nom de l'objet PersistentVolumeClaim.

Dans ce fichier, le champ kind indique qu'un objet StatefulSet doit être créé avec les spécifications définies dans le fichier. Cet exemple d'objet StatefulSet génère trois pods répliqués et ouvre le port 80 pour exposer l'objet StatefulSet à Internet.

Windows

Lorsque vous utilisez des clusters avec des pools de nœuds Windows Server, vous devez créer un objet StorageClass, car l'objet StorageClass par défaut utilise le type de système de fichiers ext4, qui n'est compatible qu'avec les conteneurs Linux. Si vous utilisez un disque persistant Compute Engine, vous devez utiliser le type de stockage de fichiers NTFS, comme indiqué dans l'exemple suivant :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: STORAGECLASS_NAME
parameters:
  type: pd-standard
  fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Le fichier manifeste StatefulSet suivant utilise l'objet StorageClass défini ci-dessus. Il crée quatre paires d'objets PersistentVolume et PersistentVolumeClaim pour représenter quatre disques persistants Compute Engine. Chaque pod de l'objet StatefulSet consomme un disque persistant.

Pour faire en sorte que vos pods soient correctement programmés sur des nœuds Windows Server, vous devez ajouter un sélecteur de nœuds à votre spécification de pod.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: STATEFULSET_NAME
spec:
  replicas: 4
  selector:
    matchLabels:
      app: APP_NAME
  template:
    metadata:
      labels:
        app: APP_NAME
      name: CONTAINER_NAME
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: CONTAINER_NAME
        image: ...
        ports:
        - containerPort: 80
          name: PORT_NAME
        volumeMounts:
        - name: PVC_NAME
          mountPath: C:\mnt\state
  volumeClaimTemplates:
  - metadata:
      name: PVC_NAME
    spec:
      storageClassName: STORAGECLASS_NAME
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Remplacez l'élément suivant :

  • APP_NAME : nom de l'application exécutée dans les pods.
  • STATEFULSET_NAME : nom de l'objet StatefulSet.
  • CONTAINER_NAME : nom des conteneurs dans les pods.
  • PORT_NAME : nom du port ouvert par l'objet StatefulSet.
  • PVC_NAME : nom de l'objet PersistentVolumeClaim.
  • STORAGECLASS_NAME : nom de l'objet StorageClass.

Pour créer une ressource StatefulSet, exécutez la commande suivante en remplaçant STATEFULSET_FILE par le nom du fichier manifeste :

kubectl apply -f STATEFULSET_FILE

Vous pouvez également utiliser la commande kubectl apply -f DIRECTORY/ pour créer tous les objets (sauf ceux existants) définis dans les fichiers de configuration stockés dans un même répertoire.

Inspecter un StatefulSet

kubectl

Pour inspecter le StatefulSet, exécutez la commande suivante :

kubectl get statefulset STATEFULSET_NAME -o yaml

Cette commande affiche la configuration active de la ressource StatefulSet au format YAML.

Pour répertorier les pods créés par le StatefulSet, exécutez la commande suivante :

kubectl get pods -l app=APP_NAME

Dans cette commande, l'indicateur -l demande à kubectl d'obtenir tous les pods libellés pour APP_NAME.

Le résultat ressemble à ce qui suit :

NAME                                READY     STATUS    RESTARTS   AGE
pod-name                            1/1       Running   0          1m
pod-name                            1/1       Running   0          1m

Pour obtenir des informations détaillées sur le StatefulSet, exécutez la commande suivante :

kubectl describe statefulset STATEFULSET_NAME

Pour obtenir des informations sur un pod spécifique, exécutez la commande suivante :

kubectl describe pod POD_NAME

Pour obtenir la liste des objets PersistentVolumeClaim qui ont été créés, exécutez la commande suivante :

kubectl get pvc

Le résultat ressemble à ce qui suit :

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
STATEFULSET_NAME-PVC_NAME-0     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-1     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
STATEFULSET_NAME-PVC_NAME-2     Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

Pour obtenir des informations sur un objet PersistentVolumeClaim spécifique, exécutez la commande suivante :

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

Pour obtenir des informations sur un objet PersistentVolume spécifique, exécutez la commande suivante :

kubectl describe pv PV_NAME

Console

Pour inspecter un StatefulSet, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez inspecter.

  3. Sur la page Détails de l'ensemble avec état, effectuez l'une des opérations suivantes :

    • Cliquez sur l'onglet Historique des révisions pour afficher l'historique des révisions de l'objet StatefulSet.
    • Cliquez sur l'onglet Events (Événements) pour afficher tous les événements liés à l'objet StatefulSet.
    • Cliquez sur l'onglet Journaux pour afficher les journaux du conteneur de l'objet StatefulSet.
    • Cliquez sur l'onglet YAML pour afficher, copier ou télécharger le fichier de configuration YAML pour l'objet StatefulSet.

Mettre à jour un StatefulSet

Il existe plusieurs moyens de mettre à jour un StatefulSet. La méthode déclarative courante est kubectl apply. Pour mettre à jour le StatefulSet directement à partir de votre interface système ou dans l'éditeur de votre choix, vous pouvez utiliser kubectl edit. Vous pouvez également utiliser l'éditeur YAML à partir du menu "Charges de travail" de GKE dans Cloud Console.

Vous pouvez déployer les mises à jour de spécification de pods pour une ressource StatefulSet, telles que l'image, les requêtes/utilisations de ressources ou la configuration associées.

kubectl apply

Vous pouvez mettre à jour le StatefulSet en appliquant un fichier manifeste nouveau ou mis à jour. Cette pratique est utile pour apporter diverses modifications au StatefulSet, par exemple lors du scaling ou pour spécifier une nouvelle version de votre application.

Pour mettre à jour un StatefulSet, exécutez la commande suivante :

kubectl apply -f STATEFULSET_FILE

Remplacez STATEFULSET_FILE par le fichier manifeste mis à jour.

La commande kubectl apply applique un fichier manifeste à une ressource. Si la ressource spécifiée n'existe pas, elle est créée par la commande.

Pour plus d'informations sur kubectl apply, consultez la documentation de référence kubectl.

Console

Pour modifier la configuration active d'un StatefulSet, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez modifier.

  3. Cliquez sur Modifier.

  4. Modifiez la configuration YAML selon vos besoins.

  5. Cliquez sur Enregistrer.

Inspecter le déploiement de la mise à jour

kubectl

Pour inspecter le déploiement du StatefulSet, exécutez la commande suivante :

kubectl rollout status statefulset STATEFULSET_NAME

Pour afficher l'historique de déploiement du StatefulSet, exécutez la commande suivante :

kubectl rollout history statefulset STATEFULSET_NAME

Pour annuler un déploiement, exécutez la commande suivante :

kubectl rollout undo statefulset STATEFULSET_NAME

Console

Pour afficher l'historique des révisions d'un StatefulSet, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez inspecter.

  3. Cliquez sur l'onglet Revision History (Historique des révisions).

  4. Sélectionnez la révision souhaitée.

Stratégies de mise à jour

Le champ updateStrategy des objets StatefulSet vous permet de configurer et de désactiver les mises à jour automatiques progressives des conteneurs, des étiquettes, des demandes ou limites de ressources, et des annotations associés pour leurs pods.

Pour en savoir plus sur les stratégies de mise à jour des objets StatefulSets, consultez la documentation de Kubernetes.

Effectuer le scaling d'un StatefulSet

kubectl

Vous pouvez utiliser la commande kubectl scale à tout moment pour effectuer le scaling de vos objets StatefulSet.

Pour effectuer le scaling manuel d'un StatefulSet, exécutez la commande suivante :

kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS

Remplacez NUMBER_OF_REPLICAS par le nombre souhaité de pods répliqués.

Console

Pour effectuer le scaling d'un StatefulSet, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, cliquez sur le nom de l'objet StatefulSet que vous souhaitez modifier.

  3. Cliquez sur Faire évoluer.

  4. Saisissez le nouveau nombre d'instances dupliquées pour l'objet StatefulSet.

  5. Cliquez sur Faire évoluer.

Supprimer un StatefulSet

kubectl

Pour supprimer un StatefulSet, exécutez la commande suivante :

kubectl delete statefulset STATEFULSET_NAME

Console

Pour supprimer un StatefulSet, procédez comme suit :

  1. Accédez à la page Charges de travail dans Cloud Console.

    Accéder à la page Charges de travail

  2. Dans la liste des charges de travail, sélectionnez un ou plusieurs objets StatefulSets que vous souhaitez supprimer.

  3. Cliquez sur Supprimer.

  4. Lorsque vous êtes invité à confirmer l'opération, cliquez sur Supprimer.

Étape suivante