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, 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, vous devez remplir les conditions suivantes :

  • Vous devez installer un pilote CSI compatible avec les instantanés. Le pilote de disque persistant "in-tree" n'est pas compatible avec les instantanés. Si vous utilisez le pilote CSI de disque persistant Compute Engine, nous vous recommandons de le déployer automatiquement afin de réduire les coûts de gestion. 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.

  • La version du plan de contrôle (maître) doit 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.

  • Vous devez disposer d'un PersistentVolumeClaim existant pour pouvoir prendre un instantané et le PersistentVolume utilisé comme 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. 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.

Créer un VolumeSnapshotClass

Créez un VolumeSnapshotClass pour déterminer le pilote CSI ainsi que la règle de suppression (deletionPolicy) du VolumeSnapshot. Vous pouvez référencer le VolumeSnapshotClass dans l'objet VolumeSnapshot.

Le fichier manifeste suivant, nommé snapshot-class-example.yaml, est un exemple de VolumeSnapshotClass :

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

Remplacez les éléments suivants :

  • snapshot-class est le nom de la classe VolumeSnapshotClass.
  • csi-driver spécifie le pilote CSI à utiliser pour provisionner l'instantané. Par exemple, vous pouvez saisir pd.csi.storage.gke.io pour utiliser le pilote CSI de disque persistant Compute Engine.
  • La valeur Delete garantit que l'objet VolumeSnapshotContent est supprimé dès que le VolumeSnapshot auquel il est lié est supprimé. L'instantané est alors également supprimé du système de stockage sous-jacent. Remplacez cette valeur par Retain si vous souhaitez conserver le VolumeSnapshotContent.

Une fois que le fichier est prêt, exécutez la commande suivante pour créer le VolumeSnapshotClass.

kubectl apply -f snapshot-class-example.yaml

Créer un VolumeSnapshot

Un VolumeSnapshot est une demande d'instantané d'un objet PersistentVolumeClaim préexistant.

Le fichier manifeste suivant, nommé snapshot-example.yaml, est un exemple de VolumeSnapshot :

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

Remplacez les éléments suivants :

  • snapshot est le nom du VolumeSnapshot.
  • snapshot-class spécifie le nom de la classe VolumeSnapshotClass que vous souhaitez référencer. Si vous ne spécifiez pas de valeur, la valeur par défaut de VolumeSnapshot est utilisée si elle est disponible.
  • pvc est le nom de l'objet PersistentVolumeClaim existant dont vous souhaitez prendre un instantané.

Une fois que le fichier est prêt, exécutez la commande suivante pour créer le VolumeSnapshot :

kubectl apply -f snapshot-example.yaml

Vérifier si le VolumeSnapshot a été créé

Juste après la création de l'instantané de volume, un objet VolumeSnapshotContent correspondant est créé dans le cluster. Cet objet stocke l'instantané et les liaisons avec les objets VolumeSnapshot. Il n'est pas possible d'interagir directement avec les objets VolumeSnapshotContent.

Pour vérifier si le VolumeSnapshotContent a été créé, exécutez la commande suivante :

kubectl get volumesnapshotcontents

Le résultat ressemble à ceci :

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 à ceci :

NAME               READY
snapshot-example   true

Provisionner et restaurer des volumes à l'aide d'un VolumeSnapshot

En référençant un VolumeSnapshot dans un objet PersistentVolumeClaim, vous pouvez soit provisionner un nouveau volume avec les données d'un volume existant, soit restaurer un volume à un état antérieur, qui a été capturé dans l'instantané.

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

L'exemple de fichier manifeste suivant, nommé pvc-demo.yaml, montre comment ajouter le champ dataSource :

# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  dataSource:
    name: snapshot-name
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

Assurez-vous que dataSource comprend les champs suivants :

  • snapshot-name est le nom du VolumeSnapshot que vous souhaitez utiliser.
  • kind doit prendre la valeur VolumeSnapshot.
  • apiGroup doit prendre la valeur snapshot.storage.k8s.io.

Pour appliquer la modification à l'objet PersistentVolumeClaim, exécutez la commande suivante :

kubectl apply -f pvc-demo.yaml

Supprimer un VolumeSnapshot

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

kubectl delete volumesnapshot snapshot-example

Si la classe VolumeSnapshotClass de l'instantané de volume spécifie deletionPolicy:Delete, le VolumeSnapshotContent correspondant et l'instantané physique sur le système de stockage sont également supprimés. Si c'est deletionPolicy:Retain qui est spécifié, GKE conserve l'instantané physique.

Étape suivante