Crie um instantâneo de um PersistentVolume

Pode usar a funcionalidade de instantâneo de volume do Kubernetes para volumes persistentes e aprovisionamento dinâmico nos seus clusters do GKE.

Os instantâneos de volume permitem-lhe criar uma cópia do volume num ponto específico no tempo. Pode usar esta cópia para repor um volume num estado anterior ou para aprovisionar um volume de substituição.

Pode aprovisionar e anexar instantâneos de volumes com os seguintes componentes:

Requisitos

Para usar as cópias instantâneas de volume no GKE no AWS, tem de ter o seguinte:

  • Um volume que usa um controlador da interface de armazenamento de contentores (CSI) que suporta instantâneos. Os controladores do Elastic Block Store (EBS) que o GKE no AWS usa por predefinição suportam capturas de ecrã.

    Para ver uma lista de todos os controladores de CSI que suportam instantâneos, consulte a coluna "Outras funcionalidades" em Controladores na documentação do Kubernetes.

  • Ter um PersistentVolumeClaim existente para usar num instantâneo. O PersistentVolume que usa para uma origem de instantâneo tem de ser gerido por um controlador CSI. Pode verificar se está a usar um controlador CSI verificando se a especificação PersistentVolume tem uma secção csi com driver: ebs.csi.aws.com. Se o seu cluster Aprovisionar dinamicamente PersistentVolumes pelo controlador CSI, conforme descrito nas secções seguintes, é gerido pelo controlador CSI.

Antes de começar

Crie e use um instantâneo de volume

Os exemplos neste documento mostram como realizar as seguintes tarefas:

  1. Crie um exemplo PersistentVolumeClaim e Pod.
  2. Crie um VolumeSnapshot.
  3. Restaure a imagem instantânea do volume.
  4. Verifique se o restauro funcionou.

Para usar uma análise detalhada do volume, tem de concluir os seguintes passos:

  1. Crie um objeto VolumeSnapshot para pedir um instantâneo de um PersistentVolumeClaim existente.
  2. Faça referência ao VolumeSnapshot num PersistentVolumeClaim para restaurar um volume para essa imagem instantânea ou criar um novo volume com a imagem instantânea.

Crie um exemplo de PersistentVolumeClaim e Pod

  1. Para criar o objeto PersistentVolumeClaim, guarde o seguinte manifesto como example-pvc.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-pvc
    spec:
      storageClassName: standard-rwo
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    Para spec.storageClassName, pode especificar qualquer classe de armazenamento que use um controlador CSI suportado. Este exemplo usa a classe de armazenamento standard-rwo predefinida.

  2. Aplique o manifesto:

    kubectl apply -f example-pvc.yaml
    
  3. Crie um Pod que escreva a data e a hora atuais no volume. Para criar um Pod, guarde o seguinte manifesto como snapshot-shell.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. Aplique o manifesto:

    kubectl apply -f snapshot-shell.yaml
    
  5. Verifique o estado do Pod:

    kubectl get pod snapshot-shell
    

    Pode demorar algum tempo até que o Pod seja executado e concluído. Pode executar o comando anterior até ver um resultado semelhante ao seguinte:

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

Crie um VolumeSnapshot

Um objeto VolumeSnapshot é um pedido de uma captura de ecrã de um objeto PersistentVolumeClaim existente. Quando cria um objeto VolumeSnapshot, o cluster cria e associa-o automaticamente a um objeto VolumeSnapshotContent, que é um recurso no seu cluster, como um objeto PersistentVolume.

  1. Guarde o seguinte manifesto como volumesnapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. Aplique o manifesto:

    kubectl apply -f volumesnapshot.yaml
    

    Depois de criar uma captura instantânea de volume, o cluster cria um objeto VolumeSnapshotContent correspondente. Este objeto armazena a imagem instantânea e as associações de objetos VolumeSnapshot. Não interage diretamente com objetos VolumeSnapshotContents.

  3. Confirme que o cluster criou o objeto VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    O resultado é semelhante ao seguinte:

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

Confirme se a cópia instantânea de volume está pronta

Depois de criar o conteúdo da imagem instantânea do volume, o controlador CSI especificado no elemento VolumeSnapshotClass cria uma imagem instantânea no sistema de armazenamento correspondente. Depois de o cluster criar um instantâneo no sistema de armazenamento e associá-lo a um objeto VolumeSnapshot, o instantâneo está pronto a usar. Pode verificar o estado executando o seguinte comando:

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

Se o instantâneo estiver pronto a usar, o resultado é semelhante ao seguinte:

NAME                    READY
example-snapshot        true

Restaure o instantâneo de volume

Pode fazer referência a um VolumeSnapshot num PersistentVolumeClaim para aprovisionar um novo volume com dados de um volume existente ou restaurar um volume para um estado capturado na captura de ecrã.

Para fazer referência a um VolumeSnapshot num PersistentVolumeClaim, adicione o campo dataSource ao seu PersistentVolumeClaim.

Neste exemplo, faz referência ao VolumeSnapshot que criou num novo PersistentVolumeClaim e cria um Pod que monta o PersistentVolumeClaim.

  1. Guarde o seguinte manifesto como pvc-restore.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-snapshot
       kind: VolumeSnapshot
       apiGroup: snapshot.storage.k8s.io
     storageClassName: standard-rwo
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 1Gi
    
  2. Aplique o manifesto:

    kubectl apply -f pvc-restore.yaml
    
  3. Inicie um pod temporário que monte o PVC no pod e imprima o conteúdo de out.txt nos registos.

    Guarde o seguinte manifesto como restore-log.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. Aplique o manifesto:

    kubectl apply -f restore-log.yaml
    

Verifique se o instantâneo foi restaurado com êxito

O Pod que criou no passo anterior lê a partir do resumo. Para ver os dados do resumo, use o comando kubectl logs.

kubectl logs restore-verify

O resultado deve incluir uma indicação de tempo do instantâneo.

Limpar

Para evitar incorrer em custos pelos recursos usados nesta página, siga estes passos.

  1. Elimine o VolumeSnapshot:

    kubectl delete volumesnapshot example-snapshot
    

  2. Elimine o pod temporário:

    kubectl delete -f restore-log.yaml
    
  3. Elimine o Pod:

    kubectl delete -f snapshot-shell.yaml
    
  4. Elimine os PersistentVolumeClaim objetos:

    kubectl delete pvc example-pvc pvc-restore
    

O que se segue?