Fazer backup e restaurar o armazenamento permanente dos clusters do GKE

Nesta página, mostramos como fazer backup e restaurar o Filestore armazenamento associado aos clusters do GKE usando volumes snapshots.

Criar um snapshot de volume do Kubernetes é equivalente a criar um backup do Filestore.

Para mais informações, consulte Sobre snapshots de volume do Kubernetes.

Requisitos

Para usar snapshots de volume no GKE, você precisa atender aos seguintes requisitos:

  • Você precisa implantar o Driver CSI do Filestore: Apenas os níveis de serviço do Filestore a seguir têm suporte:

    • HDD básico com o GKE versão 1.21 ou posterior
    • SSD básico com o GKE versão 1.21 ou posterior
    • Por zona (10 TiB a 100 TiB) com o GKE versão 1.27 ou mais recente
    • Enterprise com o GKE versão 1.25 ou posterior
  • Use as versões 1.17 ou mais recentes do plano de controle. Para usar a propriedade Driver CSI do Filestore em um VolumeSnapshot, use o número de versão do GKE aplicável para seu nível de serviço.

  • Tenha um PersistentVolumeClaim para usar em um snapshot. O PersistentVolume que você usa para uma origem de snapshot precisa ser gerenciado por um driver CSI. Para saber se você está usando um driver CSI, verifique se a especificação do PersistentVolume tem uma seção csi com driver: pd.csi.storage.gke.io ou filestore.csi.storage.gke.io. Se o PersistentVolume for provisionado dinamicamente pelo driver CSI conforme descrito nas seções a seguir, ele será gerenciado pelo driver CSI.

Limitações

  • Os volumes de snapshots têm as mesmas restrições de tamanho que os volumes regulares. Por exemplo, os snapshots do Filestore precisam ser maiores ou iguais a 1 TiB para o nível HDD básico.

  • O driver CSI do Filestore não oferece suporte a fluxos de trabalho dinâmicos de provisionamento ou backup para os seguintes níveis de serviço do Filestore:

    • Por zona (1 TiB a 9,75 TiB)
    • Regional
  • Só é possível fazer backup de um compartilhamento por instância por vez. Em relação aos pools de armazenamento, as solicitações de backup emitidas por dois compartilhamentos distintos de duas instâncias diferentes do Filestore são executadas simultaneamente.

  • Os backups de compartilhamento único só podem ser restaurados para volumes de compartilhamento único. Usando o driver CSI do Filestore, só é possível restaurar um volume de compartilhamento único para uma nova instância do Filestore.

    • A nova instância precisa usar o mesmo nível de serviço do backup.
    • A nova instância precisa corresponder à mesma capacidade mínima que o backup.
  • As operações backup restore do Filestore para a origem ou uma instância atual do Filestore não são compatíveis. Para ver uma lista completa das limitações de recursos, consulte Limitações de recursos de backup do Filestore.

  • Os backups de compartilhamento múltiplo não são compatíveis.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Como criar e usar um snapshot de volume

Os exemplos neste documento mostram como fazer o seguinte:

  1. Crie um PersistentVolumeClaim e um Deployment.
  2. Adicione um arquivo a PersistentVolume usado pelo Deployment.
  3. Crie um VolumeSnapshotClass para configurar o snapshot.
  4. Crie um snapshot de volume do PersistentVolume.
  5. Exclua o arquivo de teste.
  6. Restaure o PersistentVolume para o snapshot criado.
  7. Verifique se a restauração funcionou.

Para usar um snapshot de volume, conclua as etapas a seguir:

  1. Crie um objeto VolumeSnapshotClass para especificar o driver CSI e a política de exclusão do snapshot.
  2. Crie um objeto VolumeSnapshot para solicitar um snapshot de um PersistentVolumeClaim existente.
  3. Faça referência ao VolumeSnapshot em um PersistentVolumeClaim para restaurar um volume para esse snapshot ou criar um novo volume usando o snapshot.

Criar um PersistentVolumeClaim e um Deployment

  1. Para criar o objeto PersistentVolumeClaim, salve o manifesto a seguir como my-pvc.yaml:

    Filestore

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: my-pvc
     spec:
       storageClassName: enterprise-rwx
       accessModes:
       - ReadWriteMany
       resources:
         requests:
           storage: 1Ti
    

    Este exemplo cria um PVC do Filestore de nível empresarial. Para saber mais, consulte Acessar instâncias do Filestore com o driver CSI do Filestore.

    Para spec.storageClassName, é possível especificar qualquer classe de armazenamento que use um driver CSI compatível.

  2. Aplique o manifesto:

    kubectl apply -f my-pvc.yaml
    
  3. Para criar um Deployment, salve o seguinte manifesto como my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    spec:
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. Aplique o manifesto:

    kubectl apply -f my-deployment.yaml
    
  5. Verifique o status de Deployment.

    kubectl get deployment hello-app
    

    Pode levar algum tempo para Deployment ficar pronto. Execute o comando anterior até ver uma saída semelhante a esta:

    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    hello-app   1/1     1            1           2m55s
    

Adicionar um arquivo de teste ao volume

  1. Liste o Pods no Deployment:

    kubectl get pods -l app=hello-app
    

    O resultado será assim:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. Crie um arquivo de teste em um Pod:

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    Substitua POD_NAME pelo nome do Pod.

  3. Verifique se o arquivo existe.

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    O resultado será assim:

    Hello World!
    

Criar um objeto VolumeSnapshotClass.

Crie um objeto VolumeSnapshotClass para especificar o driver CSI e deletionPolicy para o snapshot de volume. É possível referenciar objetos VolumeSnapshotClass ao criar objetos VolumeSnapshot.

  1. Salve o seguinte manifesto volumesnapshotclass.yaml como :

    Filestore

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: filestore.csi.storage.gke.io
    parameters:
      type: backup
    deletionPolicy: Delete
    

    Neste exemplo:

    • O campo driver é usado pelo driver CSI para provisionar o snapshot. Neste exemplo, filestore.csi.storage.gke.io usa o driver CSI do Filestore (em inglês).
    • O campo deletionPolicy informa ao GKE o que fazer com o objeto VolumeSnapshotContent e o snapshot subjacente quando o objeto VolumeSnapshot vinculado é excluído. Especifique Delete para excluir o objeto VolumeSnapshotContent e o snapshot subjacente. Especifique Retain se quiser manter VolumeSnapshotContent e o snapshot subjacente.
  2. Aplique o manifesto:

    kubectl apply -f volumesnapshotclass.yaml
    

Criar um VolumeSnapshot

Um objeto VolumeSnapshot é uma solicitação para um snapshot de um objeto PersistentVolumeClaim atual. Quando você cria um objeto VolumeSnapshot, o GKE o cria e o vincula automaticamente a um objeto VolumeSnapshotContent, que é um recurso no cluster como um objeto PersistentVolume.

  1. Salve o seguinte manifesto volumesnapshot.yaml como :

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

    kubectl apply -f volumesnapshot.yaml
    

    Depois de criar um snapshot Volume, o GKE cria um objeto VolumeSnapshotContent correspondente no cluster. Esse objeto armazena o snapshot e as vinculações dos objetos VolumeSnapshot. Você não interage diretamente com objetos VolumeSnapshotContents.

  3. Confirme se o GKE criou o objeto VolumeSnapshotContents:

    kubectl get volumesnapshotcontents
    

    O resultado será assim:

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

Depois que o conteúdo do snapshot de Volume é criado, o driver CSI especificado em VolumeSnapshotClass cria um snapshot no sistema de armazenamento correspondente. Depois que o GKE cria um snapshot no sistema de armazenamento e o vincula a um objeto VolumeSnapshot no cluster, o snapshot está pronto para uso. Verifique o status executando o seguinte comando:

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

Se o snapshot estiver pronto para uso, a saída será semelhante a esta:

NAME               READY
my-snapshot        true

Excluir o arquivo de teste

  1. Exclua o arquivo de teste que você criou:

    kubectl exec POD_NAME \
        -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. Verifique se o arquivo não existe mais:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    O resultado será assim:

    cat: /usr/share/hello/hello.txt: No such file or directory
    

Restaurar o snapshot do volume

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

    Filestore

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: enterprise-rwx
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Ti
    
  2. Aplique o manifesto:

    kubectl apply -f pvc-restore.yaml
    
  3. Atualize o arquivo my-deployment.yaml para usar o novo PersistentVolumeClaim:

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. Aplique o manifesto atualizado:

    kubectl apply -f my-deployment.yaml
    

Verificar se o snapshot foi restaurado

  1. Obtenha o nome do novo Pod que o GKE cria para o Deployment atualizado:

     kubectl get pods -l app=hello-app
    

Verifique se o arquivo de teste existe:

   kubectl exec NEW_POD_NAME \
       -- sh -c 'cat /usr/share/hello/hello.txt'

Substitua NEW_POD_NAME pelo nome do novo Pod criado pelo GKE.

O resultado será assim:

   Hello World!

Importar um snapshot preexistente

É possível usar um snapshot de volume atual criado fora do cluster atual para provisionar manualmente o objeto VolumeSnapshotContents. Por exemplo, é possível preencher um volume no GKE com um snapshot de outro recurso do Google Cloud criado em um cluster diferente.

  1. Localize o nome do snapshot.

    Console do Google Cloud

    Acesse https://console.cloud.google.com/compute/snapshots.

    Google Cloud CLI

    Execute este comando:

    gcloud compute snapshots list
    

    O resultado será assim:

    NAME                                           DISK_SIZE_GB  SRC_DISK                                                     STATUS
    snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0  1             us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY
    
  2. Salve o seguinte manifesto VolumeSnapshot como restored-snapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: restored-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        volumeSnapshotContentName: restored-snapshot-content
    
  3. Aplique o manifesto:

    kubectl apply -f restored-snapshot.yaml
    
  4. Salve o seguinte manifesto VolumeSnapshotContent como restored-snapshot-content.yaml. Substitua o campo snapshotHandle pelo ID do projeto e nome do snapshot. Tanto volumeSnapshotRef.name quanto volumeSnapshotRef.namespace precisam apontar para a VolumeSnapshot criada anteriormente para que a vinculação bidirecional seja válida.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotContent
    metadata:
      name: restored-snapshot-content
    spec:
      deletionPolicy: Retain
      driver: filestore.csi.storage.gke.io
      source:
        snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME
      volumeSnapshotRef:
        kind: VolumeSnapshot
        name: restored-snapshot
        namespace: default
    
  5. Aplique o manifesto:

    kubectl apply -f restored-snapshot-content.yaml
    
  6. Salve o seguinte manifesto PersistentVolumeClaim como restored-pvc.yaml. O controlador de armazenamento do Kubernetes encontrará um VolumeSnapshot chamado restored-snapshot e tentará encontrar ou criar dinamicamente um PersistentVolume como a fonte de dados. Depois, use esse PVC em um pod para acessar os dados restaurados.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restored-pvc
    spec:
      dataSource:
        name: restored-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: enterprise-rwx
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  7. Aplique o manifesto:

    kubectl apply -f restored-pvc.yaml
    
  8. Salve o manifesto Pod a seguir como restored-pod.yaml se referindo a PersistentVolumeClaim. O driver CSI provisionará um PersistentVolume e o preencherá a partir do snapshot.

    apiVersion: v1
    kind: Pod
    metadata:
      name: restored-pod
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "3600"
        volumeMounts:
        - name: source-data
          mountPath: /demo/data
      volumes:
      - name: source-data
        persistentVolumeClaim:
          claimName: restored-pvc
          readOnly: false
    
  9. Aplique o manifesto:

    kubectl apply -f restored-pod.yaml
    
  10. Verifique se o arquivo foi restaurado:

    kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
    

Limpar

Para evitar cobranças na conta do Google Cloud pelos recursos usados nesta página, siga estas etapas.

  1. Exclua o VolumeSnapshot:

    kubectl delete volumesnapshot my-snapshot
    
  2. Exclua o VolumeSnapshotClass:

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. Exclua o Deployment:

    kubectl delete deployments hello-app
    
  4. Excluir os objetos PersistentVolumeClaim:

    kubectl delete pvc my-pvc pvc-restore
    

A seguir