Memecahkan masalah node pool GKE Standard


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

Jika Anda memerlukan bantuan tambahan, 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.

Masalah: Pembuatan node pool gagal karena resource tidak memadai

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 'MACHINE_NAME' does not exist in zone 'ZONE_NAME'

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.

Error: Instance tidak berisi metadata 'instance-template'

Anda mungkin melihat error berikut sebagai status node pool yang gagal melakukan upgrade, penskalaan, atau perbaikan node otomatis:

Instance INSTANCE_NAME does not contain 'instance-template' metadata

Error ini menunjukkan bahwa metadata instance VM, yang dialokasikan oleh GKE, mengalami kerusakan. Hal ini biasanya terjadi saat otomatisasi atau skrip yang dibuat secara kustom mencoba menambahkan metadata instance baru (seperti block-project-ssh-keys), dan bukannya hanya menambahkan atau memperbarui nilai, tetapi juga menghapus metadata yang ada. Anda dapat membaca tentang metadata instance VM di Menyetel metadata kustom.

Jika salah satu nilai metadata penting (antara lain: instance-template, kube-labels, kubelet-config, kubeconfig, cluster-name, configure-sh, cluster-uid) telah dihapus, kondisi node atau seluruh node pool dapat menjadi tidak stabil karena nilai-nilai ini sangat penting untuk operasi GKE.

Jika metadata instance rusak, sebaiknya Anda memulihkan metadata dengan membuat ulang node pool yang berisi instance VM yang rusak. Anda harus menambahkan node pool ke cluster dan meningkatkan jumlah node pada node pool baru, sekaligus menghapus dan menandai node di cluster lain sebagai tidak dapat dijadwalkan. Lihat petunjuk untuk memigrasikan workload antar-node pool.

Untuk menemukan siapa yang mengedit metadata instance dan kapan tindakan tersebut dilakukan, Anda dapat meninjau informasi logging audit Compute Engine atau menemukan log menggunakan Logs Explorer dengan kueri penelusuran yang mirip dengan berikut ini:

resource.type="gce_instance_group_manager"
protoPayload.methodName="v1.compute.instanceGroupManagers.setInstanceTemplate"

Di log, Anda dapat menemukan alamat IP sumber permintaan dan agen pengguna. Misalnya:

requestMetadata: {
  callerIp: "REDACTED"
  callerSuppliedUserAgent: "google-api-go-client/0.5 GoogleContainerEngine/v1"
}

Memigrasikan workload antar-node pool

Gunakan petunjuk berikut untuk memigrasikan workload dari satu node pool ke node pool lain. Jika Anda ingin mengubah atribut mesin node di node pool, lihat Menskalakan secara vertikal dengan mengubah atribut mesin node.

Memahami cara memigrasikan Pod ke node pool baru

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

  1. Menghalangi node dalam node pool yang ada: Operasi ini menandai node dalam node pool yang ada sebagai tidak dapat dijadwalkan. Kubernetes akan menghentikan penjadwalan Pod baru ke node ini setelah Anda menandainya sebagai tidak dapat dijadwalkan.

  2. Menghapus node di node pool yang ada: Operasi ini menghapus workload yang berjalan di node dari node pool yang ada secara tuntas.

Langkah-langkah ini, yang dilakukan satu per satu untuk setiap node, menyebabkan Pod yang berjalan di kumpulan node yang ada dihentikan dengan baik. Kubernetes akan menjadwalkan ulang pod ke node lain yang tersedia.

Untuk memastikan Kubernetes menghentikan aplikasi Anda dengan tuntas, container harus menangani sinyal SIGTERM. Gunakan pendekatan ini untuk menutup koneksi aktif ke klien dan melakukan atau rollback transaksi database dengan cara yang bersih. 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 selengkapnya tentang Penghentian pod di dokumentasi Kubernetes.

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

Membuat node pool dan memigrasikan workload

Untuk memigrasikan workload ke node pool baru, buat node pool baru, lalu cordon dan habiskan node di node pool yang ada:

  1. Tambahkan node pool ke cluster Anda.

    Pastikan bahwa node pool baru 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 node pool yang ada, dengan mengganti EXISTING_NODE_POOL_NAME dengan nama:

    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 node pool 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. Secara opsional, perbarui beban kerja yang berjalan di node pool yang ada untuk menambahkan nodeSelector untuk label cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME, dengan NEW_NODE_POOL_NAME adalah nama node pool baru. Hal ini memastikan bahwa GKE menempatkan workload tersebut di node dalam node pool baru.

  6. Kosongkan setiap node dengan mengeluarkan Pod dengan periode penghentian tuntas yang dialokasikan 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 dalam kumpulan node yang ada memiliki status SchedulingDisabled dalam daftar node:

    kubectl get nodes
    

    Selain itu, Anda akan melihat bahwa Pod sekarang berjalan di node dalam node pool baru:

    kubectl get pods -o=wide
    
  8. Hapus node pool yang ada jika Anda tidak memerlukannya lagi:

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

Langkah selanjutnya

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.