Memecahkan masalah health check Ingress


Halaman ini menunjukkan cara menyelesaikan masalah terkait pemeriksaan status Ingress di Google Kubernetes Engine (GKE).

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.

Memahami cara kerja health check Ingress

Sebelum melanjutkan ke langkah pemecahan masalah, sebaiknya pahami cara kerja health check di GKE dan pertimbangan yang perlu diingat untuk memastikan health check berhasil.

Saat Anda mengekspos satu atau beberapa Layanan melalui Ingress menggunakan pengontrol Ingress default, GKE akan membuat Load Balancer Aplikasi klasik atau Load Balancer Aplikasi internal. Kedua load balancer ini mendukung beberapa layanan backend di satu peta URL. Setiap layanan backend terkait dengan Layanan Kubernetes, dan setiap layanan backend harus merujuk ke health check Google Cloud. Health check ini berbeda dengan pemeriksaan keaktifan atau kesiapan Kubernetes karena health check diterapkan di luar cluster.

Health check load balancer ditentukan per layanan backend. Meskipun Anda dapat menggunakan health check yang sama untuk semua layanan backend load balancer, referensi health check tidak ditentukan untuk seluruh load balancer (di objek Ingress itu sendiri).

GKE membuat health check berdasarkan salah satu metode berikut:

  • CRD BackendConfig: Definisi resource kustom (CRD) yang memberi Anda kontrol yang tepat atas cara Layanan berinteraksi dengan load balancer. CRD BackendConfig memungkinkan Anda menentukan setelan kustom untuk health check yang terkait dengan layanan backend yang sesuai. Setelan kustom ini memberikan fleksibilitas dan kontrol yang lebih besar atas health check untuk Load Balancer Aplikasi klasik dan Load Balancer Aplikasi internal yang dibuat oleh Ingress.
  • Pemeriksaan kesiapan: Pemeriksaan diagnostik yang menentukan apakah penampung dalam Pod siap menyalurkan traffic. Pengontrol GKE Ingress membuat health check untuk layanan backend Layanan berdasarkan pemeriksaan kesiapan yang digunakan oleh Pod penayangan Layanan tersebut. Anda dapat memperoleh parameter health check seperti jalur, port, dan protokol dari definisi pemeriksaan kesiapan.
  • Nilai default: Parameter yang digunakan saat Anda tidak mengonfigurasi CRD BackendConfig atau menentukan atribut untuk pemeriksaan kesiapan.
Praktik terbaik:

Gunakan CRD BackendConfig untuk memiliki kontrol paling besar atas setelan health check load balancer.

GKE menggunakan prosedur berikut untuk membuat health check bagi setiap layanan backend yang terkait dengan Layanan Kubernetes:

  • Jika Layanan mereferensikan CRD BackendConfig dengan informasi healthCheck, GKE akan menggunakannya untuk membuat health check. Pengontrol GKE Enterprise Ingress dan pengontrol GKE Ingress mendukung pembuatan health check dengan cara ini.

  • Jika Layanan tidak merujuk CRD BackendConfig:

    • GKE dapat menyimpulkan beberapa atau semua parameter untuk health check apakah Pod Penayangan menggunakan template Pod dengan container yang pemeriksaan kesiapannya memiliki atribut yang dapat ditafsirkan sebagai parameter health check. Lihat Parameter dari pemeriksaan kesiapan untuk detail implementasi serta Parameter default dan yang ditentukan untuk daftar atribut yang dapat digunakan untuk membuat parameter health check. Hanya pengontrol GKE Ingress yang mendukung inferensi parameter dari pemeriksaan kesiapan.

    • Jika template Pod untuk Pod penayangan Layanan tidak memiliki container dengan pemeriksaan kesiapan yang atributnya dapat ditafsirkan sebagai parameter health check, nilai default akan digunakan untuk membuat health check. Pengontrol Ingress GKE Enterprise dan pengontrol GKE Ingress hanya dapat membuat health check menggunakan nilai default.

Pertimbangan

Bagian ini menguraikan beberapa pertimbangan yang perlu diingat saat Anda mengonfigurasi CRD BackendConfig atau menggunakan probe kesiapan.

BackendConfig CRD

Saat Anda mengonfigurasi CRD BackendConfig, perhatikan pertimbangan berikut:

  • Jika Anda menggunakan load balancing native container, pastikan port health check dalam manifes BackendConfig cocok dengan containerPort Pod penayangan.
  • Untuk backend grup instance, pastikan port health check dalam manifes BackendConfig cocok dengan nodePort yang diekspos oleh Layanan.
  • Ingress tidak mendukung gRPC untuk konfigurasi health check kustom. BackendConfig hanya mendukung pembuatan health check menggunakan protokol HTTP, HTTPS, atau HTTP2. Untuk contoh cara menggunakan protokol dalam CRD BackendConfig, lihat gke-networking-recipes.

Untuk informasi selengkapnya, lihat Kapan harus menggunakan CRD BackendConfig.

Pemeriksaan kesiapan

Saat Anda menggunakan GKE Ingress dengan load balancing HTTP atau HTTPS, GKE akan mengirimkan probe health check untuk menentukan apakah aplikasi Anda berjalan dengan benar. Pemeriksaan health check ini dikirim ke port tertentu di Pod yang Anda tentukan di bagian spec.containers[].readinessProbe.httpGet.port pada konfigurasi YAML Pod, selama kondisi berikut terpenuhi:

  • Nomor port pemeriksaan kesiapan yang ditentukan dalam spec.containers[].readinessProbe.httpGet.port harus cocok dengan port sebenarnya yang diproses aplikasi Anda dalam penampung, yang ditentukan di kolom containers[].spec.ports.containerPort konfigurasi Pod Anda.
  • containerPort Pod penayangan harus cocok dengan targetPort Layanan. Tindakan ini memastikan traffic diarahkan dari Layanan ke port yang benar di Pod Anda.
  • Spesifikasi port backend layanan Ingress harus mereferensikan port yang valid dari bagian spec.ports[] konfigurasi Layanan. Hal ini dapat dilakukan dengan salah satu dari dua cara berikut:
    • spec.rules[].http.paths[].backend.service.port.name di Ingress cocok dengan spec.ports[].name yang ditentukan di Layanan terkait.
    • spec.rules[].http.paths[].backend.service.port.number di Ingress cocok dengan spec.ports[].port yang ditentukan di Layanan terkait.

Memecahkan masalah umum health check

Gunakan diagram alir pemecahan masalah berikut untuk membantu mengidentifikasi masalah pemeriksaan kondisi:

Memecahkan masalah health check Ingress.
Gambar: Memecahkan masalah pemeriksaan kondisi

Dalam diagram alir ini, panduan pemecahan masalah berikut membantu menentukan letak masalahnya:

  1. Menyelidiki kesehatan Pod: Jika health check gagal, periksa status Pod penayangan Layanan Anda. Jika Pod tidak berjalan dan berfungsi dengan baik:

    • Periksa log Pod untuk menemukan error atau masalah yang mencegahnya berjalan.
    • Periksa status pemeriksaan kesiapan dan keaktifan.
  2. Logging health check: Pastikan Anda telah mengaktifkan logging health check.

  3. Verifikasi konfigurasi firewall: Pastikan aturan firewall Anda mengizinkan pemeriksaan health check untuk menjangkau Pod Anda. Jika tidak:

    • Periksa aturan firewall Anda untuk mengonfirmasi bahwa aturan tersebut mengizinkan traffic masuk dari rentang alamat IP pemeriksaan health check.
    • Sesuaikan aturan firewall sesuai kebutuhan untuk mengakomodasi rentang alamat IP ini.
  4. Analisis packet capture: Jika firewall dikonfigurasi dengan benar, lakukan packet capture untuk melihat apakah aplikasi Anda merespons health check. Jika rekaman aktivitas paket menunjukkan respons yang berhasil, hubungi dukungan Google Cloud untuk mendapatkan bantuan lebih lanjut.

  5. Memecahkan masalah aplikasi: Jika pengambilan paket tidak menampilkan respons yang berhasil, selidiki mengapa aplikasi Anda tidak merespons dengan benar terhadap permintaan health check. Pastikan health check menargetkan jalur dan port yang benar di Pod, lalu periksa log, file konfigurasi, dan dependensi aplikasi. Jika Anda tidak dapat menemukan error, hubungi dukungan Google Cloud.

Aplikasi tidak responsif terhadap health check

Aplikasi tidak merespons dengan kode status yang diharapkan (200 OK untuk HTTP atau SYN, ACK untuk TCP) selama health check pada jalur dan port yang dikonfigurasi.

Jika aplikasi Anda tidak merespons health check dengan benar, hal ini mungkin karena salah satu alasan berikut:

  • Network Endpoint Groups(NEG):
    • Aplikasi tidak berjalan dengan benar dalam Pod.
    • Aplikasi tidak memproses port atau jalur yang dikonfigurasi.
    • Ada masalah konektivitas jaringan yang mencegah health check menjangkau Pod.
  • Instance Group:
    • Node dalam grup instance tidak responsif.
    • Aplikasi tidak berjalan dengan benar di node.
    • Permintaan health check tidak menjangkau node.

Jika health check gagal, berdasarkan penyiapan Anda, pecahkan masalahnya sebagai berikut:

Untuk NEG:

  1. Akses Pod menggunakan kubectl exec:

    kubectl exec -it pod-name -- command
    

    Flag -it menyediakan sesi terminal interaktif (i untuk interaktif, t untuk TTY).

    Ganti kode berikut:

    • pod-name: nama Pod Anda.
    • command: perintah yang ingin Anda jalankan di dalam Pod. Perintah yang paling umum adalah bash atau sh untuk mendapatkan shell interaktif.
  2. Jalankan perintah curl untuk menguji konektivitas dan responsivitas aplikasi:

    • curl localhost:<Port>/<Path>
    • curl -v http://<POD_IP>/[Path configured in HC]
    • curl http://localhost/[Path configured in HC]

Untuk Instance Groups:

  1. Pastikan node berfungsi dan merespons probe health check default.
  2. Jika node sehat, tetapi Pod aplikasi tidak merespons, selidiki aplikasi lebih lanjut.
  3. Jika permintaan tidak menjangkau Pod, masalahnya mungkin terkait jaringan GKE. Hubungi dukungan Google Cloud untuk mendapatkan bantuan.

Error saat mengedit pemeriksaan kesiapan di Pod

Saat Anda mencoba mengedit pemeriksaan kesiapan di Pod untuk mengubah parameter health check, tindakan ini akan menghasilkan error yang mirip dengan berikut ini:

Pod "pod-name" is invalid: spec: Forbidden: pod updates may not change fields

Jika Anda mengubah pemeriksaan kesiapan Pod yang terkait dengan Layanan yang sudah ditautkan ke Ingress (dan load balancer terkait), GKE tidak otomatis memperbarui konfigurasi health check di load balancer. Hal ini menyebabkan ketidakcocokan antara pemeriksaan kesiapan Pod dan health check load balancer, sehingga menyebabkan health check gagal.

Untuk mengatasinya, deploy ulang Pod dan resource Ingress. Tindakan ini memaksa GKE membuat ulang load balancer dan health check-nya, serta menyertakan setelan pemeriksaan kesiapan yang baru.

Deployment dan load balancer gagal dimulai

Jika deployment Anda gagal dimulai dan layanan backend di balik load balancer pengontrol Ingress Anda ditandai sebagai tidak responsif, kegagalan pemeriksaan kesiapan mungkin menjadi alasannya.

Anda mungkin melihat pesan error berikut yang menyebutkan kegagalan pemeriksaan kesiapan:

Readiness probe failed: connection refused

Aplikasi dalam Pod tidak merespons dengan benar pada probe kesiapan yang dikonfigurasi dalam konfigurasi YAML Pod. Hal ini dapat disebabkan oleh berbagai alasan seperti aplikasi tidak dimulai dengan benar, memproses port yang salah, atau mengalami error selama inisialisasi.

Untuk mengatasinya, selidiki dan perbaiki perbedaan apa pun dalam konfigurasi atau perilaku aplikasi Anda dengan melakukan hal berikut:

  • Pastikan aplikasi dikonfigurasi dengan benar dan merespons di jalur dan port yang ditentukan dalam parameter pemeriksaan kesiapan.
  • Tinjau log aplikasi dan pecahkan masalah atau error saat memulai.
  • Pastikan containerPort dalam konfigurasi Pod cocok dengan targetPort di Layanan dan port backend yang ditentukan di Ingress.

Aturan firewall Ingress otomatis tidak ada

Anda membuat resource Ingress, tetapi traffic tidak menjangkau layanan backend.

Aturan firewall Ingress otomatis, yang biasanya dibuat GKE saat resource Ingress dibuat, tidak ada atau telah tidak sengaja dihapus.

Untuk memulihkan konektivitas ke layanan backend, lakukan langkah-langkah berikut:

  • Verifikasi keberadaan aturan firewall Ingress otomatis di jaringan VPC Anda.
  • Jika aturan tidak ada, Anda dapat membuatnya ulang secara manual atau menghapus dan membuat ulang resource Ingress untuk memicu pembuatannya secara otomatis.
  • Pastikan aturan firewall mengizinkan traffic di port dan protokol yang sesuai seperti yang ditentukan dalam resource Ingress Anda.

Protokol yang salah digunakan dalam manifes BackendConfig

Jika mengonfigurasi CRD BackendConfig dengan protokol jenis TCP, Anda akan melihat error berikut:

Error syncing to GCP: error running backend syncing routine:
error ensuring health check: Protocol "TCP" is not valid, must be one of ["HTTP","HTTPS","HTTP2"]'

BackendConfig mendukung pembuatan health check hanya menggunakan protokol HTTP, HTTPS, atau HTTP/2. Untuk informasi selengkapnya, lihat Kriteria keberhasilan untuk HTTP, HTTPS, dan HTTP/2.

Langkah selanjutnya

Untuk menyiapkan health check kustom untuk Ingress di satu cluster, lihat Resep jaringan GKE.