Risoluzione dei problemi di trasferimento dei dati di GKE Volume Populator

Questa guida mostra come risolvere i problemi comuni che si verificano durante il trasferimento dei dati ai cluster GKE utilizzando GKE Volume Populator. Ti guida nel debug dei problemi relativi alla creazione di PersistentVolumeClaim (PVC) e PersistentVolume (PV), alle prestazioni del disco e all'esecuzione del job di trasferimento dei dati.

Ispezionare le risorse Kubernetes temporanee

Ecco come GKE Volume Populator utilizza le risorse temporanee:

  1. Viene creata una PVC temporanea nello spazio dei nomi gke-managed-volumepopulator.
  2. Per ogni zona coinvolta nel trasferimento, vengono creati un job di trasferimento, PV e PVC nello spazio dei nomi del PVC.
  3. Al termine del trasferimento dei dati, GKE Volume Populator rimuove automaticamente tutte queste risorse temporanee.

Per ispezionare le risorse temporanee:

  1. Memorizza le variabili di ambiente:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Sostituisci i seguenti valori:

    • PVC_NAME: il nome della risorsa PersistentVolumeClaim.
    • NAMESPACE: lo spazio dei nomi in cui vengono eseguiti i tuoi workload.
  2. Controlla lo stato:

    export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}')
    export TEMP_PVC=prime-${PVC_UID}
    echo ${TEMP_PVC}
    
  3. Ispeziona il PVC temporaneo nello spazio dei nomi gke-managed-volumepopulator:

    kubectl describe pvc ${TEMP_PVC} -n gke-managed-volumepopulator
    
  4. Recupera i nomi dei PVC temporanei nel tuo spazio dei nomi:

    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. Ispeziona i PVC temporanei:

    kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
    
  6. GKE Volume Populator crea un job di trasferimento in ogni zona (uno in caso di un volume Hyperdisk ML a livello di zona e più in caso di volumi Hyperdisk ML multizona). Recupera il nome del job di trasferimento utilizzando il seguente 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. Ispeziona il job di trasferimento:

    kubectl describe job $TRANSFER_JOB -n $NAMESPACE
    
  8. Recupera il nome del pod dal job di trasferimento:

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

    kubectl describe pod $TRANSFER_POD -n $NAMESPACE
    

    Se crei un PVC in più zone, GKE Volume Populator crea PVC temporanei distinti e risorse di trasferimento dei job per ogni zona specificata. Per esaminare le risorse per ogni zona coinvolta nel trasferimento, sostituisci 0 dell'indice per TEMP_PVC_LIST con altri numeri.

Verifica se la federazione delle identità per i workload è abilitata

La federazione delle identità dei workload consente ai pod di trasferimento di accedere in modo sicuro ai servizi Trusted Cloud by S3NS . Se i pod di trasferimento non riescono ad autenticarsi a Trusted Cloud by S3NS, verifica che la federazione delle identità per i carichi di lavoro per GKE sia abilitata sul cluster.

  1. Per verificare se workloadIdentityConfig è abilitato sul cluster, esegui questo comando:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona di computing del cluster.
    • PROJECT_ID: il tuo ID progetto Trusted Cloud .
  2. Cerca il seguente output nel comando:

    PROJECT_ID.svc.id.goog
    
  3. Se workloadIdentityConfig non è presente nell'output, abilita Workload Identity Federation for GKE.

Percorso di trasferimento non valido

Se riscontri un errore simile al seguente, il percorso di trasferimento specificato nella risorsa GCPDatasource non è corretto e il trasferimento non andrà a buon fine.

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

Per risolvere il problema, elimina la risorsa GCPDatasource, aggiorna il campo uri con il valore corretto e ricrea la risorsa.

Autorizzazione insufficiente per accedere al bucket

Se il account di servizio Kubernetes non ha accesso all'URI del bucket specificato nella risorsa GCPDatasource, il job di trasferimento non andrà a buon fine. L'errore potrebbe essere simile al seguente:

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.

Per risolvere il problema, concedi le autorizzazioni necessarie per trasferire i dati dal 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"

Sostituisci quanto segue:

  • GCS_BUCKET: il nome del bucket Cloud Storage.
  • PROJECT_NUMBER: il tuo Trusted Cloud numero di progetto.
  • PROJECT_ID: il tuo ID progetto Trusted Cloud .
  • NAMESPACE: lo spazio dei nomi in cui vengono eseguiti i tuoi workload.
  • KSA_NAME: il nome del tuo account di servizio Kubernetes.
  • ROLE: il ruolo IAM che fornisce le autorizzazioni necessarie per accedere al bucket. Ad esempio, utilizza roles/storage.objectViewer per concedere l'accesso di sola lettura al bucket.

Errore: error generating accessibility requirements

Quando controlli il PVC nello spazio dei nomi gke-managed-volumepopulator, potresti visualizzare il seguente errore temporaneo:

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

Se utilizzi un cluster GKE Autopilot o un cluster Standard con il provisioning automatico dei nodi abilitato, questo errore può verificarsi perché nel cluster non sono presenti nodi Ready. L'errore dovrebbe risolversi entro pochi minuti dopo che il provisioning automatico dei nodi esegue lo scale up di un nuovo nodo.

Il pod di trasferimento è in fase di pianificazione Pending da molto tempo

L'evento PVC potrebbe mostrare lo stato del pod di trasferimento Pending per molto tempo.

Per controllare gli eventi del job di trasferimento e verificare se la pianificazione non è riuscita, segui questi passaggi:

  1. Descrivi la PVC:

    kubectl describe pvc $PVC_NAME -n $NAMESPACE
    

    L'output è simile al seguente:

    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. Per ispezionare il pod di trasferimento, segui i passaggi descritti in Ispezionare le risorse Kubernetes temporanee.

    L'output è simile al seguente:

    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. Se visualizzi il messaggio NotTriggerScaleUp, controlla se il provisioning automatico dei nodi è abilitato nel cluster:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona di computing del cluster.
  4. Se l'output mostra "False", attiva il provisioning automatico dei nodi utilizzando il seguente 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
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster che stai aggiornando per abilitare il provisioning automatico dei nodi.
    • LOCATION: la zona di computing o la regione del cluster. Ad esempio, us-central1-a o us-central1.
    • PROJECT_ID: il tuo ID progetto Trusted Cloud by S3NS .
    • MINIMUM_CPU: il numero minimo di vCPU da eseguire il provisioning automatico. Ad esempio, 10.
    • MINIMUM_MEMORY: la quantità minima di memoria in GiB di cui eseguire il provisioning automatico. Ad esempio, 200.
    • MAXIMUM_CPU: il numero massimo di vCPU da eseguire il provisioning automatico. Ad esempio, 100. Questo limite è la somma delle risorse CPU in tutti i node pool esistenti creati manualmente e in tutti i node pool che GKE potrebbe creare automaticamente.
    • MAXIMUM_MEMORY: la quantità massima di memoria da eseguire il provisioning automatico. Ad esempio, 1000. Questo limite è la somma delle risorse di memoria in tutti i node pool esistenti creati manualmente e in tutti i node pool che GKE potrebbe creare automaticamente.
  5. Se il provisioning automatico dei nodi è abilitato, verifica che il provisioning automatico dei nodi abbia una scalabilità automatica sufficiente resourceLimits per scalare il job di trasferimento. Il job di trasferimento utilizza 24 vCPU per impostazione predefinita.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona di computing del cluster.

    L'output è simile al seguente:

    {'maximum': '1000000000', 'resourceType': 'cpu'};{'maximum': '1000000000', 'resourceType': 'memory'};
    
  6. Se il provisioning automatico dei nodi non ha limiti di scalabilità automatica sufficienti, aggiorna il cluster con la configurazione corretta.

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster che stai aggiornando per abilitare il provisioning automatico dei nodi.
    • LOCATION: la zona di computing o la regione del cluster. Ad esempio, us-central1-a o us-central1.
    • PROJECT_ID: il tuo ID progetto Trusted Cloud by S3NS .
    • MAXIMUM_CPU: il numero massimo di vCPU da eseguire il provisioning automatico. Ad esempio, 100. Questo limite è la somma delle risorse CPU in tutti i node pool esistenti creati manualmente e in tutti i node pool che GKE potrebbe creare automaticamente.
    • MAXIMUM_MEMORY: la quantità massima di memoria da eseguire il provisioning automatico. Ad esempio, 1000. Questo limite è la somma delle risorse di memoria in tutti i node pool esistenti creati manualmente e in tutti i node pool che GKE potrebbe creare automaticamente.
  7. Per i cluster Standard senza il provisioning automatico dei nodi abilitato, verifica che il nodo creato per il job di trasferimento abbia l'etichetta della classe di computing richiesta:

    kubectl get node -l cloud.google.com/compute-class=gcs-to-hdml-compute-class
    
  8. Se l'output non elenca il nodo che hai creato per il job di trasferimento, aggiungi l'etichetta della classe di calcolo gcs-to-hdml-compute-class al nodo:

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

    Sostituisci NODE_NAME con il nome del nodo a cui vuoi aggiungere l'etichetta della classe di calcolo.

GCE quota exceeded errore

Quando controlli il pod per il job di trasferimento, potresti visualizzare un messaggio di errore simile al seguente:

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. Per ispezionare il pod di trasferimento, segui i passaggi descritti in Ispezionare le risorse Kubernetes temporanee.

  2. Per risolvere l'errore, aumenta la quota o elimina le risorse esistenti che potrebbero impedire lo scale up. Per saperne di più, vedi Risolvere gli errori di quota.

Errore Hyperdisk ML HDML_TOTAL_THROUGHPUT superato

Se il PVC temporaneo nello spazio dei nomi gke-managed-volumepopulator non riesce a eseguire il provisioning del volume Hyperdisk ML, è possibile che la quota regionale per la creazione del nuovo volume Hyperdisk ML per il trasferimento dei dati sia stata superata.

Per verificare che il provisioning del volume Hyperdisk ML non sia riuscito a causa di un problema di quota regionale, esamina i log eventi associati al PVC temporaneo creato da GKE Volume Populator. Segui questi passaggi:

  1. Memorizza le variabili di ambiente pertinenti:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Sostituisci i seguenti valori:

    • PVC_NAME: il nome della risorsa PersistentVolumeClaim.
    • NAMESPACE: lo spazio dei nomi in cui vengono eseguiti i tuoi workload.
  2. Controlla lo stato del PVC temporaneo:

    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. Controlla gli eventi PVC per trovare QUOTA_EXCEEDED error, che è simile al seguente:

    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
    

Per risolvere il problema:

  1. Richiedi una quota aggiuntiva per creare nuovi volumi Hyperdisk ML nel tuo progetto.
  2. Elimina tutti i dischi Hyperdisk ML inutilizzati nel progetto.

Spazio esaurito sul dispositivo

Se visualizzi il messaggio di errore No space left on device nel tuo PVC, significa che il volume Hyperdisk ML è pieno e non è possibile scrivervi altri dati. L'errore potrebbe essere simile al seguente:

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

Per risolvere il problema, elimina il PVC, aumenta il valore del campo spec.resources.requests.storage nel manifest del PVC e ricrea il PVC per riavviare il processo di trasferimento.

Passaggi successivi

  • Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedi assistenza.