En esta guía se describe cómo puedes precargar grandes cantidades de datos de un bucket de Cloud Storage en un volumen de Parallelstore de Google Kubernetes Engine (GKE) durante el aprovisionamiento dinámico mediante GKE Volume Populator. Para obtener más información, consulta Acerca de GKE Volume Populator.
Esta guía está dirigida a especialistas en almacenamiento que crean y asignan almacenamiento, y gestionan la seguridad y el acceso a los datos. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el Google Cloud contenido, consulta Roles y tareas habituales de los usuarios de GKE Enterprise.
Limitaciones
- El recurso personalizado
GCPDataSource
debe estar en el mismo espacio de nombres que tu carga de trabajo de Kubernetes. No se admiten volúmenes con fuentes de datos entre espacios de nombres. - GKE Volume Populator solo admite la federación de Workload Identity para GKE de cuentas de servicio de IAM a una cuenta de servicio de Kubernetes. No se admite la concesión directa de permisos de gestión de identidades y accesos a la cuenta de servicio de Kubernetes.
Antes de empezar
Antes de empezar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API Parallelstore y la API de Google Kubernetes Engine. Habilitar APIs
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
- Consulta la descripción general del controlador CSI de Parallelstore para ver las limitaciones y los requisitos.
- Crea tus segmentos de Cloud Storage, que contengan los datos que quieras transferir.
Requisitos
Para usar GKE Volume Populator, tus clústeres deben cumplir los siguientes requisitos:
- Usa la versión 1.31.1-gke.1729000 o una posterior del clúster de GKE.
- Tener habilitado el controlador de CSI de Parallelstore. GKE habilita el controlador de CSI de forma predeterminada en los clústeres de Autopilot de GKE nuevos y actuales. En los clústeres Standard nuevos y actuales, debes habilitar el controlador CSI.
Prepara tu entorno
En esta sección se describen los pasos para crear clústeres de GKE y configurar los permisos necesarios para usar GKE Volume Populator.
Configurar tu red de VPC
Debes especificar la misma red de nube privada virtual (VPC) al crear la instancia de Parallel Store y las máquinas virtuales de Compute Engine o los clústeres de GKE del cliente. Para permitir que la VPC se conecte de forma privada a los servicios de Google Cloud sin exponer el tráfico a Internet público, debes configurar Acceso a servicios privados (PSA) una sola vez, si aún no lo has hecho.
Para configurar los mensajes predefinidos, sigue estos pasos:
Para configurar el emparejamiento de redes en tu proyecto, configura el permiso de gestión de identidades y accesos Administrador de red de Compute (
roles/compute.networkAdmin
).Para asignar el rol, ejecuta el siguiente comando:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="user:EMAIL_ADDRESS" \ --role=roles/compute.networkAdmin
Sustituye EMAIL_ADDRESS por tu dirección de correo.
Habilita la red de servicios:
gcloud services enable servicenetworking.googleapis.com
Crea una red de VPC:
gcloud compute networks create NETWORK_NAME \ --subnet-mode=auto \ --mtu=8896 \ --project=PROJECT_ID
Haz los cambios siguientes:
- NETWORK_NAME: el nombre de la red VPC en la que crearás tu instancia de Parallelstore.
- PROJECT_ID: tu Google Cloud ID de proyecto.
Crea un intervalo de IPs.
El acceso a servicios privados requiere un intervalo de direcciones IP (bloque CIDR) con una longitud de prefijo de al menos
/24
(256 direcciones). Parallelstore reserva 64 direcciones por instancia, lo que significa que puedes reutilizar este intervalo de IP con otros servicios u otras instancias de Parallelstore si es necesario.gcloud compute addresses create IP_RANGE_NAME \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="Parallelstore VPC Peering" \ --network=NETWORK_NAME \ --project=PROJECT_ID
Sustituye IP_RANGE_NAME por el nombre del intervalo de IPs de la red VPC.
Define una variable de entorno con el intervalo CIDR asociado al intervalo que has creado en el paso anterior:
CIDR_RANGE=$( gcloud compute addresses describe IP_RANGE_NAME \ --global \ --format="value[separator=/](address, prefixLength)" \ --project=PROJECT_ID \ )
Crea una regla de cortafuegos para permitir el tráfico TCP desde el intervalo de IPs que has creado:
gcloud compute firewall-rules create FIREWALL_NAME \ --allow=tcp \ --network=NETWORK_NAME \ --source-ranges=$CIDR_RANGE \ --project=PROJECT_ID
Sustituye FIREWALL_NAME por el nombre de la regla de cortafuegos para permitir el tráfico TCP desde el intervalo de IPs que has creado.
Conecta el intercambio de tráfico entre redes:
gcloud services vpc-peerings connect \ --network=NETWORK_NAME \ --ranges=IP_RANGE_NAME \ --project=PROJECT_ID \ --service=servicenetworking.googleapis.com
Si tienes problemas al configurar la red de VPC, consulta la guía de solución de problemas de Parallelstore.
Crear un clúster de GKE
Te recomendamos que uses un clúster de Autopilot para disfrutar de una experiencia de Kubernetes totalmente gestionada. Para elegir el modo de funcionamiento de GKE que mejor se adapte a las necesidades de tu carga de trabajo, consulta Elegir un modo de funcionamiento de GKE.
Autopilot
Para crear un clúster de GKE con Autopilot, ejecuta el siguiente comando:
gcloud container clusters create-auto CLUSTER_NAME \
--network=NETWORK_NAME \
--cluster-version=CLUSTER_VERSION \
--location=CLUSTER_LOCATION
GKE habilita Workload Identity Federation para GKE y el controlador CSI de Parallelstore de forma predeterminada en los clústeres de Autopilot.
Sustituye los siguientes valores:
- CLUSTER_NAME: el nombre de tu clúster.
- CLUSTER_VERSION : el número de versión de GKE. Debes especificar 1.31.1-gke.1729000 o una versión posterior.
- NETWORK_NAME: el nombre de la red VPC que has creado para la instancia de Parallelstore. Para obtener más información, consulta Configurar una red de VPC.
- CLUSTER_LOCATION: la región en la que quieras crear el clúster. Te recomendamos que crees el clúster en una ubicación de Parallelstore admitida para obtener el mejor rendimiento. Si quieres crear tu clúster en una ubicación de Parallelstore no admitida, cuando crees una StorageClass de Parallelstore, debes especificar una topología personalizada que use una ubicación de Parallelstore admitida. De lo contrario, el aprovisionamiento fallará.
Estándar
Crea un clúster estándar con el controlador CSI de Parallelstore y Workload Identity Federation para GKE habilitados mediante el siguiente comando:
gcloud container clusters create CLUSTER_NAME \
--addons=ParallelstoreCsiDriver \
--cluster-version=CLUSTER_VERSION \
--workload-pool=PROJECT_ID.svc.id.goog \
--network=NETWORK_NAME \
--location=CLUSTER_LOCATION
Sustituye los siguientes valores:
- CLUSTER_NAME: el nombre de tu clúster.
- CLUSTER_VERSION: el número de versión de GKE. Debes especificar 1.31.1-gke.1729000 o una versión posterior.
- PROJECT_ID: tu Google Cloud ID de proyecto.
- NETWORK_NAME: el nombre de la red VPC que has creado para la instancia de Parallelstore. Para obtener más información, consulta Configurar una red VPC.
- CLUSTER_LOCATION: la región o zona en la que quieras crear el clúster. Te recomendamos que crees el clúster en una ubicación de Parallelstore admitida para obtener el mejor rendimiento posible. Si quieres crear tu clúster en una ubicación de Parallelstore no admitida, cuando crees una StorageClass de Parallelstore, debes especificar una topología personalizada que use una ubicación de Parallelstore admitida. De lo contrario, el aprovisionamiento fallará.
Configurar los permisos necesarios
Para transferir datos desde un segmento de Cloud Storage, debes configurar los permisos de Workload Identity Federation para GKE.
Crea un espacio de nombres de Kubernetes:
kubectl create namespace NAMESPACE
Sustituye NAMESPACE por el espacio de nombres en el que se ejecutarán tus cargas de trabajo.
Crea una cuenta de servicio de Kubernetes.
kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Sustituye KSA_NAME por el nombre de la cuenta de servicio de Kubernetes que usa tu pod para autenticarse en las APIs de Google Cloud .
Crea una cuenta de servicio de IAM. También puedes usar cualquier cuenta de servicio de IAM de cualquier proyecto de tu organización:
gcloud iam service-accounts create IAM_SA_NAME \ --project=PROJECT_ID
Haz los cambios siguientes:
- IAM_SA_NAME: el nombre de tu cuenta de servicio de gestión de identidades y accesos.
- PROJECT_ID: tu Google Cloud ID de proyecto.
Concede a tu cuenta de servicio de gestión de identidades y accesos el rol
roles/storage.objectViewer
para que pueda acceder a tu segmento de Cloud Storage:gcloud storage buckets \ add-iam-policy-binding gs://GCS_BUCKET \ --member "serviceAccount:IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/storage.objectViewer"
Sustituye GCS_BUCKET por el nombre de tu segmento de Cloud Storage.
Crea la política de permiso de gestión de identidades y accesos que da acceso a la cuenta de servicio de Kubernetes para suplantar la cuenta de servicio de gestión de identidades y accesos:
gcloud iam service-accounts \ add-iam-policy-binding IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
Anota la cuenta de servicio de Kubernetes para que GKE vea la vinculación entre las cuentas de servicio.
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
Crea la identidad de servicio de Parallelstore:
gcloud beta services identity create \ --service=parallelstore.googleapis.com \ --project=PROJECT_ID
Para permitir que la identidad de servicio de Parallelstore suplante a la cuenta de servicio de IAM, asigna el rol
roles/iam.serviceAccountTokenCreator
a la identidad de servicio de Parallelstore. Define la variable de entornoPROJECT_NUMBER
para poder usarla en los pasos siguientes.export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") gcloud iam service-accounts \ add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --member=serviceAccount:"service-${PROJECT_NUMBER?}@gcp-sa-parallelstore.iam.gserviceaccount.com" \ --role=roles/iam.serviceAccountTokenCreator
El valor PROJECT_NUMBER es el identificador único generado automáticamente para tu proyecto. Para encontrar este valor, consulta el artículo Crea y gestiona proyectos.
Para permitir que la identidad de servicio de Parallelstore acceda a todos los recursos a los que puede acceder la cuenta de servicio de IAM, asigna el rol
roles/iam.serviceAccountUser
a la identidad de servicio de Parallelstore:gcloud iam service-accounts \ add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --member=serviceAccount:"service-${PROJECT_NUMBER?}@gcp-sa-parallelstore.iam.gserviceaccount.com" \ --role=roles/iam.serviceAccountUser
Para permitir que la identidad de servicio de GKE acceda a todos los recursos a los que puede acceder la cuenta de servicio de IAM, asigna el rol
roles/iam.serviceAccountUser
a la identidad de servicio de GKE. Este paso no es necesario si el clúster de GKE y la cuenta de servicio de gestión de identidades y accesos están en el mismo proyecto.gcloud iam service-accounts \ add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --member=serviceAccount:"service-${PROJECT_NUMBER?}@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/iam.serviceAccountUser
Crear un volumen de Parallelstore con datos precargados
En las siguientes secciones se describe el proceso habitual para crear un volumen de Parallelstore con datos precargados desde un bucket de Cloud Storage mediante GKE Volume Populator.
- Crea un
GCPDataSource
recurso. - Crea un StorageClass de Parallelstore.
- Crea un PersistentVolumeClaim para acceder al volumen.
- (Opcional) Consulta el progreso de la transferencia de datos.
- Crea una carga de trabajo que consuma el volumen.
Crear un recurso GCPDataSource
Para usar GKE Volume Populator, crea un recurso personalizado GCPDataSource
. Este recurso define las propiedades de almacenamiento de origen que se van a usar para rellenar el volumen.
Guarda el siguiente manifiesto en un archivo llamado
gcpdatasource.yaml
.apiVersion: datalayer.gke.io/v1 kind: GCPDataSource metadata: name: GCP_DATA_SOURCE namespace: NAMESPACE spec: cloudStorage: serviceAccountName: KSA_NAME uri: gs://GCS_BUCKET/
Sustituye los siguientes valores:
- GCP_DATA_SOURCE: el nombre del
GCPDataSource
CRD que contiene una referencia a tu segmento de Cloud Storage. Consulta la referencia del CRDGCPDataSource
para obtener más información. - NAMESPACE: el espacio de nombres en el que se ejecutarán tus cargas de trabajo. El valor del espacio de nombres debe ser el mismo que el del espacio de nombres de tu carga de trabajo.
- KSA_NAME: el nombre de la cuenta de servicio de Kubernetes
que usa tu pod para autenticarse en las APIs de Google Cloud . El valor de
cloudStorage.serviceAccountName
debe ser la cuenta de servicio de Kubernetes que hayas configurado para la federación de identidades de cargas de trabajo en GKE en el paso Configurar los permisos necesarios. - GCS_BUCKET: el nombre de tu segmento de Cloud Storage.
También puedes especificar
gs://GCS_BUCKET/PATH_INSIDE_BUCKET/
en el campouri
.
- GCP_DATA_SOURCE: el nombre del
Crea el recurso
GCPDataSource
ejecutando este comando:kubectl apply -f gcpdatasource.yaml
Crear un StorageClass de Parallelstore
Crea un StorageClass para dirigir el controlador CSI de Parallelstore y aprovisionar instancias de Parallelstore en la misma región que tu clúster de GKE. De esta forma, se asegura un rendimiento de E/S óptimo.
Guarda el siguiente archivo de manifiesto como
parallelstore-class.yaml
.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: parallelstore-class provisioner: parallelstore.csi.storage.gke.io volumeBindingMode: Immediate reclaimPolicy: Delete
Crea el objeto StorageClass ejecutando este comando:
kubectl apply -f parallelstore-class.yaml
Si quieres crear una StorageClass personalizada con una topología específica, consulta la guía de CSI de Parallelstore.
Crear un PersistentVolumeClaim para acceder al volumen
El siguiente archivo de manifiesto muestra un ejemplo de cómo crear un PersistentVolumeClaim en ReadWriteMany
con el modo de acceso que hace referencia al StorageClass que has creado anteriormente.
Guarda el siguiente manifiesto en un archivo llamado
volume-populator-pvc.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME namespace: NAMESPACE spec: accessModes: - ReadWriteMany storageClassName: parallelstore-class resources: requests: storage: 12Gi dataSourceRef: apiGroup: datalayer.gke.io kind: GCPDataSource name: GCP_DATA_SOURCE
Sustituye los siguientes valores:
- PVC_NAME: el nombre del PersistentVolumeClaim al que quieres transferir tus datos. La PersistentVolumeClaim debe estar respaldada por una instancia de Parallelstore.
- NAMESPACE: el espacio de nombres en el que se ejecutarán tus cargas de trabajo. El valor del espacio de nombres debe ser el mismo que el del espacio de nombres de tu carga de trabajo.
- GCP_DATA_SOURCE: el nombre del
GCPDataSource
CRD que contiene una referencia a tu segmento de Cloud Storage. Para obtener más información, consulta laGCPDataSource
referencia de CRD.
Para crear el PersistentVolumeClaim, ejecuta el siguiente comando:
kubectl apply -f volume-populator-pvc.yaml
GKE no programará el pod de la carga de trabajo hasta que se complete el aprovisionamiento de PersistentVolumeClaim. Para comprobar el progreso de la transferencia de datos, consulta Ver el progreso de la transferencia de datos. Si se producen errores durante el aprovisionamiento, consulta la sección Solución de problemas.
(Opcional) Ver el progreso de la transferencia de datos
En esta sección se explica cómo puedes monitorizar el progreso de las transferencias de datos desde un segmento de Cloud Storage a un volumen de Parallelstore. Puedes hacerlo para monitorizar el estado de la transferencia y asegurarte de que los datos se copian correctamente. También debes ejecutar este comando si la operación de enlace PersistentVolumeClaim tarda demasiado.
Verifica el estado de tu PersistentVolumeClaim ejecutando el siguiente comando:
kubectl describe pvc PVC_NAME -n NAMESPACE
Consulta el mensaje de eventos de PersistentVolumeClaim para ver el progreso de la transferencia de datos. GKE registra los mensajes aproximadamente una vez por minuto. El resultado es similar al siguiente:
Reason Message ------ ------- PopulateOperationStartSuccess Populate operation started PopulateOperationStartSuccess Populate operation started Provisioning External provisioner is provisioning volume for claim "my-namespace/my-pvc" Provisioning Assuming an external populator will provision the volume ExternalProvisioning Waiting for a volume to be created either by the external provisioner 'parallelstore.csi.storage.gke.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered. PopulateOperationStartSuccess Populate operation started PopulatorPVCCreationProgress objects found 7, objects copied 7, objects skipped 0. bytes found 1000020010, bytes copied 1000020010, bytes skipped 0 PopulateOperationFinished Populate operation finished PopulatorFinished Populator finished
La operación de rellenado puede tardar un tiempo en iniciarse. Esta operación depende del tamaño del archivo. Si no ves ningún progreso en la transferencia de datos después de varios minutos, consulta la sección Solución de problemas.
Crea una carga de trabajo que consuma el volumen
En esta sección se muestra un ejemplo de cómo crear un pod que consuma el recurso PersistentVolumeClaim que has creado anteriormente.
Guarda el siguiente manifiesto YAML de tu pod como
pod.yaml
.apiVersion: v1 kind: Pod metadata: name: POD_NAME namespace: NAMESPACE spec: volumes: - name: parallelstore-volume persistentVolumeClaim: claimName: PVC_NAME containers: - image: nginx name: nginx volumeMounts: - name: parallelstore-volume mountPath: /mnt/data
Sustituye los siguientes valores:
- POD_NAME: el nombre del pod que ejecuta tu carga de trabajo.
- NAMESPACE: el espacio de nombres en el que se ejecutarán tus cargas de trabajo. El valor del espacio de nombres debe ser el mismo que el del espacio de nombres de tu carga de trabajo.
- PVC_NAME: el nombre del PersistentVolumeClaim al que quieres transferir tus datos. La PersistentVolumeClaim debe estar respaldada por una instancia de Parallelstore.
Ejecuta el siguiente comando para aplicar el manifiesto al clúster:
kubectl apply -f pod.yaml
Comprueba el estado de tu Pod y espera hasta que sea
RUNNING
. Tu PersistentVolumeClaim debe estar enlazado para que la carga de trabajo se pueda ejecutar.kubectl describe pod POD_NAME -n NAMESPACE
Verifica que los archivos se hayan transferido correctamente y que tu carga de trabajo pueda acceder a ellos.
kubectl exec -it POD_NAME -n NAMESPACE -c nginx -- /bin/sh
Cambia al directorio
/mnt/data
y ejecutals
:cd /mnt/data ls
En la salida se deben enumerar todos los archivos que haya en el URI del segmento de Cloud Storage.
Eliminar un PersistentVolumeClaim durante el aprovisionamiento dinámico
Si necesitas eliminar tu PersistentVolumeClaim mientras se transfieren datos durante el aprovisionamiento dinámico, tienes dos opciones: eliminación controlada y eliminación forzada.
La eliminación gradual requiere menos esfuerzo, pero puede llevar más tiempo y no tiene en cuenta los errores de configuración de los usuarios que impiden que se complete la transferencia de datos. La eliminación forzada ofrece una alternativa más rápida que permite disfrutar de mayor flexibilidad y control. Esta opción es adecuada cuando necesitas reiniciar rápidamente o corregir errores de configuración.
Eliminación suave
Usa esta opción de eliminación para asegurarte de que el proceso de transferencia de datos se complete antes de que GKE elimine los recursos asociados.
Elimina el pod de la carga de trabajo, si existe, ejecutando este comando:
kubectl delete pod POD_NAME -n NAMESPACE
Busca el nombre del PersistentVolumeClaim temporal:
PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}') TEMP_PVC=prime-$PVC_UID echo $TEMP_PVC
Busca el nombre del PersistentVolume:
PV_NAME=$(kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}') echo ${PV_NAME?}
Si la salida está vacía, significa que el PersistentVolume aún no se ha creado.
Elimina tu PersistentVolumeClaim ejecutando este comando.
kubectl delete pvc PVC_NAME -n NAMESPACE
Espera a que se complete la transferencia de datos. GKE acabará eliminando el PersistentVolumeClaim, el PersistentVolume y la instancia de Parallelstore.
Comprueba que se hayan eliminado los recursos PersistentVolumeClaim, PersistentVolumeClaim y PersistentVolume temporales:
kubectl get pvc,pv -A | grep -E "${TEMP_PVC?}|PVC_NAME|${PV_NAME?}"
Comprueba que la instancia de Parallelstore se haya eliminado. La instancia de Parallelstore tendrá el mismo nombre que el PersistentVolume.
gcloud beta parallelstore instances list \ --project=PROJECT_ID \ --location=- | grep ${PV_NAME?}
Eliminación forzada
Usa esta opción de eliminación cuando necesites eliminar un PersistentVolumeClaim y sus recursos asociados antes de que se complete el proceso de transferencia de datos. Es posible que tengas que usar esta opción en situaciones en las que la transferencia de datos tarde demasiado o se produzcan errores, o si necesitas recuperar recursos rápidamente.
Elimina el pod de la carga de trabajo, si existe:
kubectl delete pod POD_NAME -n NAMESPACE
Actualiza el valor de PersistentVolume reclaim policy a
Delete
. Este ajuste asegura que el PersistentVolume, junto con el almacenamiento subyacente, se elimine automáticamente cuando se elimine el PersistentVolumeClaim asociado.Omite el siguiente comando si se da alguna de estas circunstancias:
- No quieres eliminar el PersistentVolume ni el almacenamiento subyacente.
- Tu política de recuperación actual es
Retain
y quieres conservar el almacenamiento subyacente. Limpia el PersistentVolume y la instancia de almacenamiento manualmente según sea necesario. El siguiente comando
echo $PV_NAME
devuelve una cadena vacía, lo que significa que el PersistentVolume aún no se ha creado.PV_NAME=$(kubectl describe pvc $TEMP_PVC -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}') echo $PV_NAME kubectl patch pv $PV_NAME -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
Busca el nombre del PersistentVolumeClaim temporal y define la variable de entorno para un paso posterior:
PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}') TEMP_PVC=prime-$PVC_UID echo $TEMP_PVC
Elimina el PersistentVolumeClaim ejecutando este comando. El finalizador bloqueará la operación de eliminación. Pulsa Control+C y, a continuación, ve al paso siguiente.
kubectl delete pvc PVC_NAME -n NAMESPACE
Elimina el finalizador
datalayer.gke.io/populate-target-protection
de tu PersistentVolumeClaim. Este paso es necesario después de eliminar el PersistentVolumeClaim. De lo contrario,gke-volume-populator
vuelve a añadir el finalizador a PersistentVolumeClaim.kubectl get pvc PVC_NAME -n NAMESPACE -o=json | \ jq '.metadata.finalizers = null' | kubectl apply -f -
Elimina el PersistentVolumeClaim temporal en el espacio de nombres
gke-managed-volumepopulator
.kubectl delete pvc $TEMP_PVC -n gke-managed-volumepopulator
Comprueba que se hayan eliminado los recursos PersistentVolumeClaim, PersistentVolumeClaim y PersistentVolume temporales:
kubectl get pvc,pv -A | grep -E "${TEMP_PVC?}|PVC_NAME|${PV_NAME?}"
Comprueba que la instancia de Parallelstore se haya eliminado. La instancia de Parallelstore tendrá el mismo nombre que el PersistentVolume.
gcloud beta parallelstore instances list \ --project=PROJECT_ID \ --location=- | grep ${PV_NAME?}
Solución de problemas
En esta sección se explica cómo resolver problemas relacionados con GKE Volume Populator.
Antes de continuar, ejecuta el siguiente comando para comprobar si hay advertencias de PersistentVolumeClaim:
kubectl describe pvc PVC_NAME -n NAMESPACE
Error: An internal error has occurred
Si aparece el siguiente error, significa que se ha producido un error interno de la API Parallelstore.
Warning PopulateOperationStartError gkevolumepopulator-populator Failed to start populate operation: populate data for PVC "xxx". Import data failed, error: rpc error: code = Internal desc = An internal error has occurred ("xxx")
Para solucionar este problema, debes seguir estos pasos para recoger datos para el equipo de Asistencia:
Ejecuta los siguientes comandos para obtener el nombre de la PersistentVolumeClaim temporal. Sustituye los marcadores de posición por los nombres reales:
PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}') TEMP_PVC=prime-${PVC_UID?} echo ${TEMP_PVC?}
Ejecuta el siguiente comando para obtener el nombre del volumen:
PV_NAME=$(kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}')
Ponte en contacto con el equipo de Asistencia e indícales el mensaje de error, el nombre del proyecto y el nombre del volumen.
Problemas con los permisos
Si se producen errores como los siguientes durante el llenado del volumen, significa que GKE ha detectado un problema de permisos:
- El segmento de Cloud Storage no existe:
PopulateOperationStartError
concode = PermissionDenied
- Faltan permisos en el segmento de Cloud Storage o en las cuentas de servicio:
PopulateOperationFailed
con"code: "xxx" message:"Verify if bucket "xxx" exists and grant access"
. - No se ha encontrado la cuenta de servicio:
PopulateOperationStartError
concode = Unauthenticated
.
Para solucionar estos errores, compruebe lo siguiente:
- Acceso al segmento de Cloud Storage: comprueba que el segmento exista y que la cuenta de servicio tenga el rol
roles/storage.objectViewer permission
. - Cuentas de servicio: confirma que tanto la cuenta de servicio de Kubernetes como la cuenta de servicio de gestión de identidades y accesos existen y están vinculadas correctamente.
- Cuenta de servicio de Parallelstore: comprueba que la cuenta de servicio de Parallelstore exista y tenga los permisos necesarios (
roles/iam.serviceAccountTokenCreator
yroles/iam.serviceAccountUser
en la cuenta de gestión de identidades y accesos).
Para ver los pasos detallados y los comandos de verificación, consulta Configurar los permisos necesarios. Si los errores persisten, ponte en contacto con el equipo de Asistencia e indica el mensaje de error, el nombre del proyecto y el nombre del bucket de Cloud Storage.
Errores de argumentos no válidos
Si se producen errores InvalidArgument
, significa que probablemente has proporcionado valores incorrectos en el recurso GCPDataSource
o en PersistentVolumeClaim. El registro de errores indicará los campos exactos que contienen los datos no válidos. Comprueba que el URI del segmento de Cloud Storage y otros campos relevantes sean correctos.
Verificar que se ha completado el aprovisionamiento de PersistentVolumeClaim
GKE Volume Populator usa un PersistentVolumeClaim temporal en el espacio de nombres gke-managed-volumepopulator
para aprovisionar el volumen.
El PersistentVolumeClaim temporal es básicamente una instantánea de tu PersistentVolumeClaim que aún está en tránsito (esperando a que los datos se carguen por completo). Su nombre tiene el formato prime-YOUR_PVC_UID
.
Para comprobar su estado, sigue estos pasos:
Ejecuta estos comandos:
PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}') TEMP_PVC=prime-$PVC_UID echo $TEMP_PVC kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator
Si la salida está vacía, significa que no se ha creado el PersistentVolumeClaim temporal. Ejecuta el siguiente comando para comprobar si hay advertencias de eventos de PersistentVolumeClaim:
kubectl describe pvc PVC_NAME -n NAMESPACE
Si el aprovisionamiento se realiza correctamente, el resultado será similar al siguiente. Busca el registro
ProvisioningSucceeded
:Warning ProvisioningFailed 9m12s parallelstore.csi.storage.gke.io_gke-10fedd76bae2494db688-2237-793f-vm_5f284e53-b25c-46bb-b231-49e894cbba6c failed to provision volume with StorageClass "parallelstore-class": rpc error: code = DeadlineExceeded desc = context deadline exceeded Warning ProvisioningFailed 3m41s (x11 over 9m11s) parallelstore.csi.storage.gke.io_gke-10fedd76bae2494db688-2237-793f-vm_5f284e53-b25c-46bb-b231-49e894cbba6c failed to provision volume with StorageClass "parallelstore-class": rpc error: code = DeadlineExceeded desc = Volume pvc-808e41a4-b688-4afe-9131-162fe5d672ec not ready, current state: CREATING Normal ExternalProvisioning 3m10s (x43 over 13m) persistentvolume-controller Waiting for a volume to be created either by the external provisioner 'parallelstore.csi.storage.gke.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered. Normal Provisioning 8s (x13 over 10m) "xxx" External provisioner is provisioning volume for claim "xxx" Normal ProvisioningSucceeded 7s "xxx" Successfully provisioned volume "xxx"
Comprueba si se ha iniciado la creación de la instancia de Parallelstore.
gcloud beta parallelstore instances list \ --project=PROJECT_ID \ --location=-
La salida es similar a la siguiente. Comprueba que el volumen esté en el estado
CREATING
. Cuando se haya terminado de crear la instancia de ParallelStore, el estado cambiará aACTIVE
."projects/PROJECT_ID/locations/<my-location>/<my-volume>" 12000 2024-10-09T17:59:42.582857261Z 2024-10-09T17:59:42.582857261Z CREATING projects/PROJECT_ID/global/NETWORK_NAME
Si el aprovisionamiento falla, consulta la guía para solucionar problemas de Parallelstore para obtener más información.
Siguientes pasos
- Consulta información sobre GKE Volume Populator.
- Consulta la documentación de referencia de CSI de Parallelstore.
- Consulta cómo usar la biblioteca de intercepción Parallelstore para mejorar el rendimiento de las cargas de trabajo.
- Prueba el tutorial para entrenar un modelo de TensorFlow con Keras en GKE.