Créer un instantané d'un PersistentVolume

Vous pouvez utiliser la fonctionnalité d'instantané de volume Kubernetes pour les volumes persistants et provisionnement dynamique dans 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.

Vous pouvez provisionner et associer des instantanés de volume à l'aide des composants suivants:

Conditions requises

Pour utiliser des instantanés de volume sur GKE sur AWS, vous devez disposer des éléments suivants :

  • Un volume utilisant un pilote Container Storage Interface (CSI) compatible avec les instantanés. Les pilotes EBS (Elastic Block Store) que GKE sur AWS utilise par défaut avec les instantanés de compatibilité.

    Pour obtenir la liste de tous les pilotes CSI compatibles avec les instantanés, consultez la colonne "Other features" (autres fonctionnalités) dans la page Drivers (pilotes) de la documentation Kubernetes.

  • 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: ebs.csi.aws.com. Si votre cluster provisionne de manière dynamique les PersistentVolumes par le pilote CSI, comme décrit dans les sections suivantes, il est géré par le pilote CSI.

Avant de commencer

Créer et utiliser un instantané de volume

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

  1. Créez des exemples PersistentVolumeClaim et Pod.
  2. Créer un objet VolumeSnapshot
  3. Restaurer l'instantané de volume
  4. Vérifiez que la restauration a fonctionné

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

  1. Créez un objet VolumeSnapshot pour demander un instantané d'un objet PersistentVolumeClaim existant.
  2. 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 des exemples PersistentVolumeClaim et Pod

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-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 par défaut.

  2. Appliquer le fichier manifeste :

    kubectl apply -f example-pvc.yaml
    
  3. Créez un pod qui écrit la date et l'heure actuelles sur le volume. Pour créer un déploiement, enregistrez le fichier manifeste suivant sous le nom snapshot-shell.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. Appliquer le fichier manifeste :

    kubectl apply -f snapshot-shell.yaml
    
  5. Vérifiez l'état du pod:

    kubectl get pod snapshot-shell
    

    L'exécution et le traitement du pod peuvent prendre un certain temps. Vous pouvez exécuter la commande ci-dessus jusqu'à obtenir un résultat semblable à celui-ci :

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

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, votre cluster le crée et le lie automatiquement à l'aide d'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.

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

    kubectl apply -f volumesnapshot.yaml
    

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

  3. Vérifiez que votre cluster a créé l'objet VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    Le résultat ressemble à ce qui suit :

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

Vérifier que l'instantané de volume est prêt

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. Une fois que votre cluster a créé un instantané sur le système de stockage et l'a lié à un objet VolumeSnapshot, il est prêt à être utilisé. Vous pouvez vérifier son état à l'aide de la commande suivante :

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

Si l'instantané est prêt à être utilisé, le résultat ressemble à ce qui suit :

NAME                    READY
example-snapshot        true

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 un nouveau PersistentVolumeClaim et créez un pod qui installe le PersistentVolumeClaim.

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-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. Démarrez un pod temporaire qui installe le PVC dans le pod et imprime le contenu de out.txt dans les journaux.

    Enregistrez le manifeste suivant sous le nom restore-log.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. Appliquer le fichier manifeste :

    kubectl apply -f restore-log.yaml
    

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

Le pod que vous avez créé à l'étape précédente lit à partir de l'instantané. Pour afficher les données de l'instantané, utilisez la commande kubectl logs.

kubectl logs restore-verify

Le résultat doit inclure un horodatage de l'instantané.

Effectuer un nettoyage

Pour éviter que les ressources utilisées sur cette page soient facturées, procédez comme suit :

  1. Supprimez le sous-réseau VolumeSnapshot :

    kubectl delete volumesnapshot example-snapshot
    

  2. Supprimez le pod temporaire:

    kubectl delete -f restore-log.yaml
    
  3. Supprimez le pod :

    kubectl delete -f snapshot-shell.yaml
    
  4. Supprimer les objets PersistentVolumeClaim :

    kubectl delete pvc example-pvc pvc-restore
    

Étapes suivantes