En esta guía, se describe cómo puedes crear copias de seguridad de los datos en tu instancia de Parallelstore conectada (GKE) en un bucket de Cloud Storage y evitar la posible pérdida de datos configurando un CronJob de GKE para crear copias de seguridad de los datos automáticamente según un programa. En esta guía, también se describe cómo puedes recuperar datos de una instancia de Parallelstore.
Antes de comenzar
Sigue los pasos que se indican en Crea una instancia de Parallelstore y conéctate a ella desde GKE para configurar tu clúster de GKE y tu instancia de Parallelstore.
Copia de seguridad de datos
En la siguiente sección, se describe cómo puedes configurar un CronJob de GKE para crear copias de seguridad continuas de tus datos desde una instancia de Parallelstore en el clúster de GKE y evitar la pérdida de datos.
Conéctate a tu clúster de GKE
Obtén las credenciales para tu clúster de GKE:
gcloud container clusters get-credentials CLUSTER_NAME \
--project=PROJECT_ID \
--location=CLUSTER_LOCATION
Reemplaza lo siguiente:
- CLUSTER_NAME: Es el nombre del clúster de GKE.
- PROJECT_ID: El ID del proyecto de Google Cloud
- CLUSTER_LOCATION: Es la zona de Compute Engine que contiene el clúster. Tu clúster debe estar en una zona admitida para el controlador CSI de Parallelstore.
Proporciona los permisos necesarios
Tu CronJob de GKE necesita los roles roles/parallelstore.admin
y roles/storage.admin
para importar y exportar datos entre Cloud Storage y Parallelstore.
Crea una Google Cloud cuenta de servicio
gcloud iam service-accounts create parallelstore-sa \
--project=PROJECT_ID
Otorga los roles de la cuenta de servicio Google Cloud .
Otorga los roles de administrador de Parallelstore y administrador de Cloud Storage a la cuenta de servicio.
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
Configura una cuenta de servicio de GKE
Debes configurar una cuenta de servicio de GKE y permitirle suplantar la identidad de la cuenta de servicio de Google Cloud . Sigue estos pasos para permitir que la cuenta de servicio de GKE se vincule a la cuenta de servicio de Google Cloud .
Crea el siguiente manifiesto de la cuenta de servicio
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
A continuación, impleméntalo en tu clúster de GKE con este comando:
kubectl apply -f parallelstore-sa.yaml
Permite que la cuenta de servicio de GKE suplante a la cuenta de servicio 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
Otorga permisos a la cuenta de servicio del agente de 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
Reemplaza lo siguiente:
- GCS_BUCKET: Es el URI del bucket de Cloud Storage en el formato
gs://<bucket_name>
. - PROJECT_NUMBER: Es el número del proyecto Google Cloud .
Inicia el CronJob
Configura e inicia un CronJob de GKE para exportar periódicamente datos de Parallelstore a Cloud Storage.
Crea el archivo de configuración ps-to-gcs-backup.yaml
para el 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
Reemplaza las siguientes variables:
- PSTORE_MOUNT_PATH: Es la ruta de acceso de activación de la instancia de Parallelstore y debe coincidir con el
volumeMount
definido para este contenedor. - PSTORE_PV_NAME: Es el nombre del
PersistentVolume
de GKE que apunta a tu instancia de Parallelstore. Esto debería haberse configurado en tu clúster de GKE como parte de los requisitos previos. - PSTORE_PVC_NAME: Es el nombre del
PersistentVolumeClaim
de GKE que solicita el uso dePersistentVolume
de Parallelstore. Esto se debería haber configurado en tu clúster de GKE como parte de los requisitos previos. - PSTORE_NAME: Es el nombre de la instancia de Parallelstore de la que se necesita una copia de seguridad.
- PSTORE_LOCATION: Es la ubicación de la instancia de Parallelstore que necesita una copia de seguridad.
- SOURCE_PARALLELSTORE_PATH: Es la ruta de acceso absoluta desde la instancia de Parallelstore sin la ruta de activación del volumen y debe comenzar con
/
. - DESTINATION_GCS_URI: Es el URI del bucket de Cloud Storage, o bien una ruta de acceso dentro de un bucket, con el formato
gs://<bucket_name>/<optional_path_inside_bucket>
. - DELETE_AFTER_BACKUP: Es la configuración para decidir si se deben borrar los datos antiguos de Parallelstore después de la copia de seguridad y liberar espacio. Los valores admitidos son
true
ofalse
.
Implementa el CronJob en tu clúster de GKE con el siguiente comando:
kubectl apply -f ps-to-gcs-backup.yaml
Consulta CronJob para obtener más detalles sobre cómo configurar un CronJob.
Cómo detectar la pérdida de datos
Cuando el estado de una instancia de Parallelstore es FAILED
, es posible que ya no se pueda acceder a los datos de la instancia. Puedes usar el siguiente comando de Google Cloud CLI para verificar el estado de la instancia de Parallelstore:
gcloud beta parallelstore instances describe PARALLELSTORE_NAME \
--location=PARALLELSTORE_LOCATION \
--format="value(state)"
Recuperación de datos
Cuando ocurre un desastre o la instancia de Parallelstore falla por algún motivo, puedes usar VolumePopulator de GKE para cargar previamente datos de Cloud Storage automáticamente en una instancia de Parallelstore administrada por GKE, o bien crear manualmente una instancia nueva de Parallelstore y, luego, importar datos desde una copia de seguridad de Cloud Storage.
Si te recuperas de un punto de control de tu carga de trabajo, debes decidir de qué punto de control recuperarte. Para ello, proporciona la ruta de acceso dentro del bucket de Cloud Storage.
GKE Volume Populator
El propagador de volúmenes de GKE se puede usar para cargar previamente datos de una ruta de acceso a un bucket de Cloud Storage en una instancia de Parallelstore recién creada. Puedes encontrar las instrucciones para hacerlo en Cómo precargar Parallelstore.
Recuperación manual
También puedes crear una instancia de Parallelstore de forma manual y, luego, importar datos desde un bucket de Cloud Storage con los siguientes pasos.
Crea una instancia nueva de Parallelstore:
gcloud beta parallelstore instances create PARALLELSTORE_NAME \ --capacity-gib=CAPACITY_GIB \ --location=PARALLELSTORE_LOCATION \ --network=NETWORK_NAME \ --project=PROJECT_ID
Importa datos desde 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
Reemplaza lo siguiente:
- PARALLELSTORE_NAME: Es el nombre de esta instancia de Parallelstore.
- CAPACITY_GIB: Es la capacidad de almacenamiento de la instancia de Parallelstore en GB, con un valor de
12000
a100000
, en múltiplos de4000
. - PARALLELSTORE_LOCATION: Es la ubicación de la instancia de Parallelstore que necesita una copia de seguridad. Debe estar en la zona admitida.
- NETWORK_NAME: Es el nombre de la red de VPC que creaste durante Configura una red de VPC. Debe ser la misma red que usa tu clúster de GKE y tener habilitado
Private Services Access
. - SOURCE_GCS_URI: Es el URI del bucket de Cloud Storage al que deseas importar datos, o bien una ruta de acceso dentro de un bucket en el que tienes los datos que deseas importar, con el formato de
gs://<bucket_name>/<optional_path_inside_bucket>
. - DESTINATION_PARALLELSTORE_PATH: Es la ruta de acceso absoluta desde la instancia de Parallelstore a la que deseas importar los datos. Debe comenzar con
/
.
En Transfiere datos hacia o desde Cloud Storage, encontrarás más detalles para importar datos a una instancia de Parallelstore.