Google Kubernetes Engine에서 Parallelstore의 데이터 백업 및 복구

Parallelstore는 초대를 받아야만 사용 가능합니다. Google Cloud 프로젝트에서 Parallelstore에 대한 액세스 권한을 요청하려면 영업 담당자에게 문의하세요.

이 가이드에서는 (GKE) 연결된 Parallelstore 인스턴스의 데이터를 Cloud Storage 버킷에 백업하고 GKE CronJob을 구성하여 일정에 따라 데이터를 자동으로 백업하여 잠재적인 데이터 손실을 방지하는 방법을 설명합니다. 이 가이드에서는 Parallelstore 인스턴스의 데이터를 복구하는 방법도 설명합니다.

시작하기 전에

GKE에서 Parallelstore 인스턴스 만들기 및 연결에 따라 GKE 클러스터와 Parallelstore 인스턴스를 설정합니다.

데이터 백업

다음 섹션에서는 데이터 손실을 방지하기 위해 GKE 클러스터의 Parallelstore 인스턴스에서 데이터를 지속적으로 백업하도록 GKE CronJob을 설정하는 방법을 설명합니다.

GKE 클러스터에 연결

GKE 클러스터의 사용자 인증 정보를 가져옵니다.

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

다음을 바꿉니다.

  • CLUSTER_NAME: GKE 클러스터 이름입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID
  • CLUSTER_LOCATION: 클러스터를 포함하는 Compute Engine 영역입니다. 클러스터가 Parallelstore CSI 드라이버에 지원되는 영역에 있어야 합니다.

필요한 권한 프로비저닝

GKE CronJob이 Cloud Storage와 Parallelstore 간에 데이터를 가져오고 내보내려면 roles/parallelstore.adminroles/storage.admin 역할이 필요합니다.

Google Cloud 서비스 계정을 만듭니다.

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

Google Cloud 서비스 계정 역할 부여

서비스 계정에 Parallelstore 관리자 및 Cloud Storage 관리자 역할을 부여합니다.

    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

GKE 서비스 계정 설정

GKE 서비스 계정을 설정하고 Google Cloud 서비스 계정을 가장하도록 허용해야 합니다. 다음 단계에 따라 GKE 서비스 계정이 Google Cloud 서비스 계정에 바인딩되도록 허용합니다.

  1. 다음 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
    

    그런 다음 다음 명령어를 사용하여 GKE 클러스터에 배포합니다.

      kubectl apply -f parallelstore-sa.yaml
    
  2. GKE 서비스 계정이 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
    

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

다음을 바꿉니다.

  • GCS_BUCKET: gs://<bucket_name> 형식의 Cloud Storage 버킷 URI입니다.
  • PROJECT_NUMBER: Google Cloud 프로젝트 번호입니다.

CronJob 시작

Parallelstore에서 Cloud Storage로 데이터를 주기적으로 내보내기 위한 GKE CronJob을 구성하고 시작합니다.

CronJob의 구성 파일 ps-to-gcs-backup.yaml을 만듭니다.

  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

다음 변수를 바꿉니다.

  • PSTORE_MOUNT_PATH: Parallelstore 인스턴스의 마운트 경로입니다. 이 컨테이너에 정의된 volumeMount와 일치해야 합니다.
  • PSTORE_PV_NAME: Parallelstore 인스턴스를 가리키는 GKE PersistentVolume의 이름입니다. 이는 기본 요건의 일부로 GKE 클러스터에서 설정되어 있어야 합니다.
  • PSTORE_PVC_NAME: Parallelstore PersistentVolume의 사용을 요청하는 GKE PersistentVolumeClaim의 이름입니다. 이는 기본 요건의 일부로 GKE 클러스터에 설정되어 있어야 합니다.
  • PSTORE_NAME: 백업이 필요한 Parallelstore 인스턴스의 이름입니다.
  • PSTORE_LOCATION: 백업이 필요한 Parallelstore 인스턴스의 위치입니다.
  • SOURCE_PARALLELSTORE_PATH: 볼륨 마운트 경로가 없는 Parallelstore 인스턴스의 절대 경로이며 /로 시작해야 합니다.
  • DESTINATION_GCS_URI: Cloud Storage 버킷 URI(Cloud Storage 버킷 또는 버킷 내 경로)입니다. gs://<bucket_name>/<optional_path_inside_bucket> 형식을 사용합니다.
  • DELETE_AFTER_BACKUP: 백업 후 Parallelstore에서 이전 데이터를 삭제하고 공간을 확보할지 여부를 결정하는 구성입니다. 지원되는 값은 true 또는 false입니다.

다음 명령어를 사용하여 CronJob을 GKE 클러스터에 배포합니다.

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

CronJob 설정에 관한 자세한 내용은 CronJob을 참고하세요.

데이터 손실 감지

Parallelstore 인스턴스의 상태가 FAILED이면 인스턴스의 데이터에 더 이상 액세스할 수 없습니다. 다음 Google Cloud CLI 명령어를 사용하여 Parallelstore 인스턴스의 상태를 확인할 수 있습니다.

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

데이터 복구

재해가 발생하거나 어떤 이유로든 Parallelstore 인스턴스가 실패하면 GKE VolumePopulator를 사용하여 Cloud Storage의 데이터를 GKE 관리 Parallelstore 인스턴스에 자동으로 미리 로드하거나 새 Parallelstore 인스턴스를 수동으로 만들고 Cloud Storage 백업에서 데이터를 가져올 수 있습니다.

워크로드의 체크포인트에서 복구하는 경우 Cloud Storage 버킷 내의 경로를 제공하여 복구할 체크포인트를 결정해야 합니다.

내보내기 작업 중간에 Parallelstore 인스턴스가 실패한 경우 Cloud Storage의 Parallelstore 내보내기에 일부 데이터가 있을 수 있습니다. Parallelstore로 가져오고 워크로드를 재개하기 전에 대상 Cloud Storage 위치에서 데이터가 완전한지 확인합니다.

GKE 볼륨 포퓰레이터

GKE 볼륨 포퓰레이터를 사용하여 Cloud Storage 버킷 경로에서 새로 생성된 Parallelstore 인스턴스로 데이터를 미리 로드할 수 있습니다. 이에 관한 안내는 Parallelstore 미리 로드를 참고하세요.

수동 복구

다음 단계에 따라 Parallelstore 인스턴스를 수동으로 만들고 Cloud Storage 버킷에서 데이터를 가져올 수도 있습니다.

  1. 새 Parallelstore 인스턴스를 만듭니다.

      gcloud beta parallelstore instances create PARALLELSTORE_NAME \
        --capacity-gib=CAPACITY_GIB \
        --location=PARALLELSTORE_LOCATION \
        --network=NETWORK_NAME \
        --project=PROJECT_ID
    
  2. 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
    

다음을 바꿉니다.

  • PARALLELSTORE_NAME: 이 Parallelstore 인스턴스의 이름입니다.
  • CAPACITY_GIB: Parallelstore 인스턴스의 스토리지 용량(GB)입니다. 값은 12000~100000이며 4000의 배수입니다.
  • PARALLELSTORE_LOCATION: 백업이 필요한 Parallelstore 인스턴스의 위치입니다. 지원되는 영역에 있어야 합니다.
  • NETWORK_NAME: VPC 네트워크 구성 중에 만든 VPC 네트워크의 이름입니다. GKE 클러스터에서 사용하는 네트워크와 동일해야 하며 Private Services Access가 사용 설정되어 있어야 합니다.
  • SOURCE_GCS_URI: Cloud Storage 버킷의 Cloud Storage 버킷 URI 또는 gs://<bucket_name>/<optional_path_inside_bucket> 형식을 사용하여 가져오려는 데이터가 있는 버킷 내 경로입니다.
  • DESTINATION_PARALLELSTORE_PATH: 데이터를 가져올 Parallelstore 인스턴스의 절대 경로입니다. /로 시작해야 합니다.

Parallelstore 인스턴스로 데이터를 가져오는 방법에 관한 자세한 내용은 Cloud Storage로 또는 Cloud Storage에서 데이터 전송을 참고하세요.