Os snapshots de volume ajudam a fazer backup e restaurar dados de aplicações. Este tópico explica como criar snapshots para volumes de disco com recursos VolumeSnapshot e como restaurar dados a partir deles.
Os snapshots de volume permitem fazer backup dos dados do StatefulSet antes de operações arriscadas — como atualizações ou alterações de esquema — e restaurá-los em um novo volume, se necessário.
Pré-requisitos
Verifique os seguintes requisitos:
Um cluster gerenciado ACK executando Kubernetes 1.18 ou posterior
O serviço Snapshot do Elastic Compute Service (ECS) ativado (a ativação é gratuita; o custo aplica-se apenas aos snapshots criados).
Como funciona
Clusters ACK utilizam volumes de disco para armazenamento persistente do StatefulSet. Os snapshots de volume baseiam-se nos snapshots de disco do ECS e em dois mecanismos do Kubernetes:
VolumeSnapshot: faz backup dos dados do volume de disco
DataSource: campo da PersistentVolumeClaim (PVC) que restaura os dados do snapshot em um novo volume
O ACK implementa snapshots por meio de três CustomResourceDefinitions (CRDs):
|
Recurso |
Descrição |
|
VolumeSnapshotContent |
Snapshot de disco com escopo de cluster, provisionado por um administrador. Análogo a um PersistentVolume (PV). |
|
VolumeSnapshot |
Solicitação de usuário com escopo de namespace para um snapshot de volume. Análogo a uma PVC. |
|
VolumeSnapshotClass |
Define o driver e os parâmetros para criação do snapshot. Análogo à StorageClass, mas específico para snapshots — o mesmo volume pode ter snapshots com atributos diferentes (por exemplo, períodos de retenção distintos). |
O VolumeSnapshot e o VolumeSnapshotContent vinculam-se na proporção de um para um, assim como PVC e PV:
Se
volumeSnapshotClassNameestiver definido como uma VolumeSnapshotClass válida, o ACK provisiona automaticamente um VolumeSnapshotContent.Caso
volumeSnapshotClassNameseja omitido ou inválido, crie manualmente um VolumeSnapshotContent e vincule-o ao VolumeSnapshot.
Excluir um VolumeSnapshotContent também remove o snapshot de volume associado.
Faturamento
Os snapshots de volume são faturados como snapshots do ECS. Consulte Faturamento de snapshots.
Restrições
Antes de criar um snapshot, verifique as restrições abaixo:
|
Condição |
Comportamento |
|
Versão do complemento CSI < V1.22.12-b797ad9-aliyun |
A criação de snapshots só é possível em volumes de disco com uma PVC anexada a um pod em estado Running. |
|
Versão do plug-in CSI >= V1.22.12-b797ad9-aliyun |
É possível criar snapshots de qualquer volume de disco em uso, independentemente do estado do pod. |
Por padrão, o acesso à instância vem habilitado para snapshots dinâmicos de volumes Enhanced SSD (ESSD) e ESSD AutoPL nos níveis PL0–PL3.
Criar um snapshot de volume dinamicamente
Crie um snapshot de um volume de disco ativo gerenciado pelo ACK. O sistema provisiona automaticamente o VolumeSnapshotContent e o snapshot subjacente do ECS.

Visão geral: crie uma VolumeSnapshotClass (administrador) → implante uma aplicação com um volume de disco → crie um VolumeSnapshot (o ACK cria automaticamente o VolumeSnapshotContent e o snapshot do ECS) → restaure os dados em um novo volume a partir do snapshot via PVC.
Etapa 1: Criar uma VolumeSnapshotClass
Esta é uma tarefa de administrador. Pule para a Etapa 2 caso seu cluster já possua uma VolumeSnapshotClass.
-
Crie o arquivo
volumesnapshotclass.yamlcom o seguinte conteúdo:Parâmetro
Descrição
retentionDaysPeríodo de retenção do snapshot, em dias.
forceDeleteComportamento durante a exclusão do snapshot.
"true"força a exclusão de todos os snapshots;"false"exclui apenas os snapshots não utilizados. Padrão:"false"para csi-provisioner 1.26.5-92f859a-aliyun e posteriores;"true"para versões anteriores.deletionPolicyDelete: exclui o VolumeSnapshotContent e o snapshot do ECS quando o VolumeSnapshot é removido.Retain: mantém ambos.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 o manifesto:
kubectl apply -f volumesnapshotclass.yaml
Etapa 2: Implantar uma aplicação e gravar dados
-
Crie o arquivo
nginx.yamlcom o seguinte conteúdo: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 -
Implante o StatefulSet:
kubectl apply -f nginx.yaml -
Verifique se o pod está em execução:
kubectl get pod -l app=nginxSaída esperada:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82s -
Grave dados de teste no volume:
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /dataSaída esperada:
lost+found test
Etapa 3: Criar um VolumeSnapshot
-
Crie o arquivo
snapshot-1.yamlcom o seguinte conteúdo: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 o manifesto:
kubectl apply -f snapshot-1.yaml
Etapa 4: Verificar o snapshot
-
Verifique o status do VolumeSnapshot:
kubectl get volumesnapshotsSaída esperada:
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 28sQuando
READYTOUSEfortrue, o snapshot estará pronto. -
Verifique o VolumeSnapshotContent:
kubectl get VolumeSnapshotContentSaída esperada:
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
O snapshot de disco do ECS também aparece na página Snapshots no console do ECS .
Etapa 5 (opcional): Restaurar dados em uma nova aplicação
Referencie o snapshot no campo volumeClaimTemplates do StatefulSet para restaurar dados em um novo volume.
-
Crie o arquivo
nginx-restore.yaml. O blocodataSourcereferencia o snapshot criado anteriormente: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 -
Implante o StatefulSet:
kubectl apply -f nginx-restore.yaml -
Verifique se os dados foram restaurados:
kubectl exec -it nginx-restore-0 -- ls /dataSaída esperada:
lost+found test
Etapa 6 (opcional): Restaurar dados em uma PVC independente
Para restaurar dados sem implantar uma carga de trabalho, crie uma PVC diretamente a partir do snapshot.
-
Crie o arquivo
pvc-restore.yamlcom o seguinte conteúdo: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 -
Crie a PVC:
A StorageClass
alicloud-disk-topology-alltypeutilizavolumeBindingMode: WaitForFirstConsumer. A PVC permanece no estadoPendingaté ser montada em um pod. Não exclua o VolumeSnapshot, o VolumeSnapshotContent ou o snapshot subjacente do ECS antes que a PVC seja vinculada.kubectl apply -f pvc-restore.yaml
Importar um snapshot de disco existente
Importe um snapshot de disco do ECS existente para um cluster ACK sem precisar implantar uma aplicação previamente.
Etapa 1: Criar um VolumeSnapshotContent
Esta é uma tarefa de administrador.
-
Crie o arquivo
snapshot-content.yaml. Substitua<YOUR-SNAPSHOTID>pelo ID do snapshot obtido na página Snapshots do console do ECS:Parâmetro
Descrição
snapshotHandleID do snapshot de disco do ECS existente.
volumeSnapshotRef.nameNome do VolumeSnapshot a ser vinculado. Deve corresponder a
metadata.nameno manifesto do VolumeSnapshot.volumeSnapshotRef.namespaceNamespace do 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 o manifesto:
kubectl apply -f snapshot-content.yaml
Etapa 2: Criar e vincular um VolumeSnapshot
-
Crie o arquivo
snapshot-2.yamlcom o seguinte conteúdo:Parâmetro
Descrição
metadata.nameNome do VolumeSnapshot. Deve corresponder a
volumeSnapshotRef.nameno VolumeSnapshotContent.volumeSnapshotContentNameNome do VolumeSnapshotContent a ser vinculado.
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 o manifesto:
kubectl apply -f snapshot-2.yaml
Etapa 3 (opcional): Restaurar dados
Após a vinculação, restaure os dados conforme descrito na Etapa 5 e na Etapa 6 do fluxo de trabalho de snapshot dinâmico.