Las instantáneas de volumen le ayudan a respaldar y restaurar los datos de sus aplicaciones. En este tema se explica cómo crear instantáneas para volúmenes de disco con recursos VolumeSnapshot y cómo restaurar datos a partir de ellas.
Requisitos previos
Asegúrese de cumplir con lo siguiente:
Un clúster administrado de ACK que ejecute Kubernetes 1.18 o una versión posterior.
El servicio Snapshot de Elastic Compute Service (ECS) debe estar activado (la activación es gratuita; solo paga por las instantáneas que cree).
Cómo funciona
Los clústeres de ACK usan volúmenes de disco para el almacenamiento persistente de StatefulSet. Las instantáneas de volumen se basan en las instantáneas de disco de ECS y en dos mecanismos de Kubernetes:
VolumeSnapshot: respalda los datos del volumen de disco.
DataSource: un campo de PersistentVolumeClaim (PVC) que restaura los datos de la instantánea en un nuevo volumen.
ACK implementa las instantáneas mediante tres CustomResourceDefinitions (CRD):
|
Resource |
Description |
|
VolumeSnapshotContent |
Una instantánea de disco a nivel de clúster aprovisionada por un administrador. Es análoga a un PersistentVolume (PV). |
|
VolumeSnapshot |
Una solicitud de usuario a nivel de namespace para obtener una instantánea de volumen. Es análoga a un PVC. |
|
VolumeSnapshotClass |
Define el controlador y los parámetros para crear la instantánea. Es análogo a StorageClass, pero específico para instantáneas: un mismo volumen puede tener instantáneas con distintos atributos (por ejemplo, diferentes periodos de retención). |
VolumeSnapshot y VolumeSnapshotContent se vinculan en una relación uno a uno, igual que PVC y PV:
Si
volumeSnapshotClassNameapunta a un VolumeSnapshotClass válido, ACK aprovisiona automáticamente un VolumeSnapshotContent.Si
volumeSnapshotClassNamese omite o no es válido, cree manualmente un VolumeSnapshotContent y vincúlelo al VolumeSnapshot.
Si elimina un VolumeSnapshotContent, también se elimina la instantánea de volumen asociada.
Facturación
Las instantáneas de volumen se facturan como instantáneas de ECS. Consulte Snapshot billing.
Restricciones
Antes de crear una instantánea, revise las siguientes restricciones:
|
Condition |
Behavior |
|
Versión del complemento CSI < V1.22.12-b797ad9-aliyun |
Las instantáneas solo se pueden crear a partir de volúmenes de disco cuyo PVC esté adjunto a un pod en estado Running. |
|
Versión del complemento CSI >= V1.22.12-b797ad9-aliyun |
Las instantáneas se pueden crear desde cualquier volumen de disco en uso, sin importar el estado del pod. |
De forma predeterminada, instance access está habilitado para las instantáneas dinámicas de volúmenes Enhanced SSD (ESSD) y ESSD AutoPL en los niveles PL0 a PL3.
Backup center gestiona el ciclo de vida de los recursos VolumeSnapshot y VolumeSnapshotContent que crea la clase de instantánea csdr-disk-snapshot. Para evitar eliminar estos recursos por accidente, no modifique ni utilice esta clase de instantánea.
Crear una instantánea de volumen de forma dinámica
Tome una instantánea de un volumen de disco activo administrado por ACK. El sistema aprovisiona automáticamente el VolumeSnapshotContent y la instantánea de ECS subyacente.

Descripción general: cree un VolumeSnapshotClass (tarea del administrador) → despliegue una aplicación con un volumen de disco → cree un VolumeSnapshot (ACK genera automáticamente el VolumeSnapshotContent y la instantánea de ECS) → restaure los datos en un nuevo volumen a partir de la instantánea mediante un PVC.
Paso 1: Crear un VolumeSnapshotClass
Esta tarea corresponde al administrador. Si su clúster ya cuenta con un VolumeSnapshotClass, salte al Paso 2.
-
Cree el archivo
volumesnapshotclass.yamlcon el siguiente contenido:Parameter
Description
retentionDaysPeriodo de retención de la instantánea, en días.
forceDeleteComportamiento al eliminar la instantánea. Con
"true"se eliminan forzosamente todas las instantáneas; con"false"solo se eliminan las que no están en uso. Valor predeterminado:"false"para csi-provisioner 1.26.5-92f859a-aliyun y versiones posteriores;"true"para versiones anteriores.deletionPolicyDelete: elimina el VolumeSnapshotContent y la instantánea de ECS cuando se borra el VolumeSnapshot.Retain: conserva ambos elementos.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: default-snapclass driver: diskplugin.csi.alibabacloud.com parameters: retentionDays: "5" forceDelete: "true" deletionPolicy: Delete -
Aplique el manifiesto:
kubectl apply -f volumesnapshotclass.yaml
Paso 2: Desplegar una aplicación y escribir datos
-
Cree el archivo
nginx.yamlcon el siguiente contenido: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 -
Despliegue el StatefulSet:
kubectl apply -f nginx.yaml -
Compruebe que el pod se esté ejecutando:
kubectl get pod -l app=nginxResultado esperado:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82s -
Escriba datos de prueba en el volumen:
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /dataResultado esperado:
lost+found test
Paso 3: Crear un VolumeSnapshot
-
Cree el archivo
snapshot-1.yamlcon el siguiente contenido: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 -
Aplique el manifiesto:
kubectl apply -f snapshot-1.yaml
Paso 4: Comprobar la instantánea
-
Revise el estado del VolumeSnapshot:
kubectl get volumesnapshotsResultado esperado:
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 28sCuando
READYTOUSEmuestratrue, la instantánea está lista. -
Revise el VolumeSnapshotContent:
kubectl get VolumeSnapshotContentResultado esperado:
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
La instantánea de disco de ECS también aparece en la página Snapshots de la consola de ECS.
Paso 5 (opcional): Restaurar datos en una nueva aplicación
Para restaurar datos en un nuevo volumen, haga referencia a la instantánea en el bloque volumeClaimTemplates de un StatefulSet.
-
Cree el archivo
nginx-restore.yaml. El bloquedataSourcehace referencia a la instantánea que creó: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 -
Despliegue el StatefulSet:
kubectl apply -f nginx-restore.yaml -
Compruebe que los datos se hayan restaurado:
kubectl exec -it nginx-restore-0 -- ls /dataResultado esperado:
lost+found test
Paso 6 (opcional): Restaurar datos en un PVC independiente
Si necesita restaurar datos sin desplegar una carga de trabajo, cree un PVC directamente a partir de la instantánea.
-
Cree el archivo
pvc-restore.yamlcon el siguiente contenido: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 -
Cree el PVC:
La StorageClass
alicloud-disk-topology-alltypeutilizavolumeBindingMode: WaitForFirstConsumer. Por ello, el PVC permanece en estadoPendinghasta que se monta en un pod. No elimine el VolumeSnapshot, el VolumeSnapshotContent ni la instantánea de ECS subyacente antes de que el PVC se vincule.kubectl apply -f pvc-restore.yaml
Importar una instantánea de disco existente
Importe una instantánea de disco de ECS existente a un clúster de ACK sin necesidad de desplegar primero una aplicación.
Paso 1: Crear un VolumeSnapshotContent
Esta tarea corresponde al administrador.
-
Cree el archivo
snapshot-content.yaml. Reemplace<YOUR-SNAPSHOTID>con el ID de la instantánea que obtuvo en la página Snapshots de la consola de ECS:Parameter
Description
snapshotHandleEl ID de la instantánea de disco de ECS existente.
volumeSnapshotRef.nameEl nombre del VolumeSnapshot que se va a vincular. Debe coincidir con
metadata.nameen el manifiesto del VolumeSnapshot.volumeSnapshotRef.namespaceEl namespace del 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 -
Aplique el manifiesto:
kubectl apply -f snapshot-content.yaml
Paso 2: Crear un VolumeSnapshot y vincularlo
-
Cree el archivo
snapshot-2.yamlcon el siguiente contenido:Parameter
Description
metadata.nameEl nombre del VolumeSnapshot. Debe coincidir con
volumeSnapshotRef.nameen el VolumeSnapshotContent.volumeSnapshotContentNameEl nombre del VolumeSnapshotContent que se va a vincular.
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 -
Aplique el manifiesto:
kubectl apply -f snapshot-2.yaml
Paso 3 (opcional): Restaurar datos
Una vez establecido el vínculo, restaure los datos tal como se describe en el Paso 5 y el Paso 6 del flujo de trabajo de instantáneas dinámicas.