Cópia de segurança e recuperação de dados para o Parallelstore no Google Kubernetes Engine

A Parallelstore está disponível apenas por convite. Se quiser pedir acesso à Parallelstore no seu Google Cloud projeto, contacte o seu representante de vendas.

Este guia descreve como pode fazer uma cópia de segurança dos dados na sua instância do Parallelstore ligada ao GKE para um contentor do Cloud Storage e evitar uma potencial perda de dados configurando um GKE CronJob para fazer automaticamente uma cópia de segurança dos dados de acordo com um agendamento. Este guia também descreve como pode recuperar dados de uma instância do Parallelstore.

Antes de começar

Siga os passos em Crie e ligue-se a uma instância do Parallelstore a partir do GKE para configurar o cluster do GKE e a instância do Parallelstore.

Cópia de segurança dos dados

A secção seguinte descreve como pode configurar um GKE CronJob para fazer cópias de segurança contínuas dos seus dados a partir de uma instância do Parallelstore no cluster do GKE para evitar a perda de dados.

Ligue-se ao seu cluster do GKE

Obtenha as credenciais do seu cluster do GKE:

    gcloud container clusters get-credentials CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=CLUSTER_LOCATION

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster do GKE.
  • PROJECT_ID: o Google Cloud ID do projeto.
  • CLUSTER_LOCATION: a zona do Compute Engine que contém o cluster. O cluster tem de estar numa zona suportada para o controlador CSI Parallelstore.

Disponibilize as autorizações necessárias

O seu GKE CronJob precisa das funções roles/parallelstore.admin e roles/storage.admin para importar e exportar dados entre o Cloud Storage e o Parallelstore.

Crie uma Google Cloud conta de serviço

    gcloud iam service-accounts create parallelstore-sa \
      --project=PROJECT_ID

Conceda as Google Cloud funções da conta de serviço

Conceda as funções de administrador do Parallelstore e administrador do Cloud Storage à conta de serviço.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/parallelstore.admin
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member serviceAccount:parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/storage.admin

Configure uma conta de serviço do GKE

Tem de configurar uma conta de serviço do GKE e permitir que use a identidade da Google Cloud conta de serviço. Use os passos seguintes para permitir que a conta de serviço do GKE seja associada à conta de serviço. Google Cloud

  1. Crie o seguinte manifesto da conta de serviço parallelstore-sa.yaml:

      # GKE service account used by workload and will have access to Parallelstore and GCS
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: parallelstore-sa
        namespace: default
    

    Em seguida, implemente-o no cluster do GKE através deste comando:

      kubectl apply -f parallelstore-sa.yaml
    
  2. Permita que a conta de serviço do GKE use a identidade da conta de serviço do Google Cloud .

      # Bind the GCP SA and GKE SA
      gcloud iam service-accounts add-iam-policy-binding parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:PROJECT_ID.svc.id.goog[default/parallelstore-sa]"
    
      # Annotate the GKE SA with GCP SA
      kubectl annotate serviceaccount parallelstore-sa \
          --namespace default \
      iam.gke.io/gcp-service-account=parallelstore-sa@PROJECT_ID.iam.gserviceaccount.com
    

Conceda autorizações à conta de serviço do agente do Parallelstore

    gcloud storage buckets add-iam-policy-binding GCS_BUCKET \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-parallelstore.iam.gserviceaccount.com \
      --role=roles/storage.admin

Substitua o seguinte:

  • GCS_BUCKET: o URI do contentor do Cloud Storage no formato gs://<bucket_name>.
  • PROJECT_NUMBER: o Google Cloud número do projeto.

Inicie o CronJob

Configure e inicie um GKE CronJob para exportar periodicamente dados do Parallelstore para o Cloud Storage.

Crie o ficheiro de configuração ps-to-gcs-backup.yaml para o CronJob:

  apiVersion: batch/v1
  kind: CronJob
  metadata:
    name: ps-to-gcs-backup
  spec:
    concurrencyPolicy: Forbid
    failedJobsHistoryLimit: 1
    schedule: "0 * * * *"
    successfulJobsHistoryLimit: 3
    suspend: false
    jobTemplate:
      spec:
        template:
          metadata:
            annotations:
              gke-parallelstore/cpu-limit: "0"
              gke-parallelstore/ephemeral-storage-limit: "0"
              gke-parallelstore/memory-limit: "0"
              gke-parallelstore/volumes: "true"
          spec:
            serviceAccountName: parallelstore-sa
            containers:
            - name: pstore-backup
              image: google/cloud-sdk:slim
              imagePullPolicy: IfNotPresent
              command:
              - /bin/bash
              - -c
              - |
                #!/bin/bash
                set -ex

                # Retrieve modification timestamp for the latest file up to the minute
                latest_folder_timestamp=$(find $PSTORE_MOUNT_PATH/$SOURCE_PARALLELSTORE_PATH -type d -printf  '%T@ %p\n'| sort -n | tail -1 | cut -d' ' -f2- | xargs -I{} stat -c %x {} | xargs -I {} date -d {} +"%Y-%m-%d %H:%M")

                # Start exporting from PStore to GCS
                operation=$(gcloud beta parallelstore instances export-data $PSTORE_NAME \
                  --location=$PSTORE_LOCATION \
                  --source-parallelstore-path=$SOURCE_PARALLELSTORE_PATH \
                  --destination-gcs-bucket-uri=$DESTINATION_GCS_URI \
                  --async \
                  --format="value(name)")

                # Wait until operation complete
                while true; do
                  status=$(gcloud beta parallelstore operations describe $operation \
                    --location=$PSTORE_LOCATION \
                    --format="value(done)")
                  if [ "$status" == "True" ]; then
                    break
                  fi
                  sleep 60
                done

                # Check if export succeeded
                error=$(gcloud beta parallelstore operations describe $operation \
                  --location=$PSTORE_LOCATION \
                  --format="value(error)")
                if [ "$error" != "" ]; then
                  echo "!!! ERROR while exporting data !!!"
                fi

                # Delete the old files from PStore if requested
                # This will not delete the folder with the latest modification timestamp
                if $DELETE_AFTER_BACKUP && [ "$error" == "" ]; then
                  find $PSTORE_MOUNT_PATH/$SOURCE_PARALLELSTORE_PATH -type d -mindepth 1 |
                    while read dir; do
                        # Only delete folders that is modified earlier than the latest modification timestamp
                        folder_timestamp=$(stat -c %y $dir)
                        if [ $(date -d "$folder_timestamp" +%s) -lt $(date -d "$latest_folder_timestamp" +%s) ]; then
                          echo "Deleting $dir"
                          rm -rf "$dir"
                        fi
                    done
                fi
              env:
              - name: PSTORE_MOUNT_PATH # mount path of the Parallelstore instance, should match the volumeMount defined for this container
                value: "PSTORE_MOUNT_PATH"
              - name: PSTORE_NAME # name of the Parallelstore instance that need backup
                value: "PSTORE_NAME"
              - name: PSTORE_LOCATION # location/zone of the Parallelstore instance that need backup
                value: "PSTORE_LOCATION"
              - name: SOURCE_PARALLELSTORE_PATH # absolute path from the PStore instance, without volume mount path
                value: "SOURCE_PARALLELSTORE_PATH"
              - name: DESTINATION_GCS_URI # GCS bucket uri used for storing backups, starting with "gs://"
                value: "DESTINATION_GCS_URI"
              - name: DELETE_AFTER_BACKUP # will delete old data from Parallelstore if true
                value: "DELETE_AFTER_BACKUP"
              volumeMounts:
              - mountPath: PSTORE_MOUNT_PATH # should match the value of env var PSTORE_MOUNT_PATH
                name: PSTORE_PV_NAME
            dnsPolicy: ClusterFirst
            restartPolicy: OnFailure
            terminationGracePeriodSeconds: 30
            volumes:
            - name: PSTORE_PV_NAME
              persistentVolumeClaim:
                claimName: PSTORE_PVC_NAME

Substitua as seguintes variáveis:

  • PSTORE_MOUNT_PATH: O caminho de montagem da instância do Parallelstore. Deve corresponder ao volumeMount definido para este contentor.
  • PSTORE_PV_NAME: o nome do GKE PersistentVolume que aponta para a sua instância do Parallelstore. Esta deve ter sido configurada no cluster do GKE como parte dos pré-requisitos.
  • PSTORE_PVC_NAME: O nome do GKE PersistentVolumeClaim que pede a utilização do Parallelstore PersistentVolume. Esta opção deve ter sido configurada no cluster do GKE como parte dos pré-requisitos.
  • PSTORE_NAME: o nome da instância do Parallelstore que precisa de uma cópia de segurança.
  • PSTORE_LOCATION: a localização da instância do Parallelstore que precisa de uma cópia de segurança.
  • SOURCE_PARALLELSTORE_PATH: o caminho absoluto da instância do Parallelstore sem o caminho de montagem do volume e tem de começar com /.
  • DESTINATION_GCS_URI: O URI do contentor do Cloud Storage para um contentor do Cloud Storage ou um caminho num contentor, usando o formato de gs://<bucket_name>/<optional_path_inside_bucket>.
  • DELETE_AFTER_BACKUP: a configuração para decidir se deve eliminar dados antigos do Parallelstore após a cópia de segurança e libertar espaço. Valores suportados: true ou false.

Implemente o CronJob no cluster do GKE através do seguinte comando:

  kubectl apply -f ps-to-gcs-backup.yaml

Consulte o artigo CronJob para ver mais detalhes sobre a configuração de um CronJob.

Detetar perda de dados

Quando o estado de uma instância do Parallelstore é FAILED, os dados na instância podem deixar de estar acessíveis. Pode usar o seguinte comando da Google Cloud CLI para verificar o estado da instância do Parallelstore:

    gcloud beta parallelstore instances describe PARALLELSTORE_NAME \
    --location=PARALLELSTORE_LOCATION \
    --format="value(state)"

Recuperação de dados

Quando ocorre um desastre ou a instância do Parallelstore falha por qualquer motivo, pode usar o VolumePopulator do GKE para pré-carregar automaticamente dados do Cloud Storage numa instância do Parallelstore gerida pelo GKE ou criar manualmente uma nova instância do Parallelstore e importar dados de uma cópia de segurança do Cloud Storage.

Se estiver a fazer a recuperação a partir de um ponto de verificação da sua carga de trabalho, tem de decidir a partir de que ponto de verificação quer fazer a recuperação. Para isso, indique o caminho no bucket do Cloud Storage.

A exportação do Parallelstore no Cloud Storage pode ter dados parciais se a instância do Parallelstore falhar a meio da operação de exportação. Verifique se os dados estão completos na localização do Cloud Storage de destino antes de os importar para o Parallelstore e retomar a sua carga de trabalho.

GKE Volume Populator

O GKE Volume Populator pode ser usado para pré-carregar dados de um caminho de contentor do Cloud Storage numa instância do Parallelstore recém-criada. Pode encontrar instruções para isto em Pré-carregue o Parallelstore.

Recuperação manual

Também pode criar uma instância do Parallelstore manualmente e importar dados de um contentor do Cloud Storage com os seguintes passos.

  1. Crie uma nova instância da Parallelstore:

      gcloud beta parallelstore instances create PARALLELSTORE_NAME \
        --capacity-gib=CAPACITY_GIB \
        --location=PARALLELSTORE_LOCATION \
        --network=NETWORK_NAME \
        --project=PROJECT_ID
    
  2. Importe dados do Cloud Storage:

      gcloud beta parallelstore instances import-data PARALLELSTORE_NAME \
        --location=PARALLELSTORE_LOCATION \
        --source-gcs-bucket-uri=SOURCE_GCS_URI \
        --destination-parallelstore-path=DESTINATION_PARALLELSTORE_PATH \
        --async
    

Substitua o seguinte:

  • PARALLELSTORE_NAME: o nome desta instância do Parallelstore.
  • CAPACITY_GIB: A capacidade de armazenamento da instância Parallelstore em GB, valor de 12000 a 100000, em múltiplos de 4000.
  • PARALLELSTORE_LOCATION: a localização da instância do Parallelstore que precisa de uma cópia de segurança. Tem de estar na zona suportada.
  • NETWORK_NAME: o nome da rede VPC que criou durante o passo Configure uma rede VPC. Tem de ser a mesma rede que o cluster do GKE usa e ter o Private Services Access ativado.
  • SOURCE_GCS_URI: o URI do contentor do Cloud Storage para um contentor do Cloud Storage ou um caminho num contentor onde tem os dados que quer importar, usando o formato de gs://<bucket_name>/<optional_path_inside_bucket>.
  • DESTINATION_PARALLELSTORE_PATH: o caminho absoluto da instância do Parallelstore para a qual quer importar os dados tem de começar por /.

Pode encontrar mais detalhes sobre a importação de dados para uma instância do Parallelstore em Transferir dados para ou a partir do Cloud Storage.