Soluciona problemas de transferencia de datos del Volume Populator de GKE

El propagador de volúmenes de GKE ayuda a transferir datos a los clústeres de GKE. Sin embargo, pueden surgir problemas durante el proceso de transferencia de datos que impidan que se creen PersistentVolumeClaims (PVC) o que los datos se propaguen correctamente.

Usa este documento para resolver problemas comunes que se producen cuando se usa el propagador de volúmenes de GKE. Obtén información para solucionar problemas de transferencia de datos mediante la inspección del estado de los componentes, la validación de las configuraciones y la resolución de errores de recursos o permisos.

Esta información es importante para los desarrolladores de aplicaciones y los administradores y operadores de plataformas que usan el propagador de volúmenes de GKE para propagar datos en sus volúmenes de GKE. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas comunes del usuario de GKE.

Inspecciona los recursos temporales de Kubernetes

A continuación, se explica cómo el propagador de volúmenes de GKE usa recursos temporales:

  1. Se crea un PVC temporal en el espacio de nombres gke-managed-volumepopulator.
  2. Para cada zona involucrada en la transferencia, se crea un trabajo de transferencia, PV y PVC en el espacio de nombres de tu PVC.
  3. Una vez que se completa la transferencia de datos, el propagador de volúmenes de GKE quita 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
    

    Reemplaza 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. Verifica 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 PVC temporales en 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 PVC temporales:

    kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
    
  6. El propagador de volúmenes de GKE crea un trabajo de transferencia en cada zona (uno en caso de un volumen de Hyperdisk ML de una sola zona y varios en caso de volúmenes de Hyperdisk ML multizonales). Para obtener el nombre del trabajo de transferencia, usa 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 el trabajo de transferencia:

    kubectl describe job $TRANSFER_JOB -n $NAMESPACE
    
  8. Obtén el nombre del Pod del trabajo 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. Inspecciona el Pod:

    kubectl describe pod $TRANSFER_POD -n $NAMESPACE
    

    Si creas un PVC en varias zonas, el propagador de volúmenes de GKE crea PVC temporales distintos y los recursos del trabajo de transferencia para cada zona especificada. Para inspeccionar los recursos de cada zona involucrada en la transferencia, reemplaza el 0 del índice de TEMP_PVC_LIST por otros números.

Verifica si la federación de identidades para cargas de trabajo está habilitada

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

  1. Para verificar 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)"
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre de tu clúster.
    • LOCATION: La región o zona de procesamiento de tu clúster.
    • PROJECT_ID: Es el ID del Google Cloud proyecto.
  2. Busca el siguiente resultado en el comando:

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

Ruta de transferencia no válida

Si encuentras un error similar al siguiente, 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 resolver este problema, borra el recurso GCPDatasource, actualiza el campo uri con el valor correcto y vuelve a crear el recurso.

Permiso insuficiente para acceder al bucket

Si la cuenta de servicio de Kubernetes no tiene acceso al URI del bucket que se especifica en el recurso GCPDatasource, fallará el trabajo de transferencia. El error puede verse de la siguiente manera:

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 resolver el problema, otorga los permisos necesarios para transferir datos del bucket 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"

Reemplaza lo siguiente:

  • GCS_BUCKET: El nombre de tu bucket de Cloud Storage.
  • PROJECT_NUMBER: Es el número del Google Cloud proyecto.
  • PROJECT_ID: Es el ID del Google Cloud proyecto.
  • 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 IAM que proporciona los permisos necesarios para acceder al bucket. Por ejemplo, usa roles/storage.objectViewer para otorgar acceso de solo lectura al bucket.

Error: error generating accessibility requirements

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

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

Si usas un clúster de Autopilot de GKE o un clúster estándar con el aprovisionamiento automático de nodos habilitado, este error puede ocurrir porque es posible 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 verticalmente un nodo nuevo.

El Pod de transferencia está Pending para la programación durante mucho tiempo

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

Para verificar los eventos del trabajo de transferencia y comprobar si falló la programación del trabajo, sigue estos pasos:

  1. Describe el PVC:

    kubectl describe pvc $PVC_NAME -n $NAMESPACE
    

    El resultado es similar a este:

    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 Inspecciona los recursos temporales de Kubernetes.

    El resultado es similar a este:

    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, verifica si tu clúster tiene habilitado el aprovisionamiento automático de nodos:

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre de tu clúster.
    • LOCATION: La región o zona de procesamiento de tu clúster.
  4. Si el resultado muestra "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
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre del clúster que estás actualizando para habilitar el aprovisionamiento automático de nodos.
    • LOCATION: La zona de procesamiento o región de tu clúster. Por ejemplo, us-central1-a o us-central1.
    • PROJECT_ID: Es el ID del Google Cloud proyecto.
    • MINIMUM_CPU: La cantidad mínima de vCPUs para el aprovisionamiento automático. Por ejemplo, 10.
    • MINIMUM_MEMORY: La cantidad mínima de memoria en GiB para el aprovisionamiento automático. Por ejemplo, 200.
    • MAXIMUM_CPU: La cantidad máxima de vCPUs para el aprovisionamiento automático. Por ejemplo, 100. Este límite es el total de los recursos de CPU en todos los grupos de nodos existentes creados de forma manual y todos los grupos de nodos que GKE podría crear automáticamente.
    • MAXIMUM_MEMORY: La cantidad máxima de memoria para el aprovisionamiento automático. Por ejemplo, 1000. Este límite es el total de los recursos de memoria en todos los grupos de nodos existentes creados de forma manual y todos los grupos de nodos que GKE podría crear automáticamente.
  5. Si el aprovisionamiento automático de nodos está habilitado, verifica que el aprovisionamiento automático de nodos tenga resourceLimits de ajuste de escala automático suficientes para escalar verticalmente el trabajo de transferencia. El trabajo de transferencia usa 24 vCPUs de forma predeterminada.

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre de tu clúster.
    • LOCATION: La región o zona de procesamiento de tu clúster.

    El resultado es similar a este:

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

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

    Reemplaza lo siguiente:

    • CLUSTER_NAME: El nombre del clúster que estás actualizando para habilitar el aprovisionamiento automático de nodos.
    • LOCATION: La zona de procesamiento o región de tu clúster. Por ejemplo, us-central1-a o us-central1.
    • PROJECT_ID: Es el ID del Google Cloud proyecto.
    • MAXIMUM_CPU: La cantidad máxima de vCPUs para el aprovisionamiento automático. Por ejemplo, 100. Este límite es el total de los recursos de CPU en todos los grupos de nodos existentes creados de forma manual y todos los grupos de nodos que GKE podría crear automáticamente.
    • MAXIMUM_MEMORY: La cantidad máxima de memoria para el aprovisionamiento automático. Por ejemplo, 1000. Este límite es el total de los recursos de memoria en todos los grupos de nodos existentes creados de forma manual y todos los grupos de nodos que GKE podría crear automáticamente.
  7. En el caso de los clústeres estándar sin el aprovisionamiento automático de nodos habilitado, verifica que el nodo que creaste para el trabajo de transferencia tenga la etiqueta de clase de procesamiento requerida:

    kubectl get node -l cloud.google.com/compute-class=gcs-to-hdml-compute-class
    
  8. Si el resultado no muestra el nodo que creaste para el trabajo de transferencia, agrega la etiqueta de clase de procesamiento gcs-to-hdml-compute-class al nodo:

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

    Reemplaza NODE_NAME por el nombre del nodo en el que deseas agregar la etiqueta de clase de procesamiento.

Error GCE quota exceeded

Es posible que encuentres un mensaje de error similar al siguiente cuando revises 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 Inspecciona los recursos temporales de Kubernetes.

  2. Para resolver el error, aumenta la cuota o borra los recursos existentes que podrían impedir el escalamiento vertical. Para obtener más información, consulta Soluciona errores de cuota.

Error HDML_TOTAL_THROUGHPUT de Hyperdisk ML excedido

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

Para confirmar que falló el aprovisionamiento del volumen de Hyperdisk ML debido a un problema de cuota regional, inspecciona los registros de eventos asociados con el PVC temporal que creó el propagador de volúmenes de GKE. Lleva a cabo los pasos siguientes:

  1. Almacena las variables de entorno pertinentes:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Reemplaza 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. Verifica 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. Verifica 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 nuevos de Hyperdisk ML en tu proyecto.
  2. Borra los discos de Hyperdisk ML sin usar en 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 verse de la siguiente manera:

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 resolver este problema, borra tu PVC, aumenta el valor del campo spec.resources.requests.storage en tu manifiesto de PVC y vuelve a crear el PVC para iniciar el proceso de transferencia nuevamente.

¿Qué sigue?

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