Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Criar um snapshot de volume de disco

Última atualização: Jun 27, 2026

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 volumeSnapshotClassName estiver definido como uma VolumeSnapshotClass válida, o ACK provisiona automaticamente um VolumeSnapshotContent.

  • Caso volumeSnapshotClassName seja omitido ou inválido, crie manualmente um VolumeSnapshotContent e vincule-o ao VolumeSnapshot.

Importante

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.

snapshot

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.
  1. Crie o arquivo volumesnapshotclass.yaml com o seguinte conteúdo:

    Parâmetro

    Descrição

    retentionDays

    Período de retenção do snapshot, em dias.

    forceDelete

    Comportamento 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.

    deletionPolicy

    Delete: 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
  2. Aplique o manifesto:

    kubectl apply -f volumesnapshotclass.yaml

Etapa 2: Implantar uma aplicação e gravar dados

  1. Crie o arquivo nginx.yaml com 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
  2. Implante o StatefulSet:

    kubectl apply -f nginx.yaml
  3. Verifique se o pod está em execução:

    kubectl get pod -l app=nginx

    Saída esperada:

    NAME        READY   STATUS    RESTARTS   AGE
    nginx-0     1/1     Running   0          82s
  4. Grave dados de teste no volume:

    kubectl exec -it nginx-0 -- touch /data/test
    kubectl exec -it nginx-0 -- ls /data

    Saída esperada:

    lost+found test

Etapa 3: Criar um VolumeSnapshot

  1. Crie o arquivo snapshot-1.yaml com 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
  2. Aplique o manifesto:

    kubectl apply -f snapshot-1.yaml

Etapa 4: Verificar o snapshot

  1. Verifique o status do VolumeSnapshot:

    kubectl get volumesnapshots

    Saí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            28s

    Quando READYTOUSE for true, o snapshot estará pronto.

  2. Verifique o VolumeSnapshotContent:

    kubectl get VolumeSnapshotContent

    Saí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.

  1. Crie o arquivo nginx-restore.yaml . O bloco dataSource referencia 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
  2. Implante o StatefulSet:

    kubectl apply -f nginx-restore.yaml
  3. Verifique se os dados foram restaurados:

    kubectl exec -it nginx-restore-0 -- ls /data

    Saí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.

  1. Crie o arquivo pvc-restore.yaml com 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
  2. Crie a PVC:

    A StorageClass alicloud-disk-topology-alltype utiliza volumeBindingMode: WaitForFirstConsumer . A PVC permanece no estado Pending até 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.
  1. 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

    snapshotHandle

    ID do snapshot de disco do ECS existente.

    volumeSnapshotRef.name

    Nome do VolumeSnapshot a ser vinculado. Deve corresponder a metadata.name no manifesto do VolumeSnapshot.

    volumeSnapshotRef.namespace

    Namespace 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
  2. Aplique o manifesto:

    kubectl apply -f snapshot-content.yaml

Etapa 2: Criar e vincular um VolumeSnapshot

  1. Crie o arquivo snapshot-2.yaml com o seguinte conteúdo:

    Parâmetro

    Descrição

    metadata.name

    Nome do VolumeSnapshot. Deve corresponder a volumeSnapshotRef.name no VolumeSnapshotContent.

    volumeSnapshotContentName

    Nome 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
  2. 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.