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.
Buka Logs Explorer di konsol Google Cloud:
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.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 adalah1
.
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:
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.
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:
Tambahkan kumpulan node ke cluster Anda.
Pastikan node pool baru telah dibuat dengan menjalankan perintah berikut:
gcloud container node-pools list --cluster CLUSTER_NAME
Jalankan perintah berikut untuk melihat node mana yang menjalankan Pod (lihat kolom
NODE
):kubectl get pods -o=wide
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
Jalankan perintah
kubectl cordon NODE
(gantiNODE
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
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
, denganNEW_NODE_POOL_NAME
sebagai nama kumpulan node baru. Hal ini memastikan bahwa GKE menempatkan beban kerja tersebut pada node di kumpulan node yang baru.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.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
Hapus kumpulan node yang ada jika tidak diperlukan lagi:
gcloud container node-pools delete default-pool --cluster CLUSTER_NAME