Memecahkan masalah node pool GKE Standard


Halaman ini menunjukkan cara menyelesaikan masalah di node pool mode GKE Standard.

Jika Anda memerlukan bantuan lainnya, hubungi Cloud Customer Care.

Masalah pembuatan node pool

Bagian ini mencantumkan masalah yang mungkin terjadi saat membuat node pool baru di cluster Standard dan memberikan saran cara memperbaikinya.

Pembuatan node pool gagal karena ketersediaan resource

Masalah berikut terjadi saat Anda membuat node pool dengan hardware spesifik di zona Google Cloud yang tidak memiliki cukup hardware yang tersedia untuk memenuhi persyaratan Anda.

Untuk memvalidasi bahwa pembuatan node pool gagal karena zona tidak memiliki cukup resource, periksa log Anda untuk menemukan pesan error yang relevan.

  1. Buka Logs Explorer di konsol Google Cloud:

    Buka Logs Explorer

  2. Di kolom Kueri, tentukan kueri berikut:

    log_id(cloudaudit.googleapis.com/activity)
    resource.labels.cluster_name="CLUSTER_NAME"
    protoPayload.status.message:("ZONE_RESOURCE_POOL_EXHAUSTED" OR "does not have enough resources available to fulfill the request" OR "resource pool exhausted" OR "does not exist in zone")
    

    Ganti CLUSTER_NAME dengan nama cluster GKE Anda.

  3. Klik Jalankan kueri.

Anda mungkin melihat salah satu pesan error berikut:

  • resource pool exhausted
  • The zone does not have enough resources available to fulfill the request. Try a different zone, or try again later.
  • ZONE_RESOURCE_POOL_EXHAUSTED
  • ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS
  • Machine type with name '<code><var>MACHINE_NAME</var></code>' does not exist in zone '<code><var>ZONE_NAME</var></code>'

Selesaikan

Untuk mengatasi masalah ini, coba saran berikut:

  • Pastikan region atau zona Google Cloud yang dipilih memiliki hardware spesifik yang Anda butuhkan. Gunakan tabel ketersediaan Compute Engine untuk memeriksa apakah zona tertentu mendukung hardware spesifik atau tidak. Pilih region atau zona Google Cloud lain untuk node Anda yang mungkin memiliki ketersediaan hardware yang lebih baik yang Anda butuhkan.
  • Buat node pool dengan jenis mesin yang lebih kecil. Tingkatkan jumlah node di node pool sehingga total kapasitas komputasi tetap sama.
  • Gunakan pemesanan kapasitas Compute Engine untuk memesan resource terlebih dahulu.
  • Gunakan penyediaan upaya terbaik, yang dijelaskan di bagian berikut, agar berhasil membuat node pool jika dapat menyediakan setidaknya jumlah minimum node yang ditentukan di luar jumlah yang diminta.

Upaya penyediaan terbaik

Untuk hardware tertentu, Anda dapat menggunakan upaya penyediaan terbaik, yang memberi tahu GKE agar berhasil membuat node pool jika dapat menyediakan node dalam jumlah minimum yang ditentukan. GKE terus berupaya menyediakan node yang tersisa untuk memenuhi permintaan asli dari waktu ke waktu. Untuk memberi tahu GKE agar menyediakannya dengan upaya terbaik, gunakan perintah berikut:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --node-locations=ZONE1,ZONE2,... \
    --machine-type=MACHINE_TYPE
    --best-effort-provision \
    --min-provision-nodes=MINIMUM_NODES

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool baru.
  • ZONE1,ZONE2,...: zona Compute Engine untuk node. Zona ini harus mendukung hardware yang dipilih.
  • MACHINE_TYPE: jenis mesin Compute Engine untuk node. Contoh, a2-highgpu-1g.
  • MINIMUM_NODES: jumlah minimum node untuk GKE yang disediakan dan berhasil membuat node pool. Jika dihilangkan, defaultnya adalah 1.

Misalnya, pertimbangkan skenario saat Anda memerlukan 10 node dengan GPU NVIDIA A100 40 GB yang dipasang di us-central1-c. Menurut tabel ketersediaan region dan zona GPU, zona ini mendukung GPU A100. Untuk menghindari kegagalan pembuatan node pool jika 10 mesin GPU tidak tersedia, Anda harus menggunakan penyediaan upaya terbaik.

gcloud container node-pools create a100-nodes \
    --cluster=ml-cluster \
    --node-locations=us-central1-c \
    --num-nodes=10 \
    --machine-type=a2-highgpu-1g \
    --accelerator=type=nvidia-tesla-a100,count=1 \
    --best-effort-provision \
    --min-provision-nodes=5

GKE membuat node pool meskipun hanya lima GPU yang tersedia di us-central1-c. Seiring waktu, GKE mencoba menyediakan lebih banyak node hingga ada 10 node di node pool.

Memigrasikan workload antar-kumpulan node

Gunakan petunjuk berikut untuk memigrasikan workload dari satu kumpulan node ke kumpulan node lainnya. Jika ingin mengubah atribut mesin node di kumpulan node, lihat Mengatur skala secara vertikal dengan mengubah atribut mesin node.

Cara memigrasikan Pod ke kumpulan node baru

Untuk memigrasikan Pod ke kumpulan node baru, Anda harus melakukan hal berikut:

  1. Cordon the existing node pool: Operasi ini menandai node dalam kumpulan node yang ada sebagai tidak dapat dijadwalkan. Kubernetes berhenti menjadwalkan Pod baru ke node ini setelah Anda menandainya sebagai tidak dapat dijadwalkan.

  2. Mengosongkan kumpulan node yang ada: Operasi ini akan menghapus beban kerja yang berjalan pada node kumpulan node yang ada dengan baik.

Langkah-langkah ini menyebabkan Pod yang berjalan di kumpulan node yang ada dihentikan dengan baik. Kubernetes akan menjadwalkan ulangnya ke node lain yang tersedia.

Untuk memastikan Kubernetes menghentikan aplikasi Anda dengan baik, container Anda harus menangani sinyal SIGTERM. Gunakan pendekatan ini untuk menutup koneksi aktif ke klien dan melakukan atau melakukan rollback transaksi database dengan cara yang rapi. Dalam manifes Pod, Anda dapat menggunakan kolom spec.terminationGracePeriodSeconds untuk menentukan berapa lama Kubernetes harus menunggu sebelum menghentikan container di Pod. Durasi defaultnya adalah 30 detik. Anda dapat membaca informasi tentang Penghentian pod lebih lanjut di dokumentasi Kubernetes.

Anda dapat menghubungkan dan mengosongkan node menggunakan perintah kubectl cordon dan kubectl drain.

Membuat node pool dan memigrasikan workload

Untuk memigrasikan workload Anda ke kumpulan node baru, buat kumpulan node baru, lalu cordon dan kuraskan node di kumpulan node yang ada:

  1. Tambahkan kumpulan node ke cluster Anda.

    Pastikan node pool baru telah dibuat dengan menjalankan perintah berikut:

    gcloud container node-pools list --cluster CLUSTER_NAME
    
  2. Jalankan perintah berikut untuk melihat node mana yang menjalankan Pod (lihat kolom NODE):

    kubectl get pods -o=wide
    
  3. Dapatkan daftar node di kumpulan node yang ada, dengan mengganti EXISTING_NODE_POOL_NAME dengan namanya:

    kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME
    
  4. Jalankan perintah kubectl cordon NODE (ganti NODE dengan nama dari perintah sebelumnya). Perintah shell berikut mengiterasi setiap node di kumpulan node yang ada dan menandainya sebagai tidak dapat dijadwalkan:

    for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do
      kubectl cordon "$node";
    done
    
  5. Jika ingin, perbarui beban kerja Anda yang berjalan di kumpulan node yang ada guna menambahkan nodeSelector untuk label cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME, dengan NEW_NODE_POOL_NAME sebagai nama kumpulan node baru. Hal ini memastikan bahwa GKE menempatkan beban kerja tersebut pada node di kumpulan node yang baru.

  6. Kuras setiap node dengan mengeluarkan Pod dengan periode penghentian tuntas selama 10 detik:

    for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do
      kubectl drain --force --ignore-daemonsets --delete-emptydir-data --grace-period=GRACEFUL_TERMINATION_SECONDS  "$node";
    done
    

    Ganti GRACEFUL_TERMINATION_PERIOD_SECONDS dengan jumlah waktu yang diperlukan untuk penghentian halus.

  7. Jalankan perintah berikut untuk melihat bahwa node di kumpulan node yang ada memiliki status SchedulingDisabled dalam daftar node:

    kubectl get nodes
    

    Selain itu, Anda akan melihat bahwa Pod kini berjalan di node dalam kumpulan node baru:

    kubectl get pods -o=wide
    
  8. Hapus kumpulan node yang ada jika tidak diperlukan lagi:

    gcloud container node-pools delete default-pool --cluster CLUSTER_NAME
    

Langkah selanjutnya

Jika Anda memerlukan bantuan lainnya, hubungi Cloud Customer Care.