Memecahkan masalah transfer data GKE Volume Populator

Panduan ini menunjukkan cara menyelesaikan masalah umum yang muncul saat mentransfer data ke cluster GKE menggunakan GKE Volume Populator. Panduan ini akan memandu Anda men-debug masalah terkait pembuatan PersistentVolumeClaim (PVC) dan PersistentVolume (PV), performa disk, serta eksekusi Job transfer data.

Memeriksa resource Kubernetes sementara

Berikut cara GKE Volume Populator menggunakan resource sementara:

  1. PVC sementara dibuat di namespace gke-managed-volumepopulator.
  2. Untuk setiap zona yang terlibat dalam transfer, Tugas transfer, PV, dan PVC dibuat di namespace PVC Anda.
  3. Setelah transfer data selesai, GKE Volume Populator akan otomatis menghapus semua resource sementara ini.

Untuk memeriksa resource sementara, ikuti langkah-langkah berikut:

  1. Simpan variabel lingkungan:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Ganti nilai berikut:

    • PVC_NAME: nama resource PersistentVolumeClaim.
    • NAMESPACE: namespace tempat workload Anda berjalan.
  2. Periksa status:

    export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}')
    export TEMP_PVC=prime-${PVC_UID}
    echo ${TEMP_PVC}
    
  3. Periksa PVC sementara di namespace gke-managed-volumepopulator:

    kubectl describe pvc ${TEMP_PVC} -n gke-managed-volumepopulator
    
  4. Dapatkan nama PVC sementara di namespace Anda:

    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. Periksa PVC sementara:

    kubectl describe pvc "${TEMP_PVC_LIST[0]}" -n $NAMESPACE
    
  6. Pengisi Volume GKE membuat Tugas transfer di setiap zona (satu untuk volume Hyperdisk ML satu zona dan beberapa untuk volume Hyperdisk ML multi-zona). Dapatkan nama Tugas transfer menggunakan perintah berikut:

    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. Periksa Tugas transfer:

    kubectl describe job $TRANSFER_JOB -n $NAMESPACE
    
  8. Dapatkan nama Pod dari tugas transfer:

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

    kubectl describe pod $TRANSFER_POD -n $NAMESPACE
    

    Jika Anda membuat PVC di beberapa zona, Pengelola Volume GKE akan membuat PVC sementara yang berbeda dan mentransfer resource Job untuk setiap zona yang ditentukan. Untuk memeriksa resource setiap zona yang terlibat dalam transfer, ganti 0 indeks untuk TEMP_PVC_LIST dengan angka lain.

Memeriksa apakah Workload Identity Federation diaktifkan

Workload Identity Federation memungkinkan pod transfer mengakses layanan secara aman. Trusted Cloud by S3NS Jika Pod transfer tidak dapat melakukan autentikasi ke Trusted Cloud by S3NS, pastikan Workload Identity Federation untuk GKE diaktifkan di cluster Anda.

  1. Untuk memeriksa apakah workloadIdentityConfig diaktifkan di cluster Anda, jalankan perintah berikut:

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • LOCATION: region atau zona komputasi cluster Anda.
    • PROJECT_ID: Trusted Cloud Project ID Anda.
  2. Cari output berikut dalam perintah:

    PROJECT_ID.svc.id.goog
    
  3. Jika workloadIdentityConfig tidak ada dalam output, aktifkan Workload Identity Federation for GKE.

Jalur transfer tidak valid

Jika Anda mengalami error yang serupa dengan berikut, jalur transfer yang ditentukan pada resource GCPDatasource salah, dan transfer akan gagal.

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

Untuk mengatasi masalah ini, hapus resource GCPDatasource, perbarui kolom uri dengan nilai yang benar, lalu buat ulang resource.

Izin tidak memadai untuk mengakses bucket

Jika akun layanan Kubernetes tidak memiliki akses ke URI bucket yang ditentukan dalam resource GCPDatasource, tugas transfer akan gagal. Errornya mungkin terlihat seperti berikut:

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.

Untuk menyelesaikan masalah ini, berikan izin yang diperlukan untuk mentransfer data dari bucket ke disk.

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"

Ganti kode berikut:

  • GCS_BUCKET: nama bucket Cloud Storage Anda.
  • PROJECT_NUMBER: nomor project Trusted Cloud Anda.
  • PROJECT_ID: Trusted Cloud Project ID Anda.
  • NAMESPACE: namespace tempat workload Anda berjalan.
  • KSA_NAME: nama akun layanan Kubernetes Anda.
  • ROLE: peran IAM yang memberikan izin yang diperlukan untuk mengakses bucket. Misalnya, gunakan roles/storage.objectViewer untuk memberikan akses hanya baca ke bucket.

Error: error generating accessibility requirements

Anda mungkin melihat error sementara berikut saat memeriksa PVC di namespace gke-managed-volumepopulator:

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

Jika Anda menggunakan cluster GKE Autopilot atau cluster Standard dengan penyediaan otomatis node yang diaktifkan, error ini dapat terjadi karena tidak ada node yang Ready di cluster Anda. Error ini akan teratasi dengan sendirinya dalam beberapa menit setelah penyediaan otomatis node meningkatkan skala node baru.

Pod Transfer dijadwalkan Pending untuk waktu yang lama

Peristiwa PVC Anda mungkin menunjukkan bahwa status Pod transfer adalah Pending untuk waktu yang lama.

Untuk memeriksa peristiwa Tugas transfer guna memverifikasi apakah penjadwalan Tugas gagal, ikuti langkah-langkah berikut:

  1. Deskripsikan PVC:

    kubectl describe pvc $PVC_NAME -n $NAMESPACE
    

    Outputnya mirip dengan hal berikut ini:

    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. Untuk memeriksa Pod transfer, ikuti langkah-langkah dalam Memeriksa resource Kubernetes sementara.

    Outputnya mirip dengan hal berikut ini:

    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. Jika Anda melihat pesan NotTriggerScaleUp, periksa apakah cluster Anda telah mengaktifkan penyediaan otomatis node:

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • LOCATION: region atau zona komputasi cluster Anda.
  4. Jika output menampilkan 'False', aktifkan penyediaan otomatis node menggunakan perintah berikut:

    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
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster yang Anda perbarui untuk mengaktifkan penyediaan otomatis node.
    • LOCATION: zona atau region komputasi untuk cluster Anda. Misalnya us-central1-a atau us-central1.
    • PROJECT_ID: Trusted Cloud by S3NS Project ID Anda.
    • MINIMUM_CPU: jumlah minimum vCPU untuk penyediaan otomatis. Contoh, 10.
    • MINIMUM_MEMORY: jumlah minimum memori dalam GiB untuk penyediaan otomatis. Contoh, 200.
    • MAXIMUM_CPU: jumlah maksimum vCPU yang akan disediakan secara otomatis. Contoh, 100. Batas ini adalah total resource CPU di semua node pool yang dibuat secara manual dan semua node pool yang mungkin dibuat secara otomatis oleh GKE.
    • MAXIMUM_MEMORY: jumlah memori maksimum yang akan disediakan otomatis. Contoh, 1000. Batas ini adalah total resource memori di semua node pool yang ada dan dibuat secara manual serta semua node pool yang mungkin dibuat secara otomatis oleh GKE.
  5. Jika penyediaan otomatis node diaktifkan, pastikan penyediaan otomatis node memiliki resourceLimits penskalaan otomatis yang memadai untuk meningkatkan skala Tugas transfer. Tugas transfer menggunakan 24 vCPU secara default.

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • LOCATION: region atau zona komputasi cluster Anda.

    Outputnya mirip dengan hal berikut ini:

    {'maximum': '1000000000', 'resourceType': 'cpu'};{'maximum': '1000000000', 'resourceType': 'memory'};
    
  6. Jika penyediaan otomatis node tidak memiliki batas penskalaan otomatis yang memadai, perbarui cluster dengan konfigurasi yang benar.

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster yang Anda perbarui untuk mengaktifkan penyediaan otomatis node.
    • LOCATION: zona atau region komputasi untuk cluster Anda. Misalnya us-central1-a atau us-central1.
    • PROJECT_ID: Trusted Cloud by S3NS Project ID Anda.
    • MAXIMUM_CPU: jumlah maksimum vCPU yang akan disediakan secara otomatis. Contoh, 100. Batas ini adalah total resource CPU di semua node pool yang dibuat secara manual dan semua node pool yang mungkin dibuat secara otomatis oleh GKE.
    • MAXIMUM_MEMORY: jumlah memori maksimum yang akan disediakan otomatis. Contoh, 1000. Batas ini adalah total resource memori di semua node pool yang ada dan dibuat secara manual serta semua node pool yang mungkin dibuat secara otomatis oleh GKE.
  7. Untuk cluster Standard tanpa penyediaan otomatis node yang diaktifkan, pastikan node yang Anda buat untuk Job transfer memiliki label class komputasi yang diperlukan:

    kubectl get node -l cloud.google.com/compute-class=gcs-to-hdml-compute-class
    
  8. Jika output tidak mencantumkan node yang Anda buat untuk tugas transfer, tambahkan label class komputasi gcs-to-hdml-compute-class ke node:

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

    Ganti NODE_NAME dengan nama node tempat Anda ingin menambahkan label kelas komputasi.

GCE quota exceeded error

Anda mungkin mengalami pesan error yang mirip dengan berikut saat memeriksa Pod untuk Tugas transfer:

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. Untuk memeriksa Pod transfer, ikuti langkah-langkah dalam Memeriksa resource Kubernetes sementara.

  2. Untuk mengatasi error, tingkatkan kuota atau hapus resource yang ada yang mungkin mencegah penskalaan. Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah error kuota.

Error HDML_TOTAL_THROUGHPUT Hyperdisk ML terlampaui

Jika PVC sementara di namespace gke-managed-volumepopulator gagal menyediakan volume Hyperdisk ML, kemungkinan kuota regional untuk membuat volume Hyperdisk ML baru untuk transfer data Anda telah terlampaui.

Untuk mengonfirmasi bahwa penyediaan volume Hyperdisk ML gagal karena masalah kuota regional, periksa log peristiwa yang terkait dengan PVC sementara yang dibuat oleh Pengisi Volume GKE. Ikuti langkah-langkah berikut:

  1. Simpan variabel lingkungan yang relevan:

    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    

    Ganti nilai berikut:

    • PVC_NAME: nama resource PersistentVolumeClaim.
    • NAMESPACE: namespace tempat workload Anda berjalan.
  2. Periksa status PVC sementara:

    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. Periksa peristiwa PVC untuk menemukan QUOTA_EXCEEDED error, yang mirip dengan berikut ini:

    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
    

Untuk menyelesaikan masalah ini:

  1. Minta kuota tambahan untuk membuat volume Hyperdisk ML baru di project Anda.
  2. Hapus disk Hyperdisk ML yang tidak digunakan di project Anda.

Tidak ada ruang tersisa di perangkat

Jika Anda melihat pesan error No space left on device di PVC, berarti volume ML Hyperdisk sudah penuh dan tidak ada lagi data yang dapat ditulis ke dalamnya. Errornya mungkin terlihat seperti berikut:

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

Untuk mengatasi masalah ini, hapus PVC Anda, tingkatkan nilai untuk kolom spec.resources.requests.storage dalam manifes PVC Anda, dan buat ulang PVC untuk memulai proses transfer lagi.

Langkah berikutnya

  • Jika Anda tidak dapat menemukan solusi atas masalah Anda dalam dokumentasi, lihat Mendapatkan dukungan.