Halaman ini menunjukkan cara menyelesaikan error pada workload yang di-deploy di Google Kubernetes Engine (GKE).
Untuk saran yang lebih umum tentang pemecahan masalah aplikasi, lihat Pemecahan Masalah Aplikasi dalam dokumentasi Kubernetes.
Semua error: Periksa status Pod
Jika ada masalah dengan Pod workload, Kubernetes akan memperbarui status Pod dengan pesan error. Lihat error ini dengan memeriksa status Pod menggunakan
konsol Google Cloud atau alat command line kubectl.
Konsol
Lakukan langkah-langkah berikut:
Di konsol Google Cloud , buka halaman Workloads.
Pilih beban kerja yang ingin Anda selidiki. Tab Ringkasan menampilkan status workload.
Dari bagian Managed Pods, klik pesan status error.
kubectl
Untuk melihat semua Pod yang berjalan di cluster Anda, jalankan perintah berikut:
kubectl get pods
Outputnya mirip dengan hal berikut ini:
NAME READY STATUS RESTARTS AGE
POD_NAME 0/1 CrashLoopBackOff 23 8d
Potensi error tercantum di kolom Status.
Untuk mendapatkan informasi selengkapnya tentang Pod tertentu, jalankan perintah berikut:
kubectl describe pod POD_NAME
Ganti POD_NAME dengan nama Pod yang ingin
Anda selidiki.
Dalam output, kolom Events menampilkan informasi selengkapnya tentang error.
Jika Anda menginginkan informasi selengkapnya, lihat log penampung:
kubectl logs POD_NAME
Log ini dapat membantu Anda mengidentifikasi apakah perintah atau kode dalam container menyebabkan Pod error.
Setelah mengidentifikasi error, gunakan bagian berikut untuk mencoba menyelesaikan masalah tersebut.
Error: CrashLoopBackOff
Status CrashLoopBackOff tidak berarti ada error tertentu, tetapi menunjukkan bahwa container berulang kali mengalami error setelah dimulai ulang.
Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah peristiwa CrashLoopBackOff.
Error: ImagePullBackOff dan ErrImagePull
Status ImagePullBackOff atau ErrImagePull menunjukkan bahwa image yang digunakan oleh container tidak dapat dimuat dari registry image.
Untuk mendapatkan panduan tentang cara memecahkan masalah status ini, lihat Memecahkan masalah penarikan gambar.
Error: OutOfPods
Status OutOfPods menunjukkan bahwa node tidak dapat menjalankan Pod karena node telah mencapai kapasitas Pod maksimumnya.
Gejala:
Anda mungkin melihat pesan di peristiwa Pod yang mirip dengan berikut:
Node didn't have enough resource: pods, requested: 1, used: 32, capacity: 32
Penyebab:
Error ini terjadi saat ada permintaan untuk menjadwalkan Pod pada node yang sudah mencapai kapasitas maksimum. Situasi ini biasanya terjadi selama startup node, misalnya saat kube-scheduler menetapkan Pod ke node baru sebelum kubelet melaporkan keberadaan Pod statis seperti kube-proxy, yang memerlukan kapasitas Pod-nya sendiri.
Resolusi:
Untuk mengatasi masalah ini, coba salah satu solusi berikut:
Tingkatkan jumlah maksimum Pod per node. Jika node Anda secara konsisten mencapai batas Pod, tingkatkan setelan
--max-pods-per-nodeuntuk node pool Anda. Menambah jumlah Pod dapat memerlukan node yang lebih besar untuk menangani peningkatan permintaan resource.Aktifkan autoscaler cluster dan penyediaan otomatis node. Jika Anda sering kehabisan kapasitas Pod, mengaktifkan autoscaler cluster dan penyediaan otomatis node dapat membantu memastikan cluster Anda memiliki cukup node untuk memenuhi permintaan workload Anda.
Ubah profil penskalaan otomatis. Jika Anda sudah menggunakan autoscaler cluster, coba ubah profil penskalaan otomatis ke
balanced, bukanoptimize-utilization. Profiloptimize-utilizationdapat meningkatkan kemungkinan terjadinya errorOutOfPodskarena mencoba menempatkan Pod pada node yang paling banyak digunakan.
Error: Pod tidak dapat dijadwalkan
Status PodUnschedulable menunjukkan bahwa Pod Anda tidak dapat dijadwalkan
karena resource tidak memadai atau adanya error konfigurasi.
Jika Anda telah mengonfigurasi metrik bidang kontrol, Anda dapat menemukan informasi selengkapnya tentang error ini di metrik scheduler dan metrik server API.
Menggunakan playbook interaktif Pod yang tidak dapat dijadwalkan
Anda dapat memecahkan masalah error PodUnschedulable menggunakan playbook interaktif
di konsol Google Cloud :
Buka playbook interaktif Pod yang tidak dapat dijadwalkan:
Di menu drop-down Cluster, pilih cluster yang ingin Anda pecahkan masalahnya. Jika Anda tidak dapat menemukan cluster, masukkan nama cluster di kolom Filter.
Di menu drop-down Namespace, pilih namespace yang ingin Anda pecahkan masalahnya. Jika Anda tidak dapat menemukan namespace, masukkan namespace di kolom Filter.
Untuk membantu Anda mengidentifikasi penyebabnya, pelajari setiap bagian dalam playbook:
- Menyelidiki CPU dan Memori
- Menyelidiki Pod Maksimum per Node
- Menyelidiki Perilaku Autoscaler
- Menyelidiki Mode Kegagalan Lainnya
- Menghubungkan Peristiwa Perubahan
Opsional: Untuk mendapatkan notifikasi tentang error
PodUnschedulabledi masa mendatang, di bagian Tips Mitigasi di Masa Mendatang, pilih Buat Pemberitahuan .
Error: Resource tidak cukup
Anda mungkin mengalami error yang menunjukkan kurangnya CPU, memori, atau resource lainnya. Misalnya: No nodes are available that match all of the predicates:
Insufficient cpu (2) yang menunjukkan bahwa di dua node, tidak ada CPU yang cukup untuk memenuhi permintaan Pod.
Jika permintaan resource Pod Anda melebihi permintaan yang tersedia pada satu node dari setiap node pool yang memenuhi syarat, GKE tidak akan menjadwalkan Pod tersebut dan juga tidak akan memicu peningkatan skala untuk menambahkan node baru. Agar GKE dapat menjadwalkan Pod, Anda harus meminta lebih sedikit resource untuk Pod, atau membuat node pool baru dengan resource yang memadai.
Anda juga dapat mengaktifkan penyediaan otomatis node sehingga GKE dapat otomatis membuat node pool dengan node tempat Pod yang tidak terjadwal dapat dijalankan.
Permintaan CPU default adalah 100 m atau 10% dari satu CPU (atau
satu core).
Jika Anda ingin meminta lebih banyak atau lebih sedikit resource, tentukan nilai dalam spesifikasi Pod di bagian spec: containers: resources: requests.
Error: MatchNodeSelector
MatchNodeSelector menunjukkan bahwa tidak ada node yang cocok dengan pemilih label Pod.
Untuk memastikan hal ini, periksa label yang ditentukan dalam kolom nodeSelector spesifikasi Pod, pada bagian spec: nodeSelector.
Untuk melihat label pada node di cluster Anda, jalankan perintah berikut:
kubectl get nodes --show-labels
Untuk melampirkan label ke node, jalankan perintah berikut:
kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE
Ganti kode berikut:
NODE_NAME: node yang ingin Anda tambahi label.LABEL_KEY: kunci label.LABEL_VALUE: nilai label.
Untuk mengetahui informasi selengkapnya, lihat Menetapkan Pod ke Node dalam dokumentasi Kubernetes.
Error: PodToleratesNodeTaints
PodToleratesNodeTaints menunjukkan bahwa Pod tidak dapat dijadwalkan ke node mana pun karena Pod tidak memiliki toleransi yang sesuai dengan taint node yang ada.
Untuk memastikan bahwa hal ini memang terjadi, jalankan perintah berikut:
kubectl describe nodes NODE_NAME
Di output, periksa kolom Taints, yang mencantumkan key-value pair dan
dampak pada penjadwalan.
Jika dampak yang tercantum adalah NoSchedule, tidak ada Pod yang dapat dijadwalkan pada node tersebut
kecuali jika memiliki tolerasi yang cocok.
Salah satu cara untuk mengatasi masalah ini adalah dengan menghapus taint. Misalnya, untuk menghapus taint NoSchedule, jalankan perintah berikut:
kubectl taint nodes NODE_NAME key:NoSchedule-
Error: PodFitsHostPorts
Error PodFitsHostPorts berarti bahwa node mencoba menggunakan port yang sudah digunakan.
Untuk mengatasi masalah ini, sebaiknya ikuti
praktik terbaik Kubernetes
dan gunakan NodePort, bukan hostPort.
Jika Anda harus menggunakan hostPort, periksa manifes Pod dan pastikan semua Pod di node yang sama memiliki nilai unik yang ditentukan untuk hostPort.
Error: Tidak memiliki ketersediaan minimum
Jika node memiliki resource yang memadai, tetapi Anda masih melihat pesan Does not have minimum availability, periksa status Pod. Jika statusnya adalah SchedulingDisabled atau
Cordoned, node tidak dapat menjadwalkan Pod baru. Anda dapat memeriksa status node menggunakan konsol Google Cloud atau alat command line kubectl.
Konsol
Lakukan langkah-langkah berikut:
Buka halaman Google Kubernetes Engine di konsol Google Cloud .
Pilih cluster yang ingin Anda selidiki. Tab Node menampilkan Node dan statusnya.
Untuk mengaktifkan penjadwalan di node, lakukan langkah-langkah berikut:
Dari daftar, klik node yang ingin Anda selidiki.
Dari bagian Node Details, klik Uncordon.
kubectl
Untuk mendapatkan status node, jalankan perintah berikut:
kubectl get nodes
Untuk mengaktifkan penjadwalan di node, jalankan:
kubectl uncordon NODE_NAME
Error: Batas Pod maksimum per node tercapai
Jika batas Pod Maksimum per node
dicapai oleh semua node dalam cluster, Pod akan terjebak dalam
status Tidak dapat dijadwalkan. Di bagian tab Peristiwa Pod, Anda akan melihat pesan
yang menyertakan frasa Too many pods.
Untuk mengatasi error ini, selesaikan langkah-langkah berikut:
Periksa konfigurasi
Maximum pods per nodedari tab Node pada detail cluster GKE di konsol Google Cloud .Mendapatkan daftar node:
kubectl get nodesUntuk setiap node, pastikan jumlah Pod yang berjalan di node:
kubectl get pods -o wide | grep NODE_NAME | wc -lJika batas tercapai, tambahkan node pool baru atau tambahkan node lain ke node pool yang ada.
Masalah: Ukuran maksimum node pool tercapai dengan autoscaler cluster diaktifkan
Jika node pool telah mencapai ukuran maksimum sesuai dengan konfigurasi autoscaler cluster-nya, GKE tidak akan memicu peningkatan skala untuk Pod yang seharusnya dijadwalkan dengan node pool ini. Jika Anda menginginkan agar Pod dijadwalkan dengan node pool ini, ubah konfigurasi autoscaler cluster-nya.
Masalah: Ukuran maksimum node pool tercapai dengan autoscaler cluster dinonaktifkan
Jika node pool telah mencapai jumlah maksimum node, dan autoscaler cluster dinonaktifkan, GKE tidak dapat menjadwalkan Pod dengan node pool. Tingkatkan ukuran node pool atau aktifkan autoscaler cluster agar GKE dapat otomatis mengubah ukuran cluster Anda.
Error: PersistentVolumeClaims yang tidak terikat
Unbound PersistentVolumeClaims menunjukkan bahwa Pod mereferensikan
PersistentVolumeClaim yang telah dilepas. Error ini dapat terjadi jika
PersistentVolume Anda gagal disediakan. Anda dapat memastikan bahwa penyediaan gagal dengan mendapatkan peristiwa untuk PersistentVolumeClaim dan memeriksanya untuk melihat apakah memang terjadi kegagalan.
Untuk mendapatkan peristiwa, jalankan perintah berikut:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Ganti kode berikut:
STATEFULSET_NAME: nama objek StatefulSet.PVC_NAME: nama objek PersistentVolumeClaim.
Hal ini juga dapat terjadi jika ada error konfigurasi selama pra-penyediaan PersistentVolume manual Anda dan dalam proses bindingnya ke PersistentVolumeClaim.
Untuk mengatasi error ini, coba lakukan pra-penyediaan volume lagi.
Error: Kuota tidak mencukupi
Pastikan project Anda memiliki kuota Compute Engine yang memadai untuk GKE guna meningkatkan skala cluster Anda. Jika GKE mencoba menambahkan node ke cluster Anda untuk menjadwalkan Pod, dan peningkatan skala melebihi kuota project yang tersedia, Anda akan menerima pesan error scale.up.error.quota.exceeded.
Untuk mempelajari lebih lanjut, lihat Error ScaleUp.
Masalah: API yang tidak digunakan lagi
Pastikan Anda tidak menggunakan API yang sudah tidak digunakan lagi dan dihapus dengan versi minor cluster Anda. Untuk mempelajari lebih lanjut, lihat Penghentian penggunaan fitur dan API.
Error: Tidak memiliki port kosong untuk port Pod yang diminta
Jika Anda melihat error yang mirip dengan berikut, kemungkinan Anda memiliki beberapa Pod
di node yang sama dengan nilai yang sama yang ditentukan di kolom hostPort:
0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.
Mengikat Pod ke hostPort membatasi tempat GKE dapat menjadwalkan
Pod karena setiap kombinasi hostIP, hostPort, dan protocol harus
unik.
Untuk mengatasi masalah ini, sebaiknya ikuti
praktik terbaik Kubernetes
dan gunakan NodePort, bukan hostPort.
Jika Anda harus menggunakan hostPort, periksa manifes Pod dan pastikan semua Pod di node yang sama memiliki nilai unik yang ditentukan untuk hostPort.
Langkah berikutnya
Jika Anda tidak dapat menemukan solusi untuk masalah Anda dalam dokumentasi, lihat Mendapatkan dukungan untuk mendapatkan bantuan lebih lanjut, termasuk saran tentang topik berikut:
- Membuka kasus dukungan dengan menghubungi Layanan Pelanggan Cloud.
- Mendapatkan dukungan dari komunitas dengan mengajukan pertanyaan di StackOverflow dan menggunakan tag
google-kubernetes-engineuntuk menelusuri masalah serupa. Anda juga dapat bergabung ke#kubernetes-enginechannel Slack untuk mendapatkan dukungan komunitas lainnya. - Membuka bug atau permintaan fitur menggunakan issue tracker publik.