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:
- Viene creata una PVC temporanea nello spazio dei nomi
gke-managed-volumepopulator
. - Per ogni zona coinvolta nel trasferimento, vengono creati un job di trasferimento, PV e PVC nello spazio dei nomi del PVC.
- Al termine del trasferimento dei dati, GKE Volume Populator rimuove automaticamente tutte queste risorse temporanee.
Per ispezionare le risorse temporanee:
Memorizza le variabili di ambiente:
export PVC_NAME=PVC_NAME export NAMESPACE=NAMESPACE
Sostituisci i seguenti valori:
PVC_NAME
: il nome della risorsaPersistentVolumeClaim
.NAMESPACE
: lo spazio dei nomi in cui vengono eseguiti i tuoi workload.
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}
Ispeziona il PVC temporaneo nello spazio dei nomi
gke-managed-volumepopulator
:kubectl describe pvc ${TEMP_PVC} -n gke-managed-volumepopulator
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
Ispeziona i PVC temporanei:
kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
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
Ispeziona il job di trasferimento:
kubectl describe job $TRANSFER_JOB -n $NAMESPACE
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
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 perTEMP_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.
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 .
Cerca il seguente output nel comando:
PROJECT_ID.svc.id.goog
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, utilizzaroles/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:
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
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:
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.
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
ous-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.
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'};
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
ous-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.
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
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.
Per ispezionare il pod di trasferimento, segui i passaggi descritti in Ispezionare le risorse Kubernetes temporanee.
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:
Memorizza le variabili di ambiente pertinenti:
export PVC_NAME=PVC_NAME export NAMESPACE=NAMESPACE
Sostituisci i seguenti valori:
PVC_NAME
: il nome della risorsaPersistentVolumeClaim
.NAMESPACE
: lo spazio dei nomi in cui vengono eseguiti i tuoi workload.
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
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:
- Richiedi una quota aggiuntiva per creare nuovi volumi Hyperdisk ML nel tuo progetto.
- 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.