Restaurer un volume à partir d'un instantané

Ce document explique comment créer un instantané de volume, puis l'utiliser pour restaurer le volume. Les instructions ci-dessous s'appliquent aux clusters qui utilisent le pilote CSI vSphere.

Avant de commencer

Consultez Utiliser le pilote vSphere Container Storage Interface.

Vérifiez que votre cluster dispose d'une StorageClass nommée standard-rwo et que le pilote CSI vSphere est installé.

Votre version vSphere, ESXi et vCenter Server doivent être 7.0, mises à jour 3 ou ultérieures. Pour en savoir plus, consultez la section Résoudre les problèmes de stockage.

Vue d'ensemble de la procédure

Voici les principales étapes de l'exercice présenté dans ce document:

  1. Créez une PersistentVolumeClaim.
    Créez une ressource PersistentVolumeClaim qui demande la classe de stockage standard-rwo. Le cluster provisionne ensuite de manière dynamique un PersistentVolume et l'associe à votre PersistentVolumeClaim.
  2. Créez un déploiement.
    Créer un déploiement comportant un pod. Le pod spécifie un volume basé sur votre PersistentVolumeClaim. Le conteneur du pod installe le volume sur /hello/.
  3. Écrire un fichier sur le volume du pod
    Créez un fichier nommé hello.txt dans le volume du pod. Le contenu du fichier est "Hello World!".
  4. Créez un VolumeSnapshot.
    Créer un VolumeSnapshot qui capture l'état du volume du pod
  5. Le fichier est corrompu.
    Modifiez le fichier hello.txt de sorte qu'il ressemble à un fichier corrompu. Le contenu du fichier est désormais "Hello W-corrupted-file-orld!"
  6. Utilisez l'instantané pour restaurer le volume.
    Créez une deuxième PersistentVolumeClaim qui utilise votre VolumeSnapshot comme source de données. Modifiez votre déploiement afin que son volume soit associé à la nouvelle PersistentVolumeClaim. Vérifiez ensuite que le fichier hello.txt a été restauré.

Créer une PersistentVolumeClaim

Voici le fichier manifeste d'une PersistentVolumeClaim:

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

Dans le fichier manifeste précédent, vous pouvez voir que storageClassName est défini sur standard-rwo. Il s'agit de la classe de stockage associée au pilote CSI vSphere.

Enregistrez le fichier manifeste dans un fichier nommé my-pvc.yaml. Créez et affichez la PersistentVolumeClaim:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

Dans le résultat, vous pouvez voir que la PersistentVolumeClaim est liée à un PersistentVolume provisionné de manière dynamique. Par exemple, le résultat suivant montre que la PersistentVolumeClaim nommée my-pvc est liée à un PersistentVolume nommé pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

Créer un déploiement

Voici le fichier manifeste d'un déploiement :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
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: my-volume
          mountPath: /hello/
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: my-pvc

Dans le contexte de cet exercice, voici les points importants à comprendre à propos du fichier manifeste de déploiement précédent:

  • Le pod demande le stockage en spécifiant la PersistentVolumeClaim my-pvc que vous avez créée précédemment.

  • Le pod comporte un conteneur et le conteneur installe le volume sur /hello/.

Enregistrez le fichier manifeste dans un fichier nommé my-deployment.yaml et créez le déploiement:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml

Le déploiement comporte un pod. Obtenez le nom du pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Notez le nom du pod. Par exemple, dans le résultat suivant, le nom du pod est my-deployment-7575c4f5bf-r59nt:

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

Créez un fichier dans le volume du pod et affichez-le.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello World!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

Le résultat affiche le contenu du fichier /hello/hello.txt:

Hello World!

Créer un instantané

Voici le fichier manifeste d'un VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

Enregistrez le fichier manifeste dans un fichier nommé my-snapshot.yaml et créez le VolumeSnapshot:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

Fichier corrompu dans le volume.

Modifiez le contenu de hello.txt pour qu'il semble avoir été corrompu:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

Dans le résultat, vous pouvez voir que le fichier a été modifié:

Hello W-corrupted-file-orld!

Restaurer

Voici le fichier manifeste d'une deuxième PersistentVolumeClaim:

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

Dans le fichier manifeste précédent, vous pouvez voir que la source de données de la nouvelle demande PersistentVolume est le VolumeSnapshot que vous avez créé précédemment.

Enregistrez le fichier manifeste dans un fichier nommé my-pvc-2.yaml. Créez et affichez la PersistentVolumeClaim:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

Ouvrez le déploiement pour le modifier:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

Remplacez my-pvc par my-pvc-2, puis fermez l'éditeur:

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

Le déploiement supprime le pod et crée un autre pod qui utilise la nouvelle PersistentVolumeClaim.

Attendez quelques minutes, puis obtenez le nouveau nom du pod:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Vérifiez que le volume du pod a été restauré:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

Le résultat indique que le volume a été restauré:

Hello World!

Dépannage

Pour obtenir des conseils de dépannage, consultez la section Résoudre les problèmes de stockage.