Topik ini mencakup alur diagnostik, metode troubleshooting, pemeriksaan umum, dan solusi untuk masalah NGINX Ingress.
Daftar isi
|
Kategori |
Konten |
|
Proses diagnostik |
|
|
Pendekatan troubleshooting |
|
|
Metode troubleshooting umum |
|
|
Masalah umum dan solusi |
|
Informasi latar belakang
Komunitas Kubernetes memelihara Ingress NGINX Controller resmi. NGINX Ingress Controller di ACK menggunakan versi komunitas dan mendukung semua annotations komunitas.
Deploy NGINX Ingress Controller di kluster untuk mengurai aturan pengalihan Ingress. Controller menerima permintaan, mencocokkannya dengan aturan, dan meneruskannya ke pod Service backend. Hubungan antara Service, NGINX Ingress, dan NGINX Ingress Controller:
-
Service mengabstraksi satu atau lebih layanan backend identik.
-
NGINX Ingress mendefinisikan aturan reverse proxy yang mengarahkan permintaan HTTP/HTTPS ke pod Service berdasarkan host dan path URL.
-
NGINX Ingress Controller mengurai aturan NGINX Ingress. Ketika Ingress berubah, controller memperbarui aturan pengalihannya dan mengarahkan permintaan masuk ke pod Service yang sesuai.
NGINX Ingress Controller mengambil perubahan Ingress dari API Server, menghasilkan file konfigurasi load balancer (seperti nginx.conf), dan memuat ulang load balancer (misalnya, nginx -s reload) untuk menerapkan aturan routing baru.
Alur troubleshooting

-
Ikuti langkah-langkah berikut untuk mengisolasi masalah ke Ingress dan memverifikasi konfigurasi ingress controller Anda.
-
Di Pod controller, pastikan akses berfungsi sebagaimana mestinya. Untuk informasi selengkapnya, lihat Akses secara manual Ingress dan Pod backend di Pod controller.
-
Verifikasi bahwa Anda menggunakan NGINX Ingress Controller dengan benar. Untuk informasi selengkapnya, lihat dokumentasi komunitas NGINX Ingress Controller.
-
-
Gunakan fitur diagnostik Ingress untuk memeriksa konfigurasi Ingress dan komponennya, lalu terapkan perubahan yang direkomendasikan. Untuk petunjuk detail, lihat Gunakan fitur diagnostik Ingress.
-
Ikuti panduan troubleshooting untuk mendiagnosis dan menyelesaikan masalah.
-
Jika langkah-langkah sebelumnya tidak menyelesaikan masalah, lakukan pemeriksaan berikut:
-
Untuk masalah sertifikat TLS:
-
Periksa apakah integrasi WAF atau WAF transparan diaktifkan untuk nama domain tersebut.
-
Jika ya, pastikan tidak ada sertifikat TLS yang dikonfigurasi untuk WAF atau integrasi WAF transparan.
-
Jika tidak, lanjutkan ke langkah berikutnya.
-
-
Periksa apakah SLB menggunakan listener layer-7.
-
Jika iya, pastikan tidak ada sertifikat TLS yang dikonfigurasi untuk listener layer-7 tersebut.
-
Jika tidak, lanjutkan ke langkah berikutnya.
-
-
-
Untuk masalah yang tidak terkait sertifikat TLS, periksa log error di Pod controller. Untuk informasi selengkapnya, lihat Periksa log error di Pod controller.
-
-
Jika masalah tetap berlanjut, lakukan pengambilan paket pada Pod controller dan Pod aplikasi yang sesuai untuk mengidentifikasi akar penyebabnya. Untuk informasi selengkapnya, lihat Pengambilan paket.
Troubleshooting
|
Area masalah |
Gejala |
Solusi |
|
Gagal akses |
Pod di dalam kluster tidak dapat mengakses Ingress. |
Tidak dapat mengakses alamat eksternal LoadBalancer kluster dari dalam kluster |
|
Ingress tidak dapat mengakses dirinya sendiri. |
||
|
Tidak dapat mengakses layanan TCP atau UDP. |
||
|
Masalah akses HTTPS |
Ingress menyajikan sertifikat yang kedaluwarsa atau default. |
|
|
Terjadi error |
Terjadi error "SSL_ERROR_RX_RECORD_TOO_LONG" saat akses HTTPS |
|
|
Masalah saat membuat resource Ingress |
Terjadi error "failed calling webhook...". |
Terjadi error "failed calling webhook" saat Anda membuat resource Ingress |
|
Ingress dibuat tetapi tidak berlaku. |
||
|
Perilaku akses yang tidak diharapkan |
Tidak dapat memperoleh IP sumber klien. |
|
|
Daftar izin IP tidak berlaku atau tidak berfungsi sebagaimana mestinya. |
||
|
Tidak dapat terhubung ke layanan gRPC yang diekspos oleh Ingress. |
Tidak dapat terhubung ke layanan gRPC yang diekspos oleh Ingress |
|
|
Rilis canary tidak berpengaruh. |
||
|
Aturan canary yang salah mengarahkan traffic secara keliru. |
||
|
Terjadi error |
||
|
Terjadi error seperti 502, 503, 413, atau 499. |
||
|
Beberapa resource gagal dimuat di halaman. |
Terjadi error 404 saat mengakses resource dengan anotasi |
Beberapa resource gagal dimuat atau layar kosong muncul setelah menulis ulang ke direktori root |
|
Permintaan resource mengembalikan |
Metode troubleshooting umum
Gunakan diagnostik Ingress
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Diagnostics, klik Ingress diagnostics.
-
Di panel Ingress diagnostics, klik Diagnose, masukkan URL tempat terjadinya masalah, misalnya https://www.example.com. Pilih I have read and agree, lalu klik Start Diagnosis.
Setelah diagnosis selesai, selesaikan masalah berdasarkan hasilnya.
Lihat log pod controller di Log Service
Format log akses untuk controller Ingress didefinisikan dalam ConfigMap. Secara default, ini adalah ConfigMap nginx-configuration di namespace kube-system.
Secara default, controller Ingress ACK menggunakan format log berikut:
$remote_addr - [$remote_addr] - $remote_user [$time_local]
"$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length
$request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length
$upstream_response_time $upstream_status $req_id $host [$proxy_alternative_upstream_name]
Jika Anda mengubah format log, Anda juga harus memperbarui aturan pengumpulan log di Log Service. Jika tidak, log tidak akan ditampilkan dengan benar di konsol Log Service. Berhati-hatilah saat mengubah format log.
Log controller ingress tersedia di Konsol Log Service. Untuk detailnya, lihat Kumpulkan log kontainer dari kluster ACK.
Di tab Raw Logs konsol Log Service, setiap entri log controller ingress ditampilkan sebagai pasangan kunci-nilai. Selain bidang akses HTTP, setiap entri log mencakup bidang metadata Kubernetes seperti _container_name_, _namespace_, dan _pod_name_.
Beberapa nama bidang di Konsol Log Service berbeda dari yang ada di log aktual. Tabel berikut mencantumkan bidang dan deskripsinya.
|
Bidang |
Deskripsi |
|
|
Alamat IP asli klien. |
|
|
Informasi permintaan, termasuk metode permintaan, URL, dan versi HTTP. |
|
|
Total waktu permintaan, diukur dari menerima byte pertama dari klien hingga mengirim byte terakhir respons. Nilai ini dapat dipengaruhi oleh faktor seperti kondisi jaringan klien dan mungkin tidak merepresentasikan kecepatan pemrosesan permintaan yang sebenarnya. |
|
|
Alamat upstream backend. Bidang ini kosong jika permintaan gagal mencapai backend. Jika permintaan dicoba ulang ke beberapa upstream, alamatnya akan tercantum, dipisahkan koma. |
|
|
Kode status HTTP yang dikembalikan oleh upstream backend. Kode status HTTP standar menunjukkan respons berasal dari upstream backend. Jika tidak ada backend yang tersedia, nilainya adalah 502. Jika permintaan dicoba ulang ke beberapa upstream, kode statusnya akan tercantum, dipisahkan koma (,). |
|
|
Waktu respons upstream backend, dalam detik. |
|
|
Nama upstream backend. Format penamaannya adalah |
|
|
Nama upstream alternatif. Bidang ini tidak kosong jika permintaan diarahkan ke upstream alternatif, seperti layanan canary. |
Secara default, Anda juga dapat melihat log akses terbaru langsung di kontainer dengan menjalankan perintah berikut:
kubectl logs <controller-pod-name> -n <namespace> | less
Contoh output:
42.11.**.** - [42.11.**.**]--[25/Nov/2021:11:40:30 +0800]"GET / HTTP/1.1" 200 615 "_" "curl/7.64.1" 76 0.001 [default-nginx-svc-80] 172.16.254.208:80 615 0.000 200 46b79dkahflhakjhdhfkah**** 47.11.**.**[]
42.11.**.** - [42.11.**.**]--[25/Nov/2021:11:40:31 +0800]"GET / HTTP/1.1" 200 615 "_" "curl/7.64.1" 76 0.001 [default-nginx-svc-80] 172.16.254.208:80 615 0.000 200 fadgrerthflhakjhdhfkah**** 47.11.**.**[]
Periksa log error di pod controller
Periksa log di pod controller Ingress untuk mempersempit masalah. Log error di pod controller dibagi menjadi dua jenis:
-
Log error controller: Log ini biasanya dihasilkan ketika terjadi kesalahan dalam konfigurasi Ingress. Jalankan perintah berikut untuk memfilter log error controller:
kubectl logs <controller-pod-name> -n <namespace> | grep -E ^[WE]CatatanSaat controller Ingress dimulai, beberapa entri log peringatan (W) mungkin dihasilkan. Ini normal. Misalnya, peringatan tentang kubeConfig yang hilang atau kelas Ingress yang tidak ditentukan tidak memengaruhi operasi normal controller Ingress dan dapat diabaikan.
-
Log error Nginx: Log ini dihasilkan ketika terjadi kesalahan selama pemrosesan permintaan. Jalankan perintah berikut untuk memfilter log error Nginx:
kubectl logs <controller-pod-name> -n <namespace> | grep error
Akses pod Ingress dan backend
-
Jalankan perintah berikut untuk mendapatkan shell di pod controller:
kubectl exec <controller-pod-name> -n <namespace> -it -- bash -
Alat seperti curl dan OpenSSL telah dipra-instal di pod. Anda dapat menggunakan alat ini untuk menguji konektivitas dan memverifikasi konfigurasi sertifikat.
-
Jalankan perintah berikut untuk menguji akses ke backend melalui Ingress:
# Ganti your.domain.com dengan nama domain yang ingin Anda uji. curl -H "Host: your.domain.com" http://127.0.0.1/ # untuk http curl --resolve your.domain.com:443:127.0.0.1 https://127.0.0.1/ # untuk https -
Jalankan perintah berikut untuk memverifikasi informasi sertifikat:
openssl s_client -servername your.domain.com -connect 127.0.0.1:443 -
Akses pod backend untuk memverifikasi perilakunya.
CatatanController Ingress tidak mengakses pod backend menggunakan IP cluster Service. Sebaliknya, ia mengakses IP pod secara langsung.
-
Jalankan perintah berikut untuk mendapatkan alamat IP pod backend:
kubectl get pod -n <namespace> <pod-name> -o wideContoh output:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-dp-7f5fcc7f-**** 1/1 Running 0 23h 10.71.0.146 cn-beijing.192.168.**.** <none> <none>Output menunjukkan bahwa alamat IP pod backend adalah 10.71.0.146.
-
Jalankan perintah berikut di pod controller untuk mengakses pod backend dan memastikan koneksi berfungsi:
curl http://<your-pod-ip>:<port>/path
-
-
Perintah troubleshooting Nginx Ingress
-
kubectl-plugin
Controller Ingress Kubernetes resmi awalnya berbasis Nginx tetapi beralih ke OpenResty pada versi 0.25.0. Controller memantau perubahan resource Ingress di server API, secara otomatis menghasilkan konfigurasi Nginx yang sesuai, lalu memuat ulang Nginx untuk menerapkan perubahan. Untuk informasi selengkapnya, lihat dokumentasi resmi.
Saat resource Ingress bertambah, semua konfigurasi digabungkan menjadi satu file nginx.conf yang panjang dan sulit di-debug. Sejak versi 0.14.0, bagian upstream dihasilkan secara dinamis menggunakan lua-resty-balancer, semakin meningkatkan kompleksitas debugging. Untuk mengatasi hal ini, komunitas menyumbangkan plugin kubectl, ingress-nginx, untuk menyederhanakan proses debugging konfigurasi ingress-nginx. Untuk informasi selengkapnya, lihat kubectl-plugin.
Jalankan perintah berikut untuk mengambil informasi tentang layanan backend yang saat ini dikenal oleh controller ingress-nginx:
kubectl ingress-nginx backends -n ingress-nginx -
Perintah dbg
Selain plugin kubectl, Anda dapat menggunakan perintah
dbguntuk melihat informasi dan melakukan diagnosa.-
Jalankan perintah berikut untuk mendapatkan shell di kontainer NGINX Ingress:
kubectl exec -it -n kube-system <nginx-ingress-pod-name> -- bash -
Jalankan
/dbguntuk melihat output seperti berikut:nginx-ingress-controller-69f46d8b7-qmt25:/$ /dbg dbg is a tool for quickly inspecting the state of the nginx instance Usage: dbg [command] Available Commands: backends Inspect the dynamically-loaded backends information certs Inspect dynamic SSL certificates completion Generate the autocompletion script for the specified shell conf Dump the contents of /etc/nginx/nginx.conf general Output the general dynamic lua state help Help about any command Flags: -h, --help help for dbg --status-port int Port to use for the lua HTTP endpoint configuration. (default 10246) Use "dbg [command] --help" for more information about a command.
Periksa apakah sertifikat untuk nama domain tertentu ada.
/dbg certs get <hostname>Daftar semua informasi layanan backend.
/dbg backends all -
Status Nginx Ingress
NGINX menyediakan titik akhir status bawaan yang mengeluarkan statistik runtime. Di kontainer NGINX Ingress, gunakan curl untuk mengakses titik akhir nginx_status pada port 10246 untuk melihat statistik permintaan dan koneksi.
-
Jalankan perintah berikut untuk mendapatkan shell di kontainer NGINX Ingress:
kubectl exec -itn kube-system <nginx-ingress-pod-name> bash -
Jalankan perintah berikut untuk melihat statistik permintaan dan koneksi saat ini untuk NGINX:
nginx-ingress-controller-79c5b4d87f-xxx:/etc/nginx$ curl localhost:10246/nginx_status Active connections: 12818 server accepts handled requests 22717127 22717127 823821421 Reading: 0 Writing: 382 Waiting: 12483Sejak dimulai, NGINX telah menangani 22.717.127 koneksi dan memproses 823.821.421 permintaan, rata-rata sekitar 36,2 permintaan per koneksi.
-
Koneksi aktif: Jumlah total koneksi aktif. Dalam contoh ini, nilainya 12.818.
-
Reading: Jumlah koneksi di mana NGINX sedang membaca header permintaan. Dalam contoh ini, nilainya 0.
-
Writing: Jumlah koneksi di mana NGINX sedang mengirim respons. Dalam contoh ini, nilainya 382.
-
Waiting: Jumlah koneksi keep-alive. Dalam contoh ini, nilainya 12.483.
-
Pengambilan paket
Jika Anda tidak dapat menentukan penyebab masalah, lakukan pengambilan paket.
-
Berdasarkan temuan awal Anda, tentukan apakah masalah jaringan berada di pod Ingress atau pod aplikasi. Jika informasi Anda tidak cukup, Anda dapat mengambil paket di kedua pod.
-
Masuk ke node yang menjalankan pod aplikasi atau pod Ingress yang terpengaruh.
-
Di instance ECS (bukan di dalam kontainer), jalankan perintah berikut untuk mengambil traffic yang terkait dengan pod tertentu dan simpan ke file:
tcpdump -i any host <Ingress-pod-IP-or-application-pod-IP> -C 20 -W 200 -w /tmp/ingress.pcap -
Pantau log. Saat error yang diharapkan terjadi, hentikan pengambilan paket.
-
Korelasikan informasi paket yang diambil dengan log error aplikasi untuk mengidentifikasi masalah.
Catatan-
Dalam kondisi normal, pengambilan paket tidak memengaruhi layanan Anda. Ini hanya menambahkan beban CPU dan I/O disk yang kecil.
-
Perintah di atas melakukan rotasi file tangkapan. Ini dapat menghasilkan maksimal 200 file .pcap, masing-masing berukuran 20 MB.
-
Akses intra-kluster ke alamat load balancer eksternal gagal
Gejala
Di kluster, pod di beberapa node tidak dapat mengakses pod backend melalui alamat eksternal NGINX Ingress Controller (alamat IP instance load balancer), sedangkan pod di node lain dapat.
Penyebab
Masalah ini disebabkan oleh pengaturan externalTrafficPolicy dari service controller, yang menentukan cara traffic eksternal ditangani. Saat diatur ke Local, hanya pod backend di node yang sama dengan pod controller yang dapat menerima permintaan. Saat diatur ke Cluster, semua pod backend dapat diakses secara normal. Saat resource di dalam kluster menggunakan alamat eksternal service load balancer, permintaan tersebut juga dianggap sebagai traffic eksternal.
Solusi
-
(Direkomendasikan) Akses layanan dari dalam kluster Kubernetes menggunakan ClusterIP atau nama layanannya. Nama layanan untuk ingress adalah
nginx-ingress-lb.kube-system. -
Jalankan perintah
kubectl edit svc nginx-ingress-lb -n kube-systemuntuk mengedit service ingress. UbahexternalTrafficPolicydari service load balancer menjadiCluster. Jika plugin jaringan kluster Anda adalah Flannel, IP sumber klien akan hilang. Jika Anda menggunakan Terway, IP sumber klien dipertahankan.
-
Contoh:
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/backend-type: eni # Direct to ENI. labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: ClusterUntuk informasi selengkapnya tentang anotasi service, lihat Konfigurasikan Classic Load Balancer (CLB) menggunakan anotasi.
Tidak dapat mengakses ingress controller
Gejala
Di kluster Flannel, saat Anda mengakses Ingress dari pod Ingress melalui nama domainnya, IP SLB, atau ClusterIP, beberapa atau semua permintaan gagal.
Penyebab
Konfigurasi Flannel default menonaktifkan hairpinning.
Solusi
-
(Direkomendasikan) Buat ulang kluster dengan plugin jaringan Terway dan migrasikan workload Anda ke kluster baru.
-
Jika Anda tidak dapat membuat ulang kluster, ubah konfigurasi Flannel untuk mengaktifkan
hairpinMode. Setelah mengubah konfigurasi, buat ulang pod Flannel untuk menerapkan perubahan.-
Jalankan perintah berikut untuk mengedit konfigurasi Flannel:
kubectl edit cm kube-flannel-cfg -n kube-system -
Di bagian cni-conf.json output, tambahkan
"hairpinMode": trueke objekdelegate.Contoh:
cni-conf.json: | { "name": "cb0", "cniVersion":"0.3.1", "type": "flannel", "delegate": { "isDefaultGateway": true, "hairpinMode": true } } -
Jalankan perintah berikut untuk menghapus pod Flannel. Sistem secara otomatis membuat ulang pod tersebut dengan konfigurasi baru.
kubectl delete pod -n kube-system -l app=flannel
-
Sertifikat TLS default atau lama tetap digunakan
Gejala
Setelah Anda menambahkan atau memodifikasi Secret di kluster dan menentukan secretName di Ingress, permintaan tetap dilayani dengan sertifikat default (Kubernetes Ingress Controller Fake Certificate) atau sertifikat lama.
Penyebab
-
Sertifikat tidak dikembalikan oleh ingress controller di kluster.
-
Controller tidak memuat sertifikat dengan benar karena sertifikat tersebut tidak valid.
-
Controller ingress menggunakan Server Name Indication (SNI) untuk menyajikan sertifikat yang benar, tetapi proses jabat tangan TLS mungkin tidak menyertakan ekstensi SNI.
Solusi
-
Verifikasi bahwa proses jabat tangan TLS menyertakan ekstensi SNI dengan menggunakan salah satu metode berikut:
-
Gunakan browser modern yang mendukung SNI.
-
Saat menguji sertifikat dengan perintah
openssl s_client, sertakan parameter-servername. -
Saat menggunakan
curl, petakan nama domain dengan parameter--resolveatau dengan mengedit file hosts Anda, daripada mengirim permintaan ke alamat IP dengan headerHost.
-
-
Pastikan tidak ada sertifikat TLS yang dikonfigurasi di WAF, akses transparan WAF, atau listener layer-7 SLB. Sertifikat TLS harus dikembalikan oleh ingress controller di kluster.
-
Jalankan diagnostik Ingress di konsol Intelligent Operations untuk memeriksa masalah konfigurasi dan log error. Untuk informasi selengkapnya, lihat Gunakan diagnostik Ingress.
-
Jalankan perintah berikut untuk memeriksa secara manual log error Pod Ingress dan lakukan perubahan berdasarkan saran di log.
kubectl logs <ingress pod name> -n <pod namespace> | grep -E ^[EW]
Tidak dapat terhubung ke gRPC melalui Ingress
Gejala
Anda tidak dapat mengakses layanan gRPC melalui Ingress.
Penyebab
-
Resource Ingress tidak memiliki Annotation untuk protokol backend.
-
Layanan gRPC memerlukan koneksi TLS saat diekspos melalui Ingress.
Solusi
-
Tambahkan Annotation berikut ke resource Ingress:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC". -
Pastikan klien mengirim lalu lintas terenkripsi melalui port TLS.
Tidak dapat terhubung ke layanan HTTPS backend
Gejala
-
Tidak dapat mengakses layanan HTTPS di belakang Ingress.
-
Permintaan mungkin mengembalikan kode status 400 dengan pesan
The plain HTTP request was sent to HTTPS port.
Penyebab
Controller Ingress mengirim permintaan HTTP ke Pod backend secara default.
Solusi
Atur anotasi berikut di resource Ingress Anda: nginx.ingress.kubernetes.io/backend-protocol:"HTTPS".
Tidak dapat mempertahankan IP sumber di pod Ingress
Gejala
Alamat IP sumber klien tidak dipertahankan di Pod Ingress. Sebagai gantinya, aplikasi menerima alamat IP internal, seperti IP node atau alamat dari rentang 100.XX.XX.XX.
Penyebab
-
externalTrafficPolicydari Service yang mengekspos Ingress diatur keCluster. -
Instance Server Load Balancer (SLB) dikonfigurasi sebagai proxy layer-7.
-
Web Application Firewall (WAF) atau layanan WAF transparan digunakan.
Solusi
-
Jika Service Anda memiliki
externalTrafficPolicydiatur keClusterdan diekspos oleh instance SLB layer-4:Ubah
externalTrafficPolicymenjadiLocal. Perubahan ini mungkin mencegah pod di dalam kluster mengakses Ingress melalui alamat IP SLB. Untuk solusinya, lihat Tidak dapat mengakses alamat eksternal LoadBalancer kluster dari dalam kluster. -
Jika Anda menggunakan proxy layer-7, seperti instance SLB layer-7, WAF, atau WAF transparan, ikuti langkah-langkah berikut:
-
Pastikan proxy layer-7 Anda dikonfigurasi untuk menambahkan header permintaan X-Forwarded-For.
-
Di ConfigMap Ingress Controller (nginx-configuration di namespace kube-system secara default), tambahkan
enable-real-ip: "true". -
Periksa log untuk memverifikasi bahwa IP sumber dipertahankan.
-
-
Jika jalur traffic Anda melibatkan beberapa langkah penerusan, seperti layanan reverse proxy tambahan di depan Ingress Controller, aktifkan
enable-real-ipdan periksa nilai bidangremote_addrdi log. Ini membantu Anda menentukan apakah kontainer Ingress menerima alamat IP sumber klien di header permintaan X-Forwarded-For. Jika tidak, pastikan alamat IP sumber ditambahkan ke permintaan, misalnya di header X-Forwarded-For, sebelum permintaan mencapai Ingress Controller.
Aturan canary gagal berlaku
Gejala
Anda telah mengonfigurasi rilis canary di kluster Anda, tetapi aturan canary tidak berlaku.
Penyebab
-
Saat menggunakan anotasi
canary-*, anotasinginx.ingress.kubernetes.io/canary: "true"tidak diatur. -
Untuk versi NGINX Ingress Controller sebelum 0.47.0, bidang
Hostdi aturan Ingress Anda harus berisi nama domain layanan Anda dan tidak boleh kosong.
Solusi
-
Atur anotasi
nginx.ingress.kubernetes.io/canary: "true", atau atur bidang Host di aturan Ingress Anda ke nama domain layanan Anda. Untuk informasi selengkapnya, lihat Aturan routing. -
Jika skenario ini tidak berlaku, lihat Traffic tidak didistribusikan sesuai aturan rilis canary atau traffic diarahkan ke layanan canary.
Traffic yang tidak diharapkan diarahkan ke layanan canary
Gejala
Anda telah mengonfigurasi aturan canary, tetapi traffic tidak didistribusikan sesuai spesifikasi. Anda juga mungkin menemukan bahwa traffic dari ingress standar lainnya diarahkan ke layanan canary.
Penyebab
NGINX Ingress Controller menerapkan aturan canary tidak hanya ke satu ingress, tetapi ke semua ingress yang berbagi layanan yang sama.
Untuk informasi selengkapnya tentang perilaku ini, lihat Ingress dengan aturan canary memengaruhi semua ingress yang berbagi layanan yang sama.
Solusi
Untuk mengaktifkan rilis canary untuk ingress (termasuk yang menggunakan service-match dan anotasi terkait canary-*), buat layanan khusus (satu layanan stabil dan satu layanan canary) yang mengarah ke pod yang ada. Kemudian, aktifkan aturan canary pada ingress tersebut. Untuk informasi selengkapnya, lihat Implementasikan rilis canary dan penyebaran biru-hijau menggunakan NGINX Ingress.
Error saat membuat Ingress: "failed calling webhook"
Gejala
Saat Anda membuat resource Ingress, Anda menerima error "Internal error occurred: failed calling webhook...".
Kode error lengkapnya adalah APISERVER_500. Pesan detailnya adalah Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.kube-system.svc:443/networking/v1beta1/ingresses?timeout=10s: context deadline exceeded. Frasa 'context deadline exceeded' menunjukkan akar penyebabnya: timeout panggilan webhook.
Penyebab
Saat Anda membuat resource Ingress, Service—secara default, ingress-nginx-controller-admission—harus memvalidasi konfigurasinya. Jika komponen dalam rantai panggilan tidak tersedia (misalnya, jika Service atau Ingress Controller dihapus), validasi gagal dan server API menolak resource Ingress.
Solusi
-
Periksa rantai panggilan webhook untuk memastikan semua resource yang diperlukan berjalan dengan benar. Rantainya adalah: ValidatingWebhookConfiguration → Service → Pod.
-
Verifikasi bahwa Pod Ingress Controller memiliki fitur admission yang diaktifkan dan dapat diakses dari luar.
-
Jika Ingress Controller dihapus atau Anda tidak memerlukan fungsionalitas webhook, hapus resource ValidatingWebhookConfiguration.
Error SSL_ERROR_RX_RECORD_TOO_LONG saat akses HTTPS
Gejala
Anda menerima error saat mengakses HTTPS: SSL_ERROR_RX_RECORD_TOO_LONG atau routines:CONNECT_CR_SRVR_HELLO:wrong version number.
Penyebab
Permintaan HTTPS dikirim ke port non-HTTPS, seperti port HTTP.
Penyebab umum meliputi:
-
Port 443 di SLB dipetakan ke port 80 di Pod Ingress.
-
Port 443 di Service controller Ingress dipetakan ke port 80 di Pod Ingress.
Solusi
Modifikasi pengaturan SLB atau Service untuk mengarahkan traffic HTTPS ke port yang benar.
Kode error HTTP umum
Gejala
Permintaan mengembalikan error non-2xx atau non-3xx, seperti 502, 503, 413, atau 499.
Penyebab dan solusi
Periksa log akses untuk menentukan apakah error dikembalikan oleh Ingress Controller. Untuk informasi selengkapnya, lihat Gunakan Log Service untuk melihat log akses controller NGINX Ingress. Jika demikian, lihat solusi berikut:
-
Error 413
-
Penyebab: NGINX Ingress Controller berfungsi dengan benar, tetapi ukuran data permintaan melebihi batas yang diizinkan.
-
Solusi: Jalankan
kubectl edit cm -n kube-system nginx-configurationuntuk memodifikasi konfigurasi controller. Sesuaikan nilainginx.ingress.kubernetes.io/client-max-body-sizedannginx.ingress.kubernetes.io/proxy-body-sizesesuai kebutuhan (default:20m).
-
-
Error 499
-
Penyebab: Klien memutus koneksi lebih awal. Hal ini tidak selalu menunjukkan masalah pada komponen atau layanan backend.
-
Solusi:
-
Sejumlah kecil error 499 bisa dianggap normal dan diabaikan, tergantung aplikasi Anda.
-
Jika banyak error 499 terjadi, periksa apakah waktu pemrosesan layanan backend dan timeout permintaan sisi klien dikonfigurasi sesuai harapan.
-
-
-
Error 502
-
Penyebab: NGINX Ingress Controller berfungsi dengan benar, tetapi pod Controller tidak dapat terhubung ke pod backend target.
-
Solusi:
-
Jika error selalu terjadi:
-
Konfigurasi yang salah untuk Service atau pod backend dapat menyebabkan error ini. Periksa konfigurasi port Service backend dan kode aplikasi di kontainer.
-
-
Jika error terjadi secara intermiten:
-
Beban tinggi pada pod NGINX Ingress Controller dapat menyebabkan error ini. Anda dapat menilai beban dengan memeriksa jumlah permintaan dan koneksi pada instance load balancer yang terkait dengan controller. Lihat Konfigurasikan controller NGINX Ingress untuk skenario beban tinggi untuk mengalokasikan lebih banyak resource ke controller.
-
Error ini dapat terjadi jika pod backend secara aktif menutup sesi. NGINX Ingress Controller mengaktifkan koneksi persisten secara default. Pastikan periode timeout idle koneksi persisten backend lebih lama dari periode timeout idle controller (default: 900 detik).
-
-
Jika Anda tidak dapat mengidentifikasi masalah menggunakan metode di atas, lakukan pengambilan paket untuk analisis.
-
-
-
Error 503
-
Penyebab: Ingress Controller tidak dapat menemukan pod backend apa pun, atau semua pod backend tidak dapat dijangkau.
-
Solusi:
-
Jika error terjadi secara intermiten:
-
Lihat solusi untuk error 502.
-
Periksa status kesiapan layanan backend dan konfigurasikan pemeriksaan kesehatan yang sesuai.
-
-
Jika error selalu terjadi:
Periksa apakah Service backend dikonfigurasi dengan benar dan memiliki endpoint.
-
-
Error net::ERR_HTTP2_SERVER_REFUSED_STREAM
Gejala
Beberapa resource gagal dimuat, dan konsol developer browser menampilkan error net::ERR_HTTP2_SERVER_REFUSED_STREAM atau net::ERR_FAILED.
Penyebab
Jumlah permintaan resource konkuren melebihi batas aliran maksimum untuk koneksi HTTP/2.
Solusi
-
(Direkomendasikan) Di ConfigMap, tingkatkan
http2-max-concurrent-streams(default: 128) ke nilai yang sesuai untuk workload Anda. Untuk detailnya, lihat http2-max-concurrent-streams. -
Sebagai alternatif, nonaktifkan dukungan HTTP/2 di ConfigMap dengan mengatur
use-http2kefalse. Untuk detailnya, lihat use-http2.
Error: "The param of ServerGroupName is illegal"
Penyebab
ServerGroupName menggunakan format namespace+svcName+port. Nama grup server harus terdiri dari 2 hingga 128 karakter, dimulai dengan huruf atau karakter Tionghoa, dan dapat berisi angka, titik (.), garis bawah (_), dan tanda hubung (-).
Solusi
Modifikasi nama grup server agar sesuai dengan persyaratan penamaan.
Error pembuatan Ingress: "certificate signed by unknown authority"
Saat Anda membuat Ingress, kluster mengembalikan error dengan kode APISERVER_500 dan pesan berikut: Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.kube-system.svc:443/networking/v1beta1/ingresses?timeout=10s: x509: certificate signed by unknown authority.
Penyebab
Error ini terjadi jika beberapa penyebaran Ingress di kluster Anda berbagi resource seperti Secret, layanan, atau konfigurasi Webhook. Tumpang tindih resource ini menyebabkan ketidakcocokan sertifikat SSL saat Webhook admission berkomunikasi dengan layanan backend-nya, sehingga validasi gagal.
Solusi
Sebarkan ulang Ingress Anda dan pastikan setiap penyebaran menggunakan kumpulan resource yang unik. Untuk informasi selengkapnya tentang resource dalam penyebaran Ingress, lihat Pembaruan apa saja yang dilakukan saat Anda meningkatkan NGINX Ingress Controller di manajemen komponen ACK?.
Pod Ingress restart karena pemeriksaan kesehatan gagal
Gejala
Pemeriksaan kesehatan yang gagal menyebabkan pod controller restart.
Penyebab
-
Pemeriksaan kesehatan dapat gagal jika Pod Ingress atau nodenya mengalami beban tinggi.
-
Pemeriksaan kesehatan dapat gagal jika parameter kernel
tcp_tw_reuseatautcp_timestampsdiatur di node kluster.
Solusi
-
Tingkatkan jumlah Pod Ingress dan verifikasi bahwa masalah telah terselesaikan. Untuk detailnya, lihat Menyebarkan NGINX Ingress Controller untuk ketersediaan tinggi.
-
Nonaktifkan parameter kernel
tcp_tw_reuseatau atur ke 2, dan nonaktifkan parameter kerneltcp_timestamps. Kemudian, verifikasi bahwa masalah telah terselesaikan.
Tambahkan layanan TCP dan UDP
-
Tambahkan entri ke ConfigMap
tcp-servicesatauudp-services. Secara default, ConfigMap ini berada di namespaceingress-nginx.Misalnya, untuk memetakan port eksternal 9000 ke port 8080 layanan
example-godi namespacedefault:apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 9000: "default/example-go:8080" # Memetakan port 9000 ke port 8080 layanan. -
Tambahkan port yang dipetakan ke definisi kontainer di Deployment Ingress. Secara default, ini adalah Deployment
nginx-ingress-controllerdi namespaceingress-nginx. -
Tambahkan port yang dipetakan ke Service yang mengekspos controller Ingress.
Untuk informasi selengkapnya, lihat Mengekspos layanan TCP dan UDP.
Aturan Ingress tidak berlaku
Gejala
Anda menambahkan atau memodifikasi aturan Ingress, tetapi aturan tersebut tidak berlaku.
Kemungkinan penyebab
-
Kesalahan dalam konfigurasi Ingress mencegah aturan Ingress baru dimuat dengan benar.
-
Resource Ingress salah konfigurasi.
-
Controller Ingress tidak memiliki izin yang diperlukan untuk memantau perubahan resource Ingress.
-
Ingress yang ada menggunakan
server-aliasuntuk nama domain, yang bertentangan dengan Ingress baru dan menyebabkan aturan diabaikan.
Solusi
-
Gunakan alat diagnostik Ingress di konsol Intelligent O&M untuk mendiagnosis masalah dan ikuti panduan di layar. Untuk informasi selengkapnya, lihat Gunakan fitur diagnostik Ingress.
-
Periksa resource Ingress yang ada untuk kesalahan konfigurasi atau konflik:
-
Jika Anda menggunakan ekspresi reguler di path yang tidak memiliki anotasi
rewrite-target, pastikan anotasinginx.ingress.kubernetes.io/use-regex: "true"dikonfigurasi. -
Verifikasi bahwa PathType diatur sesuai harapan. Secara default,
ImplementationSpecificberfungsi identik denganPrefix.
-
-
Pastikan ClusterRole, ClusterRoleBinding, Role, RoleBinding, dan ServiceAccount yang terkait dengan controller Ingress ada. Secara default, semuanya bernama ingress-nginx.
-
Masuk ke kontainer pod controller dan periksa aturan yang ditambahkan di file nginx.conf.
-
Jalankan perintah berikut untuk memeriksa log kontainer secara manual dan mengidentifikasi masalah.
kubectl logs <ingress pod name> -n <pod namespace> | grep -E ^[EW]
Penulisan ulang path menyebabkan kegagalan pemuatan atau layar putih
Gejala
Setelah Anda menggunakan anotasi Ingress rewrite-target untuk menulis ulang path akses, beberapa resource gagal dimuat atau layar putih muncul.
Penyebab
-
Anotasi
rewrite-targettidak dikonfigurasi dengan ekspresi reguler. -
Aplikasi menggunakan path absolut yang dikodekan keras untuk meminta resource.
Solusi
-
Konfigurasikan anotasi
rewrite-targetdengan ekspresi reguler dan grup tangkapan. Untuk informasi selengkapnya, lihat Rewrite. -
Verifikasi bahwa permintaan frontend menggunakan path yang benar.
Perbaiki parsing log SLS setelah upgrade
Gejala
Komponen ingress-nginx-controller memiliki dua versi utama: 0.20 dan 0.30. Setelah Anda meningkatkan komponen dari versi 0.20 ke 0.30 menggunakan Add-ons di konsol, Dashboard Ingress salah menampilkan informasi traffic untuk layanan backend saat Anda menggunakan rilis canary atau penyebaran biru-hijau.
Penyebab
Versi 0.20 dan 0.30 menggunakan format log default yang berbeda. Akibatnya, Dashboard Ingress salah mengurai log saat Anda menggunakan rilis canary atau penyebaran biru-hijau.
Solusi
Untuk memperbaiki masalah ini, perbarui nginx-configuration configmap dan konfigurasi k8s-nginx-ingress.
-
Perbarui
nginx-configuration configmap.-
Jika Anda belum memodifikasi
nginx-configuration configmap, simpan konten berikut sebagainginx-configuration.yamldan jalankankubectl apply -f nginx-configuration.yaml.apiVersion: v1 kind: ConfigMap data: allow-backend-server-header: "true" enable-underscores-in-headers: "true" generate-request-id: "true" ignore-invalid-headers: "true" log-format-upstream: $remote_addr - [$remote_addr] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id $host [$proxy_alternative_upstream_name] max-worker-connections: "65536" proxy-body-size: 20m proxy-connect-timeout: "10" reuse-port: "true" server-tokens: "false" ssl-redirect: "false" upstream-keepalive-timeout: "900" worker-cpu-affinity: auto metadata: labels: app: ingress-nginx name: nginx-configuration namespace: kube-system -
Jika Anda telah memodifikasi
nginx-configuration configmap, jalankan perintah berikut untuk memperbaiki masalah tanpa menimpa konfigurasi Anda:kubectl edit configmap nginx-configuration -n kube-system
Di akhir bidang
log-format-upstream, tambahkan[$proxy_alternative_upstream_name], lalu simpan dan keluar. -
-
Perbarui konfigurasi
k8s-nginx-ingress.Simpan konten berikut sebagai
k8s-nginx-ingress.yaml, lalu jalankan perintahkubectl apply -f k8s-nginx-ingress.yamluntuk menerapkan konfigurasi.
Error: "cannot list/get/update resource"
Gejala
Saat memeriksa error di Pod controller seperti yang dijelaskan di Periksa log error di Pod controller, Anda mungkin menemukan log error seperti ini:
User "system:serviceaccount:kube-system:ingress-nginx" cannot list/get/update resource "xxx" in API group "xxx" at the cluster scope/ in the namespace "kube-system"
Penyebab
NGINX Ingress Controller tidak memiliki izin yang diperlukan untuk memperbarui resource terkait.
Solusi
-
Periksa log untuk menentukan apakah ClusterRole atau Role yang menyebabkan masalah.
-
Jika log berisi
at the cluster scope, masalah disebabkan oleh ClusterRole (ingress-nginx). -
Log berisi
in the namespace "kube-system", menunjukkan bahwa masalah disebabkan oleh Role (kube-system/ingress-nginx).
-
-
Verifikasi bahwa izin dan binding yang diperlukan ada.
-
Untuk ClusterRole:
-
Pastikan ClusterRole
ingress-nginxdan ClusterRoleBindingingress-nginxada. Jika tidak ada, buat, pulihkan dari cadangan, atau uninstall dan instal ulang komponen tersebut. -
Pastikan ClusterRole
ingress-nginxberisi izin yang ditunjukkan di log (dalam contoh di bawah, izin untuklistresourceingressesdi grup APInetworking.k8s.io). Jika izin tersebut hilang, tambahkan secara manual ke ClusterRole.E0629 17:26:22.916137 8 reflector.go:138] k8s.io/client-go@v0.23.6/tools/cache/reflector.go:167: Failed to watch *v1.Ingress: failed to list *v1.Ingress: ingresses.networking.k8s.io is forbidden: User "system:serviceaccount:kube-system:ingress-nginx" cannot list resource "ingresses" in API group "networking.k8s.io" at the cluster scope
-
-
Untuk Role:
-
Pastikan Role
kube-system/ingress-nginxdan RoleBindingkube-system/ingress-nginxada. Jika tidak ada, buat, pulihkan dari cadangan, atau uninstall dan instal ulang komponen tersebut. -
Pastikan Role
ingress-nginxberisi izin yang ditunjukkan di log (dalam contoh di bawah, izinupdateuntuk ConfigMapingress-controller-leader-nginx). Jika izin tersebut hilang, tambahkan secara manual ke Role.E0629 17:07:09.111640 9 leaderelection.go:367] Failed to update lock: configmaps "ingress-controller-leader-nginx" is forbidden: User "system:serviceaccount:kube-system:ingress-nginx" cannot update resource "configmaps" in API group "" in the namespace "kube-system"
-
-
Uji file konfigurasi gagal
Gejala
Saat Anda memeriksa log controller di pod seperti yang dijelaskan di Periksa log error di pod controller, Anda mungkin menemukan log error seperti berikut:
requeuing……nginx: configuration file xxx test failed (multiple lines)
Penyebab
Kesalahan konfigurasi mencegah NGINX memuat ulang konfigurasinya. Penyebabnya biasanya kesalahan sintaksis dalam aturan ingress atau cuplikan yang disisipkan ke ConfigMap.
Solusi
-
Periksa pesan error di log untuk mengidentifikasi masalah. Anda dapat mengabaikan pesan dengan level
warn. Jika pesan error tidak jelas, gunakan file dan nomor baris dari log untuk memeriksa file di pod. Misalnya, log berikut menunjukkan error di file/tmp/nginx/nginx-cfg2825306115pada baris 449.E0629 19:54:09.340338 8 queue.go:130] "requeuing" err=< ----------------------------------------------------------------------- Error: exit status 1 2022/06/29 19:54:09 [warn] 179#179: the "http2_max_field_size" directive is obsolete, use the "large_client_header_buffers" directive instead in /tmp/nginx/nginx-cfg2825306115:146 nginx: [warn] the "http2_max_field_size" directive is obsolete, use the "large_client_header_buffers" directive instead in /tmp/nginx/nginx-cfg2825306115:146 2022/06/29 19:54:09 [warn] 179#179: the "http2_max_header_size" directive is obsolete, use the "large_client_header_buffers" directive instead in /tmp/nginx/nginx-cfg2825306115:147 nginx: [warn] the "http2_max_header_size" directive is obsolete, use the "large_client_header_buffers" directive instead in /tmp/nginx/nginx-cfg2825306115:147 2022/06/29 19:54:09 [warn] 179#179: the "http2_max_requests" directive is obsolete, use the "keepalive_requests" directive instead in /tmp/nginx/nginx-cfg2825306115:148 nginx: [warn] the "http2_max_requests" directive is obsolete, use the "keepalive_requests" directive instead in /tmp/nginx/nginx-cfg2825306115:148 2022/06/29 19:54:09 [emerg] 179#179: unexpected "}" in /tmp/nginx/nginx-cfg2825306115:449 nginx: [emerg] unexpected "}" in /tmp/nginx/nginx-cfg2825306115:449 nginx: configuration file /tmp/nginx/nginx-cfg2825306115 test failedJalankan perintah berikut untuk memeriksa konfigurasi di sekitar baris yang ditentukan untuk mencari kesalahan.
# Masuk ke pod. kubectl exec -n <namespace> <controller pod name> -it -- bash # Lihat file dengan nomor baris untuk memeriksa konfigurasi di sekitar error. cat -n /tmp/nginx/nginx-cfg2825306115 -
Gunakan pesan error dan file konfigurasi untuk mengidentifikasi dan memperbaiki kesalahan konfigurasi.
Error: "Unexpected error validating SSL certificate"
Gejala
Saat Anda memeriksa log Pod Controller seperti yang dijelaskan di Periksa log error di pod controller, Anda mungkin menemukan log error controller seperti berikut:
Unexpected error validating SSL certificate "xxx" for server "xxx"
W0629 20:39:10.993206 7 controller.go:1364] Unexpected error validating SSL certificate "default/tls-secret" for server "test.example.com": x509: certificate is not valid for any names, but wanted to match test.example.com
W0629 20:39:10.993238 7 controller.go:1365] Validating certificate against DNS names. This will be deprecated in a future version
W0629 20:39:10.993252 7 controller.go:1370] SSL certificate "default/tls-secret" does not contain a Common Name or Subject Alternative Name for server "test.example.com": x509: certificate is not valid for any names, but wanted to match test.example.com
Penyebab
Error ini disebabkan oleh kesalahan konfigurasi certificate. Penyebab umum adalah ketidaksesuaian antara nama domain yang dikonfigurasi di resource ingress dan nama domain yang termasuk dalam certificate. Beberapa log level peringatan, seperti subject alternative name yang hilang, mungkin tidak memengaruhi fungsionalitas certificate. Tentukan apakah ini merupakan masalah aktual untuk kasus penggunaan Anda.
Solusi
Gunakan pesan error untuk memeriksa masalah berikut dengan certificate di cluster Anda.
-
Verifikasi bahwa format dan konten file
certificate(.crt) dan file kunci privat (.key) benar. -
Pastikan
nama domaindicertificate, seperticommon nameatausubject alternative name, sesuai dengannama domainyang dikonfigurasi di resourceingress. -
Periksa apakah
certificatetelah kedaluwarsa.
File konfigurasi yang tertinggal di controller
Gejala
Versi NGINX Ingress Controller sebelum 1.10 memiliki bug yang diketahui. Biasanya, controller segera membersihkan file nginx-cfg yang dihasilkan. Namun, jika kesalahan dalam konfigurasi Ingress membuat nginx.conf yang di-render tidak valid, controller gagal menghapus file konfigurasi yang salah ini. Akumulasi bertahap file nginx-cfgxxx ini menghabiskan ruang disk yang signifikan.
1.6M nginx-cfg1093913015
1.6M nginx-cfg1093943092
1.6M nginx-cfg1093985057
1.6M nginx-cfg1093989258
1.6M nginx-cfg1094101515
1.6M nginx-cfg1094200269
1.6M nginx-cfg1094291268
1.6M nginx-cfg1094298834
1.6M nginx-cfg1094398542
0 nginx-cfg1094455202
1.6M nginx-cfg1094500903
1.6M nginx-cfg1094513787
1.6M nginx-cfg1094539327
1.6M nginx-cfg1094651267
0 nginx-cfg1094749495
0 nginx-cfg1094766605
1.6M nginx-cfg1094774347
1.6M nginx-cfg1094799028
1.6M nginx-cfg109483858
1.6M nginx-cfg1094903817
1.6M ...
Penyebab
Cacat dalam logika pembersihan menyebabkan masalah ini. Mekanisme pembersihan menghapus file konfigurasi yang dihasilkan dengan benar tetapi gagal menghapus yang tidak valid, sehingga file tersebut tetap ada di sistem. Untuk detail selengkapnya, lihat GitHub Issue #11568 komunitas.
Solusi
Untuk menyelesaikan masalah ini, gunakan salah satu solusi berikut.
-
Tingkatkan NGINX Ingress Controller ke versi 1.10 atau yang lebih baru. Untuk detailnya, lihat Tingkatkan komponen NGINX Ingress Controller.
-
Hapus secara berkala file
nginx-cfgxxxyang tertinggal. Anda dapat menulis skrip untuk mengotomatiskan proses ini dan mengurangi upaya manual. -
Validasi konfigurasi Ingress baru sebelum menerapkannya untuk mencegah pembuatan file konfigurasi yang tidak valid.
Pod macet di status Pending setelah upgrade controller
Gejala
Saat Anda meningkatkan NGINX Ingress Controller, pod mungkin gagal dijadwalkan dan tetap dalam status Pending untuk waktu yang lama.
Penyebab
Saat upgrade NGINX Ingress Controller, aturan afinitas node dan anti-afinitas pod default mungkin mencegah pod baru dijadwalkan. Anda harus memastikan bahwa kluster memiliki resource yang cukup tersedia.
Jalankan perintah berikut untuk menyelidiki akar penyebabnya:
kubectl -n kube-system describe pod <pending-pod-name>kubectl -n kube-system get events
Solusi
Coba salah satu solusi berikut.
-
Tingkatkan resource kluster: Tambahkan node baru untuk memenuhi persyaratan afinitas. Untuk informasi selengkapnya, lihat Skala pool node secara manual.
-
Atur ulang afinitas: Jika resource terbatas, longgarkan persyaratan anti-afinitas pod dengan menjalankan perintah
kubectl edit deploy nginx-ingress-controller -n kube-system. Pendekatan ini memungkinkan pod dijadwalkan di node yang sama, tetapi dapat mengurangi ketersediaan tingginya.
Kerancuan aliran TCP dengan beberapa CLB untuk Nginx Ingress
Gejala
Di kluster Container Service for Kubernetes (ACK) yang menggunakan Flannel CNI dan mode jaringan IPVS, kerancuan aliran TCP dapat terjadi dalam konkurensi tinggi jika NGINX Ingress Controller diikat ke beberapa Classic Load Balancer (CLB). Pengambilan paket mungkin mengungkap anomali berikut.
-
Pengiriman ulang paket
-
Reset koneksi TCP
Dalam pengambilan paket dari ingress pod, memfilter berdasarkan TCP stream di Wireshark mengungkap pengiriman ulang paket dan sinyal reset. Berikut adalah contoh output analisis protokol:
Filter: tcp.stream eq 7517
Frame 197967: 2582 bytes on wire (20656 bits), 2582 bytes captured (20656 bits)
Ethernet II, Src: 66:4b:c1:20:9a:0a (66:4b:c1:20:9a:0a), Dst: d6:79:26:1b:14:4d (d6:79:26:1b:14:4d)
Internet Protocol Version 4, Src: 172.30.3.183, Dst: xxx
Transmission Control Protocol, Src Port: 80, Dst Port: 1458, Seq: 1284522488, Ack: 173965101, Len: 2516
Selected packet (Frame 197967):
Src: 172.30.3.183 -> Dst: xxx
TCP Seq: 2516
Sequence number: 1284522488
Acknowledgement: 173965101
Timestamp value: 1789595929
Hex dump (partial):
0000 d6 79 26 1b 14 4d 66 4b c1 20 9a 0a 08 45 b0
0010 ...
Info column shows multiple entries including:
[ACK] Seq=xxx Ack=xxx
[TCP Window Full]
[TCP Retransmission]
[RST]
Penyebab
Di kluster ACK yang dikonfigurasi dengan plugin jaringan Flannel, CLB meneruskan traffic ke NodePort di node tempat NGINX Ingress Controller berjalan. Namun, saat beberapa Service menggunakan NodePort yang berbeda, konflik sesi dapat terjadi di IPVS dalam konkurensi tinggi.
Solusi
-
Gunakan satu load balancer: Buat hanya satu
LoadBalancer Serviceuntuk NGINX Ingress Controller. Ikatkan CLB lainnya keNodePortnode secara manual untuk mengurangi kemungkinan konflik. -
Hindari beberapa NodePort aktif: Di satu
node, hindari memiliki beberapaNodePortaktif untuk mengurangi risiko konflik sesi IPVS.