Memecahkan masalah workload yang di-deploy

Halaman ini menunjukkan cara mengatasi error pada workload yang di-deploy di Google Kubernetes Engine (GKE).

Untuk saran yang lebih umum tentang pemecahan masalah aplikasi, lihat Memecahkan Masalah dalam dokumentasi Kubernetes.

Semua error: Memeriksa 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:

  1. Di Google Cloud konsol, buka halaman Workload.

    Buka Workloads

  2. Pilih workload yang ingin Anda selidiki. Tab Ringkasan menampilkan status workload.

  3. Dari bagian Pod yang Dikelola, 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.

Di output, kolom Events menampilkan informasi selengkapnya tentang error.

Jika Anda ingin mengetahui informasi selengkapnya, lihat log container:

kubectl logs POD_NAME

Log ini dapat membantu Anda mengidentifikasi apakah perintah atau kode dalam container menyebabkan Pod mengalami error.

Setelah mengidentifikasi error, gunakan bagian berikut untuk mencoba menyelesaikan masalah.

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 image registry.

Untuk panduan tentang cara memecahkan masalah status ini, lihat Memecahkan masalah penarikan image.

Error: OutOfPods

Status OutOfPods menunjukkan bahwa node tidak dapat menjalankan Pod karena node telah mencapai kapasitas Pod maksimum.

Gejala

Anda mungkin melihat pesan di peristiwa Pod yang mirip dengan berikut ini:

Node didn't have enough resource: pods, requested: 1, used: 32, capacity: 32

Penyebab

Error ini terjadi jika ada permintaan untuk menjadwalkan Pod di node yang sudah mencapai kapasitas. Situasi ini biasanya terjadi selama startup node, misalnya saat komponen kube-scheduler menetapkan Pod ke node baru sebelum agen kubelet melaporkan keberadaan Pod statis seperti komponen kube-proxy, yang memerlukan kapasitas Pod sendiri.

Resolusi

Untuk mengatasi masalah ini, coba salah satu solusi berikut:

  • Meningkatkan jumlah maksimum Pod per node. Jika node Anda secara konsisten mencapai batas Pod, tingkatkan setelan --max-pods-per-node untuk node pool Anda. Meningkatkan jumlah Pod mungkin memerlukan node yang lebih besar untuk menangani peningkatan permintaan resource.

  • Mengaktifkan autoscaler cluster dan node auto-provisioning. Jika Anda sering kehabisan kapasitas Pod, mengaktifkan autoscaler cluster dan node auto-provisioning dapat membantu memastikan cluster Anda memiliki node yang cukup untuk memenuhi permintaan workload Anda.

  • Mengubah profil penskalaan otomatis. Jika Anda sudah menggunakan autoscaler cluster , coba ubah profil penskalaan otomatis ke profil balanced, bukan profil optimize-utilization. Profil optimize-utilization dapat meningkatkan kemungkinan error OutOfPods karena mencoba menempatkan Pod di 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 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 PodUnschedulable error menggunakan playbook interaktif di Google Cloud konsol:

  1. Buka playbook interaktif Pod yang tidak dapat dijadwalkan:

    Buka Playbook

  2. Di daftar drop-down Cluster, pilih cluster yang ingin Anda pecahkan masalahnya. Jika tidak dapat menemukan cluster, masukkan nama cluster di kolom Filter.

  3. Di daftar drop-down Namespace, pilih namespace yang ingin Anda pecahkan masalahnya. Jika tidak dapat menemukan namespace, masukkan namespace di kolom Filter.

  4. Untuk membantu Anda mengidentifikasi penyebabnya, kerjakan setiap bagian di playbook:

    1. Menyelidiki CPU dan Memori
    2. Menyelidiki Pod Maksimum per Node
    3. Menyelidiki Perilaku Autoscaler
    4. Menyelidiki Mode Kegagalan Lainnya
    5. Mengorelasikan Peristiwa Perubahan
  5. Opsional: Untuk mendapatkan notifikasi tentang error PodUnschedulable di masa mendatang, di bagian Tips Mitigasi di Masa Mendatang, pilih Buat Pemberitahuan.

Error: Resource tidak cukup

Status PodUnschedulable dapat terjadi jika tidak ada cukup CPU, memori, atau resource lain untuk memenuhi permintaan Pod.

Gejala

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). Pesan ini menunjukkan bahwa, di dua node, tidak ada CPU yang cukup untuk memenuhi permintaan Pod.

Penyebab

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.

Cluster Anda menjalankan container sistem di namespace kube-system. Container tersebut juga menggunakan resource cluster.

Resolusi

Coba solusi berikut:

  • Sesuaikan permintaan resource Pod dengan menentukan nilai yang lebih rendah di kolom spec: containers: resources: requests. Permintaan CPU default adalah 100m atau 10% CPU (atau satu core).

  • Buat node pool baru dengan node yang memiliki resource yang cukup untuk memenuhi permintaan Pod.

  • Aktifkan node auto-provisioning sehingga GKE dapat otomatis membuat node pool dengan node tempat Pod yang tidak terjadwal dapat dijalankan.

Error: MatchNodeSelector

Error MatchNodeSelector menunjukkan bahwa tidak ada node yang cocok dengan pemilih label Pod.

Gejala

Status atau peristiwa Pod menampilkan error MatchNodeSelector.

Penyebab

Label yang ditentukan di kolom nodeSelector manifes Pod tidak ada di node mana pun dalam cluster.

Resolusi

Untuk mengatasi error ini, pastikan label yang ditentukan di kolom nodeSelector Pod cocok dengan label di setidaknya satu node di cluster Anda:

  1. Identifikasi persyaratan label yang dicari Pod dengan memeriksa kolom spec: nodeSelector.

  2. Untuk melihat apakah ada label yang cocok dengan persyaratan Pod, lihat label sebenarnya yang ditetapkan ke node di cluster Anda:

    kubectl get nodes --show-labels
    
  3. Jika node dimaksudkan untuk menjalankan Pod ini, lampirkan label yang diperlukan:

    kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE
    

    Ganti kode berikut:

    • NODE_NAME: node yang ingin Anda tambahkan label.
    • LABEL_KEY: kunci label.
    • LABEL_VALUE: nilai label.

Untuk mengetahui informasi selengkapnya, lihat Menetapkan Pod ke Node dalam dokumentasi Kubernetes.

Error: PodToleratesNodeTaints

Error PodToleratesNodeTaints menunjukkan bahwa Pod tidak dapat dijadwalkan ke node mana pun karena Pod tidak memiliki toleransi yang sesuai dengan taint node yang ada.

Gejala

Status atau peristiwa Pod menampilkan error PodToleratesNodeTaints.

Penyebab

Pod tidak dapat dijadwalkan ke node mana pun karena Pod tidak memiliki toleransi yang sesuai dengan taint node yang ada.

Resolusi

  1. Periksa taint pada node:

    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 di jadwalkan pada node tersebut kecuali jika memiliki toleransi yang cocok .

  2. Hapus taint dari node. Misalnya, untuk menghapus taint NoSchedule, jalankan perintah berikut:

    kubectl taint nodes NODE_NAME key:NoSchedule-
    

Error: PodFitsHostPorts

Error PodFitsHostPorts berarti node mencoba menggunakan port yang sudah digunakan.

Gejala

Status Pod menampilkan error PodFitsHostPorts.

Penyebab

Pod meminta port host yang sudah digunakan oleh Pod atau proses lain di node target.

Resolusi

Untuk mengatasi masalah ini, sebaiknya ikuti praktik terbaik Kubernetes dan gunakan Layanan NodePort, bukan setelan hostPort.

Jika Anda harus menggunakan port host, periksa manifes Pod dan pastikan semua Pod di node yang sama memiliki nilai unik yang ditentukan untuk setelan hostPort.

Error: Tidak memiliki ketersediaan minimum

Error ini dapat terjadi jika node memiliki resource yang memadai tetapi tidak tersedia untuk penjadwalan.

Gejala

  • Anda melihat error Does not have minimum availability.

  • Status node menampilkan status SchedulingDisabled atau status Cordoned.

Penyebab

Status node yang ditandai sebagai tidak dapat dijadwalkan mencegah Pod baru dijadwalkan di dalamnya.

Resolusi

Agar node tersedia untuk menjadwalkan Pod lagi, batalkan penandaannya sebagai tidak dapat dijadwalkan:

Konsol

Lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di Google Cloud konsol.

    Buka Google Kubernetes Engine

  2. Pilih cluster yang ingin Anda selidiki. Tab Node menampilkan Node dan statusnya.

Untuk mengaktifkan penjadwalan di node, lakukan langkah-langkah berikut:

  1. Dari daftar, klik node yang ingin Anda selidiki.

  2. Dari bagian Detail Node, klik Batalkan Penandaan sebagai Tidak Dapat Dijadwalkan.

kubectl

Untuk mendapatkan status node Anda, jalankan perintah berikut:

kubectl get nodes

Untuk mengaktifkan penjadwalan di node, jalankan:

kubectl uncordon NODE_NAME

Error: Batas Pod Maksimum per node tercapai

Error Too many pods menunjukkan bahwa Pod tidak dapat dijadwalkan karena node target telah mencapai kapasitas Pod maksimum yang dikonfigurasi.

Gejala

  • Pod macet dalam status Unschedulable.
  • Anda melihat pesan yang menyertakan frasa Too many pods.

Penyebab

Batas Pod Maksimum per node tercapai oleh semua node dalam cluster.

Resolusi

Untuk mengatasi error ini, selesaikan langkah-langkah berikut:

  1. Periksa konfigurasi Maximum pods per node dari tab Node pada detail cluster GKE di Google Cloud konsol.

  2. Dapatkan daftar node:

    kubectl get nodes
    
  3. Untuk setiap node, verifikasi jumlah Pod yang berjalan di node:

    kubectl get pods -o wide | grep NODE_NAME | wc -l
    
  4. Jika 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

Masalah ini terjadi saat node pool telah mencapai ukuran maksimum yang dikonfigurasi di autoscaler cluster.

Gejala

GKE tidak memicu peningkatan skala untuk Pod yang seharusnya dijadwalkan dengan node pool ini. Sebagai gantinya, Pod tetap dalam status Pending.

Penyebab

Node pool telah mencapai ukuran maksimum sesuai dengan konfigurasi autoscaler cluster-nya.

Resolusi

Tingkatkan ukuran maksimum node pool dengan mengubah autoscaler cluster konfigurasi.

Masalah: Ukuran maksimum node pool tercapai dengan autoscaler cluster dinonaktifkan

Masalah ini terjadi saat node pool telah mencapai ukuran maksimum dan autoscaler cluster dinonaktifkan.

Gejala

GKE tidak dapat menjadwalkan Pod dengan node pool.

Penyebab

Node pool telah mencapai jumlah maksimum node, dan autoscaler cluster dinonaktifkan.

Resolusi

Untuk mengatasi masalah ini, coba salah satu solusi berikut:

Error: PersistentVolumeClaims Dilepas

Error Unbound PersistentVolumeClaims menunjukkan bahwa Pod mereferensikan PersistentVolumeClaim yang telah dilepas.

Gejala

Status atau peristiwa Pod menampilkan error Unbound PersistentVolumeClaims.

Penyebab

Error ini dapat terjadi karena salah satu alasan berikut:

  • PersistentVolume Anda gagal disediakan.
  • Terjadi error konfigurasi selama pra-penyediaan PersistentVolume manual dan dalam proses bindingnya ke PersistentVolumeClaim.

Resolusi

  1. Verifikasi apakah penyediaan gagal dengan mendapatkan peristiwa untuk PersistentVolumeClaim Anda:

    kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
    

    Ganti kode berikut:

    • STATEFULSET_NAME: nama objek StatefulSet.
    • PVC_NAME: nama objek PersistentVolumeClaim.
  2. Coba lakukan pra-penyediaan volume lagi.

Error: Kuota tidak mencukupi

Jika GKE mencoba meningkatkan skala cluster Anda untuk menjadwalkan Pod, tetapi mengalami batasan kuota, peningkatan skala akan gagal.

Gejala

Anda akan menerima pesan error scale.up.error.quota.exceeded di peristiwa Pod.

Penyebab

Peningkatan skala cluster akan melebihi kuota project yang tersedia.

Resolusi

Pastikan project Anda memiliki kuota Compute Engine yang memadai untuk GKE guna meningkatkan skala cluster Anda. Untuk mengetahui informasi selengkapnya, lihat error ScaleUp.

Masalah: API yang tidak digunakan lagi

Penggunaan API yang tidak lagi didukung dalam manifes Anda dapat mencegah deployment workload.

Gejala

Workload gagal di-deploy atau dijalankan karena penggunaan API yang tidak digunakan lagi.

Penyebab

Manifes Anda menggunakan API yang tidak digunakan lagi dan dihapus dalam versi minor cluster Anda.

Resolusi

Pastikan Anda tidak menggunakan API yang tidak digunakan lagi. Perbarui manifes Anda untuk menggunakan API yang didukung. Untuk mengetahui informasi selengkapnya, lihat Penghentian penggunaan Fitur dan API deprecations.

Error: Tidak memiliki port gratis untuk port Pod yang diminta

Mengikat Pod ke port host membatasi tempat GKE dapat menjadwalkan Pod karena setiap kombinasi alamat hostIP, setelan hostPort, dan nilai protocol harus unik.

Gejala

Anda akan melihat error yang mirip dengan berikut ini:

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.

Penyebab

Beberapa Pod di node yang sama menentukan nilai yang sama yang ditentukan di kolom hostPort.

Resolusi

Untuk mengatasi masalah ini, coba salah satu solusi berikut:

  • Ikuti praktik terbaik Kubernetes dan gunakan Layanan NodePort, bukan port host.
  • Jika Anda harus menggunakan port host, periksa manifes Pod dan pastikan semua Pod di node yang sama memiliki nilai unik yang ditentukan untuk kolom hostPort.

Masalah: Kegagalan aplikasi dan probe di Pod

Masalah ini terjadi saat Anda menjalankan aplikasi yang menggunakan HTTPS untuk berkomunikasi dengan server.

Gejala

Kegagalan dalam aplikasi ini mirip dengan hal berikut:

  • Pod tidak dimulai, dan container mengalami error dengan kode keluar 137.
  • Probe liveness atau readiness gagal dengan pesan error yang mirip dengan berikut ini:

    probeResult="failure" output="Get "https://example.com/healthy": EOF"
    
  • Pod berjalan seperti yang diharapkan, tetapi log aplikasi menunjukkan kegagalan koneksi.

Penyebab

Kubernetes versi 1.30 dan yang lebih baru menggunakan versi Golang yang menonaktifkan cipher suite TLS berikut:

  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA

Resolusi

Gunakan cipher suite yang didukung dari TLS 1.2 dan yang lebih baru.

Langkah berikutnya