Solucionar problemas de transferencia de datos de Volume Populator de GKE


En esta guía se explica cómo resolver los problemas habituales que surgen al transferir datos a clústeres de GKE mediante GKE Volume Populator. Te guía para depurar los problemas relacionados con la creación de PersistentVolumeClaim (PVC) y PersistentVolume (PV), el rendimiento del disco y la ejecución de trabajos de transferencia de datos.

Inspeccionar recursos temporales de Kubernetes

Así es como usa los recursos temporales GKE Volume Populator:

  1. Se crea un PVC temporal en el espacio de nombres gke-managed-volumepopulator.
  2. Por cada zona implicada en la transferencia, se crean un trabajo de transferencia, PVs y PVCs en el espacio de nombres de tu PVC.
  3. Una vez completada la transferencia de datos, GKE Volume Populator elimina automáticamente todos estos recursos temporales.

Para inspeccionar los recursos temporales, sigue estos pasos:

  1. Almacena las variables de entorno:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Sustituye los siguientes valores:

    • PVC_NAME: el nombre de tu recurso PersistentVolumeClaim.
    • NAMESPACE: el espacio de nombres en el que se ejecutan tus cargas de trabajo.
  2. Comprueba el estado:

    export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}')
    export TEMP_PVC=prime-${PVC_UID}
    echo ${TEMP_PVC}
    
  3. Inspecciona el PVC temporal en el espacio de nombres gke-managed-volumepopulator:

    kubectl describe pvc ${TEMP_PVC} -n gke-managed-volumepopulator
    
  4. Obtén los nombres de los PVCs temporales de tu espacio de nombres:

    export TEMP_PVC_LIST=($(kubectl get pvc -n "$NAMESPACE" -o json | grep -Eo "\"name\":\s*\"$TEMP_PVC[^\"]*\"" | awk -F'"' '{print $4}'))
    
    for pvc in "${TEMP_PVC_LIST[@]}"; do
      echo "$pvc"
    done
    
  5. Inspecciona los PVCs temporales:

    kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
    
  6. GKE Volume Populator crea una tarea de transferencia en cada zona (una en el caso de un volumen de Hyperdisk ML de una sola zona y varias en el caso de volúmenes de Hyperdisk ML multizona). Obtén el nombre del trabajo de transferencia con el siguiente comando:

    export TRANSFER_JOB=$(kubectl get pvc "${TEMP_PVC_LIST[0]}" -n "$NAMESPACE" -o "jsonpath={.metadata.annotations['volume-populator\.datalayer\.gke\.io/pd-transfer-requestid']}")
    
    echo $TRANSFER_JOB
    
  7. Inspecciona la tarea de transferencia:

    kubectl describe job $TRANSFER_JOB -n $NAMESPACE
    
  8. Obtén el nombre del pod de la tarea de transferencia:

    export TRANSFER_POD=$(kubectl get pods -n "$NAMESPACE" -l "job-name=$TRANSFER_JOB" -o jsonpath='{.items[0].metadata.name}')
    
    echo $TRANSFER_POD
    
  9. Inspeccionar el pod:

    kubectl describe pod $TRANSFER_POD -n $NAMESPACE
    

    Si creas un PVC en varias zonas, GKE Volume Populator crea PVCs temporales distintos y recursos de trabajo de transferencia para cada zona especificada. Para inspeccionar los recursos de cada zona implicada en la transferencia, sustituya el 0 del índice de TEMP_PVC_LIST por otros números.

Comprobar si Workload Identity Federation está habilitada

La federación de identidades de carga de trabajo permite que los pods de transferencia accedan de forma segura a los servicios. Google Cloud Si los pods de transferencia no pueden autenticarse en Google Cloud, comprueba que Workload Identity Federation for GKE esté habilitado en tu clúster.

  1. Para comprobar si workloadIdentityConfig está habilitado en tu clúster, ejecuta el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME
    --location=LOCATION \
    --project=PROJECT_ID \
    --format="value(workloadIdentityConfig)"
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre de tu clúster.
    • LOCATION: la región o zona de cálculo de tu clúster.
    • PROJECT_ID: tu ID de proyecto Google Cloud .
  2. Busca el siguiente resultado en el comando:

    PROJECT_ID.svc.id.goog
    
  3. Si falta workloadIdentityConfig en el resultado, habilita Workload Identity Federation for GKE.

Ruta de transferencia no válida

Si se produce un error similar al siguiente, significa que la ruta de transferencia especificada en el recurso GCPDatasource es incorrecta y la transferencia fallará.

ERROR: (gcloud.storage.cp) The following URLs matched no objects or files:
gs://datasets-pd/llama2-7b-hfa/

Para solucionar este problema, elimine el recurso GCPDatasource, actualice el campo uri con el valor correcto y vuelva a crear el recurso.

No tienes permisos suficientes para acceder al segmento

Si la cuenta de servicio de Kubernetes no tiene acceso al URI del segmento especificado en el recurso GCPDatasource, el trabajo de transferencia fallará. El error puede ser similar al siguiente:

ERROR: (gcloud.storage.cp) [test-gke-dev.svc.id.goog] does not have permission to access b instance [small-bucket-7] (or it may not exist): Caller does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist). This command is authenticated as test-gke-dev.svc.id.goog which is the active account specified by the [core/account] property.

Para solucionar el problema, conceda los permisos necesarios para transferir datos del segmento al disco.

gcloud storage buckets \
    add-iam-policy-binding gs://GCS_BUCKET \
     --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
    --role "ROLE"

Haz los cambios siguientes:

  • GCS_BUCKET: el nombre de tu segmento de Cloud Storage.
  • PROJECT_NUMBER: tu número de proyecto Google Cloud .
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • NAMESPACE: el espacio de nombres en el que se ejecutan tus cargas de trabajo.
  • KSA_NAME: el nombre de tu cuenta de servicio de Kubernetes.
  • ROLE: el rol de gestión de identidades y accesos que proporciona los permisos necesarios para acceder al segmento. Por ejemplo, usa roles/storage.objectViewer para conceder acceso de solo lectura al segmento.

Error: error generating accessibility requirements

Es posible que veas el siguiente error transitorio al comprobar el PVC en el espacio de nombres gke-managed-volumepopulator:

Error: error generating accessibility requirements: no available topology found.

Si utilizas un clúster de Autopilot de GKE o un clúster estándar con el aprovisionamiento automático de nodos habilitado, este error puede producirse porque puede que no haya nodos Ready en tu clúster. El error debería resolverse en unos minutos después de que el aprovisionamiento automático de nodos escale un nuevo nodo.

Transfer Pod lleva mucho tiempo Pending

Es posible que tu evento de PVC muestre que el estado del pod de transferencia es Pending durante mucho tiempo.

Para comprobar los eventos de la tarea de transferencia y verificar si la programación de la tarea ha fallado, sigue estos pasos:

  1. Describe el PVC:

    kubectl describe pvc $PVC_NAME -n $NAMESPACE
    

    El resultado debería ser similar al siguiente:

    Events:
      Type     Reason             Age                From                Message
      ----     ------             ----               ----                -------
    Normal   TransferInProgress              1s (x2 over 2s)    gkevolumepopulator-populator                                                                      populateCompleteFn: For PVC pd-pvc79 in namespace default, job with request ID populator-job-0b93fec4-5490-4e02-af32-15b16435d559 is still active with pod status as - Phase: Pending
    
  2. Para inspeccionar el pod de transferencia, sigue los pasos que se indican en Inspeccionar recursos temporales de Kubernetes.

    El resultado debería ser similar al siguiente:

    Events:
      Type     Reason             Age                From                Message
      ----     ------             ----               ----                -------
      Warning  FailedScheduling   2m50s              default-scheduler   0/3 nodes are available: 1 Insufficient cpu, 2 node(s) had volume node affinity conflict. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling.
      Warning  FailedScheduling   37s (x2 over 39s)  default-scheduler   0/3 nodes are available: 1 Insufficient cpu, 2 node(s) had volume node affinity conflict. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling.
      Normal   NotTriggerScaleUp  2m40s              cluster-autoscaler  pod didn't trigger scale-up:
    
  3. Si ves el mensaje NotTriggerScaleUp, comprueba si tu clúster tiene habilitado el aprovisionamiento automático de nodos:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(autoscaling.enableNodeAutoprovisioning)"
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre de tu clúster.
    • LOCATION: la región o zona de cálculo de tu clúster.
  4. Si el resultado es "False", habilita el aprovisionamiento automático de nodos con el siguiente comando:

    gcloud container clusters update CLUSTER_NAME \
        --enable-autoprovisioning \
        --location=LOCATION \
        --project=PROJECT_ID \
        --min-cpu MINIMUM_CPU \
        --min-memory MINIMUM_MEMORY \
        --max-cpu MAXIMUM_CPU \
        --max-memory MAXIMUM_MEMORY \
        --autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster que vas a actualizar para habilitar el aprovisionamiento automático de nodos.
    • LOCATION: la zona o región de cálculo de tu clúster. Por ejemplo, us-central1-a o us-central1.
    • PROJECT_ID: tu ID de proyecto Google Cloud .
    • MINIMUM_CPU: número mínimo de vCPUs que se aprovisionarán automáticamente. Por ejemplo, 10.
    • MINIMUM_MEMORY: cantidad mínima de memoria en GiB que se debe aprovisionar automáticamente. Por ejemplo, 200.
    • MAXIMUM_CPU: número máximo de vCPUs que se pueden aprovisionar automáticamente. Por ejemplo, 100. Este límite es el total de los recursos de CPU de todos los grupos de nodos creados manualmente y de todos los grupos de nodos que GKE pueda crear automáticamente.
    • MAXIMUM_MEMORY: cantidad máxima de memoria que se puede aprovisionar automáticamente. Por ejemplo, 1000. Este límite es el total de los recursos de memoria de todos los grupos de nodos creados manualmente y de todos los grupos de nodos que GKE pueda crear automáticamente.
  5. Si el aprovisionamiento automático de nodos está habilitado, compruebe que el aprovisionamiento automático de nodos tiene suficiente autoescalado resourceLimits para aumentar la escala del trabajo de transferencia. La tarea de transferencia usa 24 vCPUs de forma predeterminada.

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(autoscaling.resourceLimits)"
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre de tu clúster.
    • LOCATION: la región o zona de cálculo de tu clúster.

    El resultado debería ser similar al siguiente:

    {'maximum': '1000000000', 'resourceType': 'cpu'};{'maximum': '1000000000', 'resourceType': 'memory'};
    
  6. Si el aprovisionamiento automático de nodos no tiene suficientes límites de escalado automático, actualiza el clúster con la configuración correcta.

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --max-cpu MAXIMUM_CPU \
        --max-memory MAXIMUM_MEMORY
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del clúster que vas a actualizar para habilitar el aprovisionamiento automático de nodos.
    • LOCATION: la zona o región de cálculo de tu clúster. Por ejemplo, us-central1-a o us-central1.
    • PROJECT_ID: tu ID de proyecto Google Cloud .
    • MAXIMUM_CPU: número máximo de vCPUs que se pueden aprovisionar automáticamente. Por ejemplo, 100. Este límite es el total de los recursos de CPU de todos los grupos de nodos creados manualmente y de todos los grupos de nodos que GKE pueda crear automáticamente.
    • MAXIMUM_MEMORY: cantidad máxima de memoria que se puede aprovisionar automáticamente. Por ejemplo, 1000. Este límite es el total de los recursos de memoria de todos los grupos de nodos creados manualmente y de todos los grupos de nodos que GKE pueda crear automáticamente.
  7. En los clústeres estándar en los que no se ha habilitado el aprovisionamiento automático de nodos, comprueba que el nodo que has creado para la tarea de transferencia tenga la etiqueta de clase de computación necesaria:

    kubectl get node -l cloud.google.com/compute-class=gcs-to-hdml-compute-class
    
  8. Si en el resultado no aparece el nodo que has creado para la tarea de transferencia, añade la etiqueta de clase de cálculo gcs-to-hdml-compute-class al nodo:

    kubectl label node NODE_NAME cloud.google.com/compute-class=gcs-to-hdml-compute-class
    

    Sustituye NODE_NAME por el nombre del nodo en el que quieras añadir la etiqueta de clase de cálculo.

Error GCE quota exceeded

Es posible que aparezca un mensaje de error similar al siguiente cuando compruebes el pod del trabajo de transferencia:

Node scale up in zones us-west1-b associated with this pod failed: GCE quota exceeded. Pod is at risk of not being scheduled.
  1. Para inspeccionar el pod de transferencia, sigue los pasos que se indican en Inspeccionar recursos temporales de Kubernetes.

  2. Para solucionar el error, aumenta la cuota o elimina los recursos que puedan estar impidiendo el aumento de escala. Para obtener más información, consulta el artículo Solucionar errores de cuota.

Error HDML_TOTAL_THROUGHPUT de Hyperdisk ML

Si el PVC temporal del espacio de nombres gke-managed-volumepopulator no puede aprovisionar el volumen de Hyperdisk ML, es posible que se haya superado la cuota regional para crear el nuevo volumen de Hyperdisk ML para la transferencia de datos.

Para confirmar que el aprovisionamiento del volumen de Hyperdisk ML ha fallado debido a un problema de cuota regional, inspecciona los registros de eventos asociados al PVC temporal que ha creado el Volume Populator de GKE. Sigue estos pasos:

  1. Almacena las variables de entorno pertinentes:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Sustituye los siguientes valores:

    • PVC_NAME: el nombre de tu recurso PersistentVolumeClaim.
    • NAMESPACE: el espacio de nombres en el que se ejecutan tus cargas de trabajo.
  2. Comprueba el estado del PVC temporal:

    export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}')
    export TEMP_PVC=prime-$PVC_UID
    echo $TEMP_PVC
    kubectl describe pvc $TEMP_PVC -n gke-managed-volumepopulator
    
  3. Consulta los eventos de PVC para encontrar el QUOTA_EXCEEDED error, que es similar al siguiente:

    Events:
      Type     Reason                Age                 From                                                                                              Message
      ----     ------                ----                ----                                                                                              -------
      Warning  ProvisioningFailed    105s                pd.csi.storage.gke.io_gke-3ef909a7688d424b94a2-d0d9-b185-vm_6a77d057-54e3-415a-8b39-82b666516b6b  failed to provision volume with StorageClass "pd-sc": rpc error: code = Unavailable desc = CreateVolume failed: rpc error: code = Unavailable desc = CreateVolume failed to create single zonal disk pvc-73c69fa8-d23f-4dcb-a244-bcd120a3c221: failed to insert zonal disk: unknown error when polling the operation: rpc error: code = ResourceExhausted desc = operation operation-1739194889804-62dc9dd9a1cae-9d24a5ad-938e5299 failed (QUOTA_EXCEEDED): Quota 'HDML_TOTAL_THROUGHPUT' exceeded.  Limit: 30720.0 in region us-central1
    

Para solucionar este problema, sigue estos pasos:

  1. Solicita cuota adicional para crear volúmenes de Hyperdisk ML en tu proyecto.
  2. Elimina los discos Hyperdisk ML que no utilices de tu proyecto.

No queda espacio en el dispositivo

Si ves el mensaje de error No space left on device en tu PVC, significa que el volumen de Hyperdisk ML está lleno y no se pueden escribir más datos en él. El error puede ser similar al siguiente:

Events:
  Type     Reason                   Age   From                          Message
  ----     ------                   ----  ----                          -------
  Warning  TransferContainerFailed  57m   gkevolumepopulator-populator  populateCompleteFn: For PVC vp-pvc in namespace default, job with request ID populator-job-c2a2a377-6168-4ff1-afc8-c4ca713c43e2 for zone us-central1-c has a failed pod container with message:  on device
ERROR: Failed to download one or more components of sliced download.
ERROR: [Errno 28] No space left on device

Para solucionar este problema, elimine su PVC, aumente el valor del campo spec.resources.requests.storage en su manifiesto de PVC y vuelva a crear el PVC para reiniciar el proceso de transferencia.

Siguientes pasos

  • Si no encuentras una solución a tu problema en la documentación, consulta Obtener asistencia.