Travailler avec des snapshots
Les snapshots de volumes persistants (PV) Kubernetes permettent de créer des copies à un instant précis des volumes. Vous pouvez créer un snapshot d'un volume créé avec Trident, importer un snapshot créé en dehors de Trident, créer un nouveau volume à partir d'un snapshot existant, et récupérer des données de volume à partir de snapshots.
Aperçu
La capture instantanée de volume est prise en charge par ontap-nas, ontap-nas-flexgroup, ontap-san, ontap-san-economy, solidfire-san, azure-netapp-files et google-cloud-netapp-volumes pilotes.
Vous devez disposer d'un contrôleur de snapshots externe et de Custom Resource Definitions (CRDs) pour travailler avec les snapshots. C'est la responsabilité de l'orchestrateur Kubernetes (par exemple : Kubeadm, GKE, OpenShift).
Si votre distribution Kubernetes n'inclut pas le contrôleur de snapshots et les CRD, reportez-vous à Déployer un contrôleur d'instantané de volume.
|
|
Ne créez pas de contrôleur de snapshots si vous créez des snapshots de volumes à la demande dans un environnement GKE. GKE utilise un contrôleur de snapshots intégré et masqué. |
Créer un instantané de volume
-
Créez un
VolumeSnapshotClass. Pour plus d'informations, consultez "VolumeSnapshotClass".-
Le
driverpointe vers le pilote Trident CSI. -
deletionPolicypeut êtreDeleteouRetain. Lorsqu'il est défini surRetain, l'instantané physique sous-jacent sur le cluster de stockage est conservé même lorsque l'objetVolumeSnapshotest supprimé.Exemplecat snap-sc.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: csi-snapclass driver: csi.trident.netapp.io deletionPolicy: Delete
-
-
Créer un instantané d'un PVC existant.
Exemples-
Cet exemple crée un instantané d'un PVC existant.
cat snap.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: pvc1-snap spec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: pvc1 -
Cet exemple crée un objet d'instantané de volume pour un PVC nommé
pvc1et le nom de l'instantané est défini surpvc1-snap. Un VolumeSnapshot est analogue à un PVC et est associé à unVolumeSnapshotContentobjet qui représente l'instantané réel.kubectl create -f snap.yaml volumesnapshot.snapshot.storage.k8s.io/pvc1-snap created kubectl get volumesnapshots NAME AGE pvc1-snap 50s
-
Vous pouvez identifier l'
VolumeSnapshotContent`objet pour le `pvc1-snapVolumeSnapshot en le décrivant. LeSnapshot Content Nameidentifie l'objet VolumeSnapshotContent qui sert cet instantané. LeReady To Useparamètre indique que l'instantané peut être utilisé pour créer un nouveau PVC.kubectl describe volumesnapshots pvc1-snap Name: pvc1-snap Namespace: default ... Spec: Snapshot Class Name: pvc1-snap Snapshot Content Name: snapcontent-e8d8a0ca-9826-11e9-9807-525400f3f660 Source: API Group: Kind: PersistentVolumeClaim Name: pvc1 Status: Creation Time: 2019-06-26T15:27:29Z Ready To Use: true Restore Size: 3Gi ...
-
Créer un PVC à partir d'un instantané de volume
Vous pouvez utiliser dataSource pour créer un PVC en utilisant un VolumeSnapshot nommé <pvc-name> comme source des données. Après la création du PVC, il peut être attaché à un pod et utilisé comme n'importe quel autre PVC.
|
|
Le PVC sera créé dans le même backend que le volume source. Voir "KB : La création d’un PVC à partir d’un instantané de PVC Trident ne peut pas être effectuée dans un autre backend". |
L'exemple suivant crée le PVC en utilisant pvc1-snap comme source de données.
cat pvc-from-snap.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-from-snap
spec:
accessModes:
- ReadWriteOnce
storageClassName: golden
resources:
requests:
storage: 3Gi
dataSource:
name: pvc1-snap
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
Importer un instantané de volume
Trident prend en charge la "Processus de snapshot pré-provisionné Kubernetes" pour permettre à l'administrateur du cluster de créer un VolumeSnapshotContent objet et d'importer des instantanés créés en dehors de Trident.
Trident doit avoir créé ou importé le volume parent de la capture.
-
Administrateur du cluster : Créez un
VolumeSnapshotContentobjet qui référence l’instantané du backend. Cela lance le workflow d’instantané dans Trident.-
Spécifiez le nom de l’instantané du backend dans
annotationscommetrident.netapp.io/internalSnapshotName: <"backend-snapshot-name">. -
Spécifiez
<name-of-parent-volume-in-trident>/<volume-snapshot-content-name>danssnapshotHandle. Il s'agit de la seule information fournie à Trident par le générateur de snapshots externe dans l'appelListSnapshots.Le <volumeSnapshotContentName>ne peut pas toujours correspondre au nom de l’instantané du backend en raison des contraintes de dénomination des CR.ExempleL'exemple suivant crée un
VolumeSnapshotContentobjet qui référence l'instantané du backendsnap-01.
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: import-snap-content annotations: trident.netapp.io/internalSnapshotName: "snap-01" # This is the name of the snapshot on the backend spec: deletionPolicy: Retain driver: csi.trident.netapp.io source: snapshotHandle: pvc-f71223b5-23b9-4235-bbfe-e269ac7b84b0/import-snap-content # <import PV name or source PV name>/<volume-snapshot-content-name> volumeSnapshotRef: name: import-snap namespace: default -
-
Administrateur du cluster : Créez la
VolumeSnapshotCR qui référence l' `VolumeSnapshotContent`objet. Cela demande l’autorisation d’utiliser l' `VolumeSnapshot`dans un espace de noms donné.ExempleL'exemple suivant crée un
VolumeSnapshotCR nomméimport-snapqui référence leVolumeSnapshotContentnomméimport-snap-content.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: import-snap spec: # volumeSnapshotClassName: csi-snapclass (not required for pre-provisioned or imported snapshots) source: volumeSnapshotContentName: import-snap-content -
Traitement interne (aucune action requise) : Le gestionnaire de snapshots externe reconnaît le nouvellement créé
VolumeSnapshotContentet exécute l'appelListSnapshots. Trident crée leTridentSnapshot.-
Le dispositif de capture d'écran externe définit le
VolumeSnapshotContentsurreadyToUseet leVolumeSnapshotsurtrue. -
Trident retourne
readyToUse=true.
-
-
Tout utilisateur : Créez un
PersistentVolumeClaimpour référencer le nouveauVolumeSnapshot, où lespec.dataSource(ouspec.dataSourceRef) nom est leVolumeSnapshotnom.ExempleL'exemple suivant crée un PVC faisant référence au
VolumeSnapshotnomméimport-snap.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-from-snap spec: accessModes: - ReadWriteOnce storageClassName: simple-sc resources: requests: storage: 1Gi dataSource: name: import-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
Récupérer les données du volume à l'aide de snapshots
Le répertoire des instantanés est masqué par défaut afin d'assurer une compatibilité maximale des volumes provisionnés à l'aide des ontap-nas et ontap-nas-economy pilotes. Activez le répertoire .snapshot pour récupérer directement les données à partir des instantanés.
Utilisez la commande ONTAP volume snapshot restore pour restaurer un volume à un état enregistré dans un instantané précédent.
cluster1::*> volume snapshot restore -vserver vs0 -volume vol3 -snapshot vol3_snap_archive
|
|
Lorsque vous restaurez une copie instantanée, la configuration du volume existant est écrasée. Les modifications apportées aux données du volume après la création de la copie instantanée sont perdues. |
Restauration sur place du volume à partir d'un instantané
Trident permet une restauration rapide et directe des volumes à partir d'un instantané grâce à la TridentActionSnapshotRestore (TASR) CR. Cette CR fonctionne comme une action Kubernetes impérative et n'est pas conservée après la fin de l'opération.
Trident prend en charge la restauration d'instantanés sur les ontap-san, ontap-san-economy, ontap-nas, ontap-nas-flexgroup, azure-netapp-files, google-cloud-netapp-volumes et solidfire-san pilotes.
Vous devez disposer d'une PVC reliée et d'un instantané de volume disponible.
-
Vérifiez que le statut du PVC est bound.
kubectl get pvc -
Vérifiez que l'instantané du volume est prêt à être utilisé.
kubectl get vs
-
Créez la TASR CR. Cet exemple crée une CR pour PVC
pvc1et volume snapshotpvc1-snapshot.Le TASR CR doit se trouver dans un espace de noms où le PVC et le VS existent. cat tasr-pvc1-snapshot.yamlapiVersion: trident.netapp.io/v1 kind: TridentActionSnapshotRestore metadata: name: trident-snap namespace: trident spec: pvcName: pvc1 volumeSnapshotName: pvc1-snapshot -
Appliquez la CR pour restaurer à partir de l'instantané. Cet exemple restaure à partir de l'instantané
pvc1.kubectl create -f tasr-pvc1-snapshot.yamltridentactionsnapshotrestore.trident.netapp.io/trident-snap created
Trident restaure les données à partir de l'instantané. Vous pouvez vérifier l'état de la restauration de l'instantané :
kubectl get tasr -o yaml
apiVersion: trident.netapp.io/v1
items:
- apiVersion: trident.netapp.io/v1
kind: TridentActionSnapshotRestore
metadata:
creationTimestamp: "2023-04-14T00:20:33Z"
generation: 3
name: trident-snap
namespace: trident
resourceVersion: "3453847"
uid: <uid>
spec:
pvcName: pvc1
volumeSnapshotName: pvc1-snapshot
status:
startTime: "2023-04-14T00:20:34Z"
completionTime: "2023-04-14T00:20:37Z"
state: Succeeded
kind: List
metadata:
resourceVersion: ""
|
|
|
Supprimez un PV avec les instantanés associés
Lors de la suppression d'un volume persistant avec des snapshots associés, le volume Trident correspondant passe à l'état « Suppression en cours ». Supprimez les snapshots du volume pour supprimer le volume Trident.
Déployer un contrôleur d'instantané de volume
Si votre distribution Kubernetes n'inclut pas le snapshot controller et les CRDs, vous pouvez les déployer comme suit.
-
Créer des CRD d'instantané de volume.
cat snapshot-setup.sh
#!/bin/bash # Create volume snapshot CRDs kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml -
Créez le contrôleur de snapshot.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yamlSi nécessaire, ouvrez deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlet mettez à journamespacepour votre espace de noms.