Utiliser des instantanés de volume

Dans Google Kubernetes Engine (GKE), vous pouvez utiliser la fonctionnalité d'instantané de volume Kubernetes pour les volumes persistants de vos clusters GKE.

Les instantanés de volume permettent de créer une copie d'un volume à un moment précis. Cette copie peut servir à revenir à un état antérieur ou à provisionner un nouveau volume.

À partir de la version 1.17 ou ultérieure, vous pouvez provisionner et associer des instantanés de volume avec les composants suivants :

Exigences

Pour utiliser des instantanés de volume dans GKE, vous devez répondre aux exigences suivantes :

  • Utiliser un pilote CSI compatible avec les instantanés. Le pilote de disque persistant "in-tree" n'est pas compatible avec les instantanés.

  • Les versions du plan de contrôle (maître) doivent utiliser GKE version 1.17 ou ultérieure. Pour exploiter le pilote CSI de disque persistant Compute Engine dans un VolumeSnapshot, vous devez utiliser GKE version 1.17.6-gke.4 ou ultérieure. Pour utiliser le pilote CSI Filestore dans un VolumeSnapshot, utilisez GKE version 1.21 ou ultérieure.

  • Vous devez disposer d'un objet PersistentVolumeClaim pour utiliser un instantané. Le PersistentVolume que vous utilisez pour une source d'instantané doit être géré par un pilote CSI. Vous pouvez contrôler que vous utilisez un pilote CSI en vérifiant que la spécification PersistentVolume présente une section csi avec driver: pd.csi.storage.gke.io ou filestore.csi.storage.gke.io. Si le PersistentVolume est provisionné de manière dynamique par le pilote CSI, comme décrit dans les sections suivantes, il est géré par le pilote CSI.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé le SDK Cloud.
  • Configurez les paramètres de l'outil de ligne de commande gcloud par défaut pour votre projet en utilisant l'une des méthodes suivantes:
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    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 l'outil 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.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans l'outil gcloud, telles que les suivantes: One of [--zone, --region] must be supplied: Please specify location.

Créer et utiliser un instantané de volume

Les exemples de ce document vous montrent comment effectuer les opérations suivantes :

  1. Créer un PersistentVolumeClaim et un déploiement
  2. Ajouter un fichier au PersistentVolume utilisé par le déploiement
  3. Créer un objet VolumeSnapshotClass pour configurer l'instantané
  4. Créer un instantané de volume du PersistentVolume
  5. Supprimer le fichier de test
  6. Restaurer le fichier PersistentVolume dans l'instantané que vous avez créé
  7. Vérifiez que la restauration a fonctionné

Pour utiliser un instantané de volume, procédez comme suit :

  1. Créez un objet VolumeSnapshotClass pour spécifier le pilote CSI et la règle de suppression de votre instantané.
  2. Créez un objet VolumeSnapshot pour demander un instantané d'un objet PersistentVolumeClaim existant.
  3. Référencez l'objet VolumeSnapshot dans un PersistentVolumeClaim pour restaurer un volume sur cet instantané, ou créez un volume à l'aide de l'instantané.

Créer un objet PersistentVolumeClaim et Deployment

  1. Pour créer l'objet PersistentVolumeClaim, enregistrez le manifeste suivant sous le nom my-pvc.yaml :

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      storageClassName: standard-rwo
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    Pour spec.storageClassName, vous pouvez spécifier n'importe quelle classe de stockage utilisant un pilote CSI compatible. Cet exemple utilise la classe de stockage standard-rwo installée par défaut avec le pilote CSI de disque persistant Compute Engine. Pour en savoir plus, consultez la page Utiliser le pilote CSI de disque persistant Compute Engine.

  2. Appliquer le fichier manifeste :

    kubectl apply -f my-pvc.yaml
    
  3. Pour créer un déploiement, enregistrez le fichier manifeste suivant sous le nom my-deployment.yaml :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    spec:
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. Appliquer le fichier manifeste :

    kubectl apply -f my-deployment.yaml
    
  5. Vérifiez l'état du déploiement :

    kubectl get deployment hello-app
    

Ajouter un fichier de test au volume

  1. Répertoriez les pods dans le déploiement :

    kubectl get pods -l app=hello-app
    

    Le résultat ressemble à ce qui suit :

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. Créez un fichier de test dans un pod :

    kubectl exec POD_NAME -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    Remplacez POD_NAME par le nom du pod.

  3. Vérifiez la présence du fichier.

    kubectl exec POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'
    

    Le résultat ressemble à ce qui suit :

    Hello World!
    

Créer un objet VolumeSnapshotClass.

Créez un objet VolumeSnapshotClass pour spécifier le pilote CSI et deletionPolicy pour votre instantané de volume. Vous pouvez référencer des objets VolumeSnapshotClass lorsque vous créez des objets VolumeSnapshot.

  1. Enregistrez le fichier manifeste suivant sous le nom volumesnapshotclass.yaml. Vous pouvez utiliser la version d'API v1beta1 ou v1 en fonction de la version de GKE sur votre cluster.

    v1beta1

    Utilisez la version de l'API v1beta1 pour les clusters exécutant les versions 1.21 ou une version antérieure.

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    v1

    Utilisez la version de l'API v1 pour les clusters exécutant les versions 1.21 ou une version ultérieure.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    Dans cet exemple :

    • Le champ driver est le pilote CSI à utiliser pour provisionner l'instantané pd.csi.storage.gke.io utilise le pilote CSI de disque persistant Compute Engine

    • Le champ deletionPolicy indique à GKE ce qu'il faut faire avec l'objet VolumeSnapshotContent et l'instantané sous-jacent lorsque l'objet VolumeSnapshot lié est supprimé. Spécifiez la valeur Delete pour supprimer l'objet VolumeSnapshotContent et l'instantané sous-jacent. Vous pouvez également spécifier Retain si vous souhaitez conserver l'objet VolumeSnapshotContent et l'instantané sous-jacent.

    Pour utiliser un emplacement de stockage personnalisé, ajoutez un paramètre storage-locations à la classe d'instantané (cette opération nécessite la version de cluster 1.21 ou ultérieure).

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    parameters:
      storage-locations: us-east2
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    
  2. Appliquer le fichier manifeste :

    kubectl apply -f volumesnapshotclass.yaml
    

Créer un objet VolumeSnapshot

Un objet VolumeSnapshot est une requête d'instantané d'un objet PersistentVolumeClaim existant. Lorsque vous créez un objet VolumeSnapshot, GKE le crée et le lie automatiquement avec un objet VolumeSnapshotContent, qui est une ressource de votre cluster comme un objet PersistentVolume.

  1. Enregistrez le fichier manifeste suivant sous le nom volumesnapshot.yaml. Vous pouvez utiliser la version d'API v1beta1 ou v1.

    v1beta1

    Utilisez la version de l'API v1beta1 pour les clusters exécutant les versions 1.21 ou une version antérieure.

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    

    v1

    Utilisez la version de l'API v1 pour les clusters exécutant les versions 1.21 ou une version ultérieure.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    
  2. Appliquer le fichier manifeste :

    kubectl apply -f volumesnapshot.yaml
    

    Après avoir créé un instantané de volume, GKE crée un objet VolumeSnapshotContent correspondant dans le cluster. Cet objet stocke l'instantané et les liaisons des objets VolumeSnapshot. Il n'est pas possible d'interagir directement avec les objets VolumeSnapshotContents.

  3. Pour vérifier que GKE a créé l'objet VolumeSnapshotContents, exécutez la commande suivante :

    kubectl get volumesnapshotcontents
    

    Le résultat ressemble à ce qui suit :

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

Une fois le contenu de l'instantané de volume créé, le pilote CSI que vous avez spécifié dans le VolumeSnapshotClass crée un instantané sur le système de stockage correspondant. Dès que GKE a créé l'instantané sur le système de stockage et l'a lié à l'objet VolumeSnapshot du cluster, l'instantané devient utilisable. Vous pouvez vérifier son état à l'aide de la commande suivante :

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

S'il est prêt à être utilisé, le résultat ressemble à ce qui suit :

NAME               READY
my-snapshot        true

Supprimer le fichier de test

  1. Supprimez le fichier de test que vous avez créé :

    kubectl exec POD_NAME -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. Vérifiez que le fichier n'existe plus :

    kubectl exec POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'
    

    Le résultat ressemble à ce qui suit :

    cat: /usr/share/hello/hello.txt: No such file or directory
    

Restaurer l'instantané de volume

Vous pouvez référencer un VolumeSnapshot dans un PersistentVolumeClaim pour provisionner un nouveau volume avec les données d'un volume existant ou restaurer un volume à un état capturé dans l'instantané.

Pour référencer un VolumeSnapshot dans une PersistentVolumeClaim, ajoutez le champ dataSource à votre PersistentVolumeClaim.

Dans cet exemple, vous référencez le VolumeSnapshot que vous avez créé dans une nouvelle PersistentVolumeClaim et vous mettez à jour le déploiement pour qu'il utilise la nouvelle revendication.

  1. Enregistrez le manifeste suivant sous le nom pvc-restore.yaml :

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  2. Appliquer le fichier manifeste :

    kubectl apply -f pvc-restore.yaml
    
  3. Mettez à jour my-deployment.yaml pour utiliser la nouvelle PersistentVolumeClaim :

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. Appliquez le fichier manifeste mis à jour :

    kubectl apply -f my-deployment.yaml
    

Vérifier que l'instantané a bien été restauré

Pour vérifier que l'instantané a bien été restauré, obtenez le nom du nouveau pod créé par GKE pour le déploiement mis à jour :

kubectl get pods -l app=hello-app

Vérifiez que le fichier de test existe :

kubectl exec NEW_POD_NAME -- sh -c 'cat /usr/share/hello/hello.txt'

Remplacez NEW_POD_NAME par le nom du pod que GKE a créé.

Le résultat ressemble à ce qui suit :

Hello World!

Nettoyer

  1. Supprimez le sous-réseau VolumeSnapshot :

    kubectl delete volumesnapshot my-snapshot
    
  2. Supprimez le sous-réseau VolumeSnapshotClass :

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. Supprimez le déploiement :

    kubectl delete deployments hello-app
    
  4. Supprimer les objets PersistentVolumeClaim :

    kubectl delete pvc my-pvc pvc-restore
    

Étape suivante