Les snapshots de volumes vous permettent de sauvegarder et de restaurer les données de vos applications. Cette rubrique explique comment créer des snapshots pour les volumes de disque à l'aide des ressources VolumeSnapshot et comment restaurer les données à partir de ces snapshots.
Prérequis
Vérifiez les conditions suivantes :
Un cluster ACK managé exécutant Kubernetes 1.18 ou une version ultérieure
Le service Snapshot d'Elastic Compute Service (ECS) est activé (l'activation est gratuite ; vous ne payez que pour les snapshots que vous créez).
Fonctionnement
Les clusters ACK utilisent des volumes de disque pour le stockage persistant des StatefulSet. Les snapshots de volumes s'appuient sur les snapshots de disques ECS et sur deux mécanismes Kubernetes :
VolumeSnapshot : permet de sauvegarder les données d'un volume de disque
DataSource : champ d'une PersistentVolumeClaim (PVC) qui restaure les données d'un snapshot dans un nouveau volume
ACK implémente les snapshots via trois CustomResourceDefinitions (CRD) :
|
Ressource |
Description |
|
VolumeSnapshotContent |
Un snapshot de disque à l'échelle du cluster, provisionné par un administrateur de cluster. Analogue à un PersistentVolume (PV). |
|
VolumeSnapshot |
Une demande utilisateur à l'échelle du namespace pour un snapshot de volume. Analogue à une PVC. |
|
VolumeSnapshotClass |
Définit le pilote et les paramètres pour la création de snapshots. Analogue à StorageClass, mais spécifique aux snapshots : un même volume peut avoir des snapshots avec des attributs différents (par exemple, des durées de rétention différentes). |
VolumeSnapshot et VolumeSnapshotContent sont liés un à un, tout comme PVC et PV :
Si
volumeSnapshotClassNameest défini sur une VolumeSnapshotClass valide, ACK provisionne automatiquement un VolumeSnapshotContent.Si
volumeSnapshotClassNameest omis ou invalide, créez manuellement un VolumeSnapshotContent et liez-le au VolumeSnapshot.
La suppression d'un VolumeSnapshotContent entraîne également la suppression du snapshot de volume associé.
Facturation
Les snapshots de volumes sont facturés comme des snapshots ECS. Consultez la section Facturation des snapshots.
Contraintes
Avant de créer un snapshot, examinez les contraintes suivantes :
|
Condition |
Comportement |
|
Version du module complémentaire CSI < V1.22.12-b797ad9-aliyun |
Les snapshots ne peuvent être créés qu'à partir de volumes de disque dont la PVC est attachée à un pod en cours d'exécution. |
|
Version du plug-in CSI >= V1.22.12-b797ad9-aliyun |
Les snapshots peuvent être créés à partir de n'importe quel volume de disque utilisé, quel que soit l'état du pod. |
Par défaut, l'accès à l'instance est activé pour les snapshots dynamiques issus des volumes Enhanced SSD (ESSD) et ESSD AutoPL aux niveaux PL0–PL3.
Le cycle de vie des ressources VolumeSnapshot et VolumeSnapshotContent créées par la classe de snapshot csdr-disk-snapshot est géré par le Backup center. Pour éviter la suppression accidentelle de vos ressources, ne modifiez pas et n'utilisez pas cette classe de snapshot.
Créer un snapshot de volume de manière dynamique
Créez un snapshot d'un volume de disque géré par ACK en direct. ACK provisionne automatiquement le VolumeSnapshotContent et le snapshot ECS sous-jacent.

Aperçu : créez une VolumeSnapshotClass (administrateur) → déployez une application avec un volume de disque → créez un VolumeSnapshot (ACK crée automatiquement le VolumeSnapshotContent et le snapshot ECS) → restaurez les données dans un nouveau volume à partir du snapshot via une PVC.
Étape 1 : Créer une VolumeSnapshotClass
Il s'agit d'une tâche administrative. Passez directement à l' étape 2 si votre cluster possède déjà une VolumeSnapshotClass.
-
Créez le fichier
volumesnapshotclass.yamlavec le contenu suivant :Paramètre
Description
retentionDaysDurée de rétention du snapshot, en jours.
forceDeleteComportement lors de la suppression du snapshot.
"true"supprime de force tous les snapshots ;"false"supprime uniquement les snapshots inutilisés. Valeur par défaut :"false"pour csi-provisioner 1.26.5-92f859a-aliyun et versions ultérieures ;"true"pour les versions antérieures.deletionPolicyDelete: supprime le VolumeSnapshotContent et le snapshot ECS lorsque le VolumeSnapshot est supprimé.Retain: conserve les deux.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: default-snapclass driver: diskplugin.csi.alibabacloud.com parameters: retentionDays: "5" forceDelete: "true" deletionPolicy: Delete -
Appliquez le manifeste :
kubectl apply -f volumesnapshotclass.yaml
Étape 2 : Déployer une application et écrire des données
-
Créez le fichier
nginx.yamlavec le contenu suivant :apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent volumeMounts: - name: disk mountPath: /data volumeClaimTemplates: - metadata: name: disk spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-topology-alltype" resources: requests: storage: 20Gi -
Déployez le StatefulSet :
kubectl apply -f nginx.yaml -
Vérifiez que le pod est en cours d'exécution :
kubectl get pod -l app=nginxRésultat attendu :
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82s -
Écrivez des données de test dans le volume :
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /dataRésultat attendu :
lost+found test
Étape 3 : Créer un VolumeSnapshot
-
Créez le fichier
snapshot-1.yamlavec le contenu suivant :apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: default spec: volumeSnapshotClassName: default-snapclass # The VolumeSnapshotClass used by the VolumeSnapshot. source: persistentVolumeClaimName: disk-nginx-0 -
Appliquez le manifeste :
kubectl apply -f snapshot-1.yaml
Étape 4 : Vérifier le snapshot
-
Vérifiez l'état du VolumeSnapshot :
kubectl get volumesnapshotsRésultat attendu :
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE new-snapshot-demo true disk-nginx-0 20Gi default-snapclass snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57 28s 28sLorsque
READYTOUSEest défini surtrue, le snapshot est prêt. -
Vérifiez le VolumeSnapshotContent :
kubectl get VolumeSnapshotContentRésultat attendu :
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57 true 21474836480 Delete diskplugin.csi.alibabacloud.com default-snapclass new-snapshot-demo default 49s
Le snapshot de disque ECS apparaît également sur la page Snapshots de la console ECS .
Étape 5 (facultative) : Restaurer les données dans une nouvelle application
Référencez le snapshot dans les volumeClaimTemplates d'un StatefulSet pour restaurer les données dans un nouveau volume.
-
Créez le fichier
nginx-restore.yaml. Le blocdataSourcefait référence au snapshot que vous avez créé :apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-restore spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent volumeMounts: - name: disk mountPath: /data volumeClaimTemplates: - metadata: name: disk spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-topology-alltype" resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo # Name of the VolumeSnapshot to restore from kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io -
Déployez le StatefulSet :
kubectl apply -f nginx-restore.yaml -
Vérifiez que les données ont été restaurées :
kubectl exec -it nginx-restore-0 -- ls /dataRésultat attendu :
lost+found test
Étape 6 (facultative) : Restaurer les données dans une PVC autonome
Pour restaurer les données sans déployer de charge de travail, créez directement une PVC à partir du snapshot.
-
Créez le fichier
pvc-restore.yamlavec le contenu suivant :apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-disk namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo # Name of the VolumeSnapshot to restore from kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: alicloud-disk-topology-alltype volumeMode: Filesystem -
Créez la PVC :
La StorageClass
alicloud-disk-topology-alltypeutilisevolumeBindingMode: WaitForFirstConsumer. La PVC reste à l'étatPendingjusqu'à ce qu'elle soit montée sur un pod. Ne supprimez pas le VolumeSnapshot, le VolumeSnapshotContent ou le snapshot ECS sous-jacent avant que la PVC ne soit liée.kubectl apply -f pvc-restore.yaml
Importer un snapshot de disque existant
Importez un snapshot de disque ECS existant dans un cluster ACK sans déployer d'application au préalable.
Étape 1 : Créer un VolumeSnapshotContent
Il s'agit d'une tâche administrative.
-
Créez le fichier
snapshot-content.yaml. Remplacez<YOUR-SNAPSHOTID>par l'ID du snapshot disponible sur la page Snapshots de la console ECS :Paramètre
Description
snapshotHandleID du snapshot de disque ECS existant.
volumeSnapshotRef.nameNom du VolumeSnapshot à lier. Doit correspondre à
metadata.namedans le manifeste VolumeSnapshot.volumeSnapshotRef.namespaceNamespace du VolumeSnapshot.
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: new-snapshot-content-test spec: deletionPolicy: Retain driver: diskplugin.csi.alibabacloud.com source: snapshotHandle: <YOUR-SNAPSHOTID> # ID of the existing ECS disk snapshot volumeSnapshotRef: name: new-snapshot-demo # Must match the VolumeSnapshot name below namespace: default -
Appliquez le manifeste :
kubectl apply -f snapshot-content.yaml
Étape 2 : Créer un VolumeSnapshot et le lier
-
Créez le fichier
snapshot-2.yamlavec le contenu suivant :Paramètre
Description
metadata.nameNom du VolumeSnapshot. Doit correspondre à
volumeSnapshotRef.namedans le VolumeSnapshotContent.volumeSnapshotContentNameNom du VolumeSnapshotContent à lier.
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: new-snapshot-demo # Must match volumeSnapshotRef.name in the VolumeSnapshotContent namespace: default spec: source: volumeSnapshotContentName: new-snapshot-content-test # Name of the VolumeSnapshotContent to bind -
Appliquez le manifeste :
kubectl apply -f snapshot-2.yaml
Étape 3 (facultative) : Restaurer les données
Après la liaison, restaurez les données comme décrit à l'étape 5 et à l'étape 6 du workflow de snapshot dynamique.