Neste guia, mostramos como resolver problemas comuns que surgem ao transferir dados para clusters do GKE usando o GKE Volume Populator. Ele orienta você na depuração dos problemas relacionados à criação de PersistentVolumeClaim (PVC) e PersistentVolume (PV), ao desempenho do disco e à execução do Job de transferência de dados.
Inspecionar recursos temporários do Kubernetes
Veja como o GKE Volume Populator usa recursos temporários:
- Um PVC temporário é criado no namespace
gke-managed-volumepopulator
. - Para cada zona envolvida na transferência, um job de transferência, PVs e PVCs são criados no namespace do PVC.
- Depois que a transferência de dados é concluída, o GKE Volume Populator remove automaticamente todos esses recursos temporários.
Para inspecionar os recursos temporários, siga estas etapas:
Armazene as variáveis de ambiente:
export PVC_NAME=PVC_NAME export NAMESPACE=NAMESPACE
Substitua os seguintes valores:
PVC_NAME
: o nome do recursoPersistentVolumeClaim
.NAMESPACE
: o namespace em que as cargas de trabalho são executadas.
Verifique o status:
export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}') export TEMP_PVC=prime-${PVC_UID} echo ${TEMP_PVC}
Inspecione o PVC temporário no namespace
gke-managed-volumepopulator
:kubectl describe pvc ${TEMP_PVC} -n gke-managed-volumepopulator
Confira os nomes dos PVCs temporários no seu namespace:
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
Inspecione os PVCs temporários:
kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
O GKE Volume Populator cria um job de transferência em cada zona (um no caso de um volume de ML do Hyperdisk de zona única e vários no caso de volumes de ML do Hyperdisk de várias zonas). Use o comando a seguir para receber o nome do job de transferência:
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
Inspecione o job de transferência:
kubectl describe job $TRANSFER_JOB -n $NAMESPACE
Consiga o nome do pod do job de transferência:
export TRANSFER_POD=$(kubectl get pods -n "$NAMESPACE" -l "job-name=$TRANSFER_JOB" -o jsonpath='{.items[0].metadata.name}') echo $TRANSFER_POD
Inspecione o pod:
kubectl describe pod $TRANSFER_POD -n $NAMESPACE
Se você criar uma PVC em várias zonas, o GKE Volume Populator vai criar PVCs temporárias distintas e os recursos de Job de transferência para cada zona especificada. Para inspecionar os recursos de cada zona envolvida na transferência, substitua o
0
do índice porTEMP_PVC_LIST
com outros números.
Verificar se a federação de identidade da carga de trabalho está ativada
A federação de identidade da carga de trabalho permite que os pods de transferência acessem os serviços Google Cloud com segurança. Se os pods de transferência não puderem se autenticar em Google Cloud, verifique se a federação de identidade da carga de trabalho para GKE está ativada no cluster.
Para verificar se o
workloadIdentityConfig
está ativado no cluster, execute o seguinte comando:gcloud container clusters describe CLUSTER_NAME --location=LOCATION \ --project=PROJECT_ID \ --format="value(workloadIdentityConfig)"
Substitua:
CLUSTER_NAME
: o nome do cluster.LOCATION
: a região ou zona de computação do cluster.PROJECT_ID
: o ID do projeto Google Cloud .
Procure a seguinte saída no comando:
PROJECT_ID.svc.id.goog
Se
workloadIdentityConfig
estiver ausente da saída, ative a Federação de Identidade da Carga de Trabalho para GKE.
Caminho de transferência inválido
Se você encontrar um erro semelhante ao seguinte, o caminho de transferência especificado no recurso GCPDatasource
está incorreto, e a transferência vai falhar.
ERROR: (gcloud.storage.cp) The following URLs matched no objects or files:
gs://datasets-pd/llama2-7b-hfa/
Para resolver esse problema, exclua o recurso GCPDatasource
, atualize o campo uri
com o valor correto e recrie o recurso.
Permissão insuficiente para acessar o bucket
Se a conta de serviço do Kubernetes não tiver acesso ao URI do bucket especificado no recurso GCPDatasource
, o job de transferência vai falhar. O erro pode ser semelhante a este:
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 o problema, conceda as permissões necessárias para transferir dados do bucket para o 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"
Substitua:
GCS_BUCKET
: seu nome do bucket do Cloud StoragePROJECT_NUMBER
: o número do projeto do Google Cloud .PROJECT_ID
: o ID do projeto Google Cloud .NAMESPACE
: o namespace em que as cargas de trabalho são executadas.KSA_NAME
: o nome da sua conta de serviço do Kubernetes.ROLE
: o papel do IAM que fornece as permissões necessárias para acessar o bucket. Por exemplo, useroles/storage.objectViewer
para conceder acesso somente leitura ao bucket.
Erro: error generating accessibility requirements
Você pode encontrar o seguinte erro temporário ao verificar o PVC no namespace gke-managed-volumepopulator
:
Error: error generating accessibility requirements: no available topology found.
Se você usa um cluster do GKE Autopilot ou um cluster padrão com o provisionamento automático de nós ativado, esse erro pode ocorrer porque não há nós Ready
no cluster. O erro será resolvido em alguns minutos depois que o provisionamento automático de nós escalonar um novo nó.
O pod de transferência está Pending
há muito tempo
Seu evento de PVC pode mostrar que o status do pod de transferência é Pending
por muito tempo.
Para verificar os eventos do job de transferência e saber se o agendamento falhou, siga estas etapas:
Descreva o PVC:
kubectl describe pvc $PVC_NAME -n $NAMESPACE
O resultado será assim:
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
Para inspecionar o pod de transferência, siga as etapas em Inspecionar recursos temporários do Kubernetes.
O resultado será assim:
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 você vir a mensagem
NotTriggerScaleUp
, verifique se o provisionamento automático de nós está ativado no cluster:gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(autoscaling.enableNodeAutoprovisioning)"
Substitua:
CLUSTER_NAME
: o nome do cluster.LOCATION
: a região ou zona de computação do cluster.
Se a saída mostrar "False", ative o provisionamento automático de nós usando o seguinte 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
Substitua:
CLUSTER_NAME
: o nome do cluster que você está atualizando para ativar o provisionamento automático de nós.LOCATION
: a zona ou região de computação do cluster. Por exemplo,us-central1-a
ouus-central1
.PROJECT_ID
: o ID do projeto Google Cloud .MINIMUM_CPU
: o número mínimo de vCPUs a serem provisionadas automaticamente. Por exemplo,10
.MINIMUM_MEMORY
: a quantidade mínima de memória em GiB para provisionamento automático. Por exemplo,200
.MAXIMUM_CPU
: o número máximo de vCPUs a serem provisionadas automaticamente. Por exemplo,100
. Esse limite é o total de recursos de CPU em todos os pools de nós criados manualmente e em todos os pools de nós que o GKE pode criar automaticamente.MAXIMUM_MEMORY
: a quantidade máxima de memória a ser provisionada automaticamente. Por exemplo,1000
. Esse limite é o total dos recursos de memória em todos os pools de nós criados manualmente e em todos os pools que o GKE pode criar automaticamente.
Se o provisionamento automático de nós estiver ativado, verifique se ele tem escalonamento automático
resourceLimits
suficiente para aumentar a escala do job de transferência. O job de transferência usa 24 vCPUs por padrão.gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(autoscaling.resourceLimits)"
Substitua:
CLUSTER_NAME
: o nome do cluster.LOCATION
: a região ou zona de computação do cluster.
O resultado será assim:
{'maximum': '1000000000', 'resourceType': 'cpu'};{'maximum': '1000000000', 'resourceType': 'memory'};
Se o provisionamento automático de nós não tiver limites de escalonamento automático suficientes, atualize o cluster com a configuração correta.
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --max-cpu MAXIMUM_CPU \ --max-memory MAXIMUM_MEMORY
Substitua:
CLUSTER_NAME
: o nome do cluster que você está atualizando para ativar o provisionamento automático de nós.LOCATION
: a zona ou região de computação do cluster. Por exemplo,us-central1-a
ouus-central1
.PROJECT_ID
: o ID do projeto Google Cloud .MAXIMUM_CPU
: o número máximo de vCPUs a serem provisionadas automaticamente. Por exemplo,100
. Esse limite é o total de recursos de CPU em todos os pools de nós criados manualmente e em todos os pools de nós que o GKE pode criar automaticamente.MAXIMUM_MEMORY
: a quantidade máxima de memória a ser provisionada automaticamente. Por exemplo,1000
. Esse limite é o total dos recursos de memória em todos os pools de nós criados manualmente e em todos os pools que o GKE pode criar automaticamente.
Para clusters padrão sem o provisionamento automático de nós ativado, verifique se o nó criado para o job de transferência tem o rótulo de classe de computação necessário:
kubectl get node -l cloud.google.com/compute-class=gcs-to-hdml-compute-class
Se a saída não listar o nó criado para o job de transferência, adicione o rótulo de classe de computação
gcs-to-hdml-compute-class
ao nó:kubectl label node NODE_NAME cloud.google.com/compute-class=gcs-to-hdml-compute-class
Substitua
NODE_NAME
pelo nome do nó em que você quer adicionar o rótulo da classe de computação.
GCE quota exceeded
erro
Ao verificar o pod do job de transferência, talvez você encontre uma mensagem de erro semelhante a esta:
Node scale up in zones us-west1-b associated with this pod failed: GCE quota exceeded. Pod is at risk of not being scheduled.
Para inspecionar o pod de transferência, siga as etapas em Inspecionar recursos temporários do Kubernetes.
Para resolver o erro, aumente a cota ou exclua os recursos atuais que podem estar impedindo o escalonamento vertical. Para mais informações, consulte Resolver erros de cota.
Erro de HDML_TOTAL_THROUGHPUT
excedido do Hyperdisk ML
Se o PVC temporário no namespace gke-managed-volumepopulator
não provisionar o volume do Hyperdisk ML, talvez a cota regional para criar o novo volume do Hyperdisk ML para sua transferência de dados tenha sido excedida.
Para confirmar que o provisionamento do volume de ML do Hyperdisk falhou devido a um problema de cota regional, inspecione os registros de eventos associados ao PVC temporário criado pelo GKE Volume Populator. Siga estas etapas:
Armazene as variáveis de ambiente relevantes:
export PVC_NAME=PVC_NAME export NAMESPACE=NAMESPACE
Substitua os seguintes valores:
PVC_NAME
: o nome do recursoPersistentVolumeClaim
.NAMESPACE
: o namespace em que as cargas de trabalho são executadas.
Verifique o status do PVC temporário:
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
Verifique os eventos do PVC para encontrar o
QUOTA_EXCEEDED error
, que é semelhante a este: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 resolver o problema:
- Solicite mais cota para criar novos volumes do Hyperdisk ML no seu projeto.
- Exclua todos os discos do Hyperdisk ML não utilizados no seu projeto.
Não há espaço livre no dispositivo
Se a mensagem de erro No space left on device
aparecer no seu PVC, isso significa que o volume de ML do Hyperdisk está cheio e não é possível gravar mais dados nele. O erro pode ser semelhante a este:
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 esse problema, exclua a PVC, aumente o valor do campo spec.resources.requests.storage
no manifesto da PVC e recrie a PVC para iniciar o processo de transferência novamente.
A seguir
- Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte.