Topik ini memberikan jawaban atas pertanyaan yang sering diajukan mengenai Controller Ingress NGINX, mencakup sertifikat TLS/SSL, konfigurasi, kinerja, dan troubleshooting.
Apa saja masalah yang diketahui pada versi lama Controller Ingress NGINX?
Versi lama memiliki masalah yang diketahui berikut. Kami merekomendasikan melakukan peningkatan ke versi terbaru untuk memastikan stabilitas.
Nilai parameter defaultBackend suatu Ingress menimpa konfigurasi global Controller Ingress NGINX
Versi yang terpengaruh: 1.2.1-aliyun.1 dan sebelumnya.
Solusi: Tingkatkan Controller Ingress NGINX ke versi 1.5.1-aliyun.1 atau yang lebih baru.
File konfigurasi sementara nginx-cfg-xx tidak dibersihkan, yang dapat menyebabkan disk penuh
Versi yang terpengaruh: 1.10.2-aliyun.1 dan sebelumnya.
Solusi: Tingkatkan Controller Ingress NGINX ke versi 1.10.4-aliyun.1 atau yang lebih baru.
Kegagalan unggah file berukuran lebih dari 2 GB
Penyebab: Nilai
client-body-buffer-sizelebih besar dari batas penyimpanan untuk integer 32-bit.Solusi: Atur
client-body-buffer-sizeke nilai yang lebih kecil, misalnya200M.
Versi TLS apa saja yang didukung?
Ingress-nginx mendukung TLS 1.2 dan TLS 1.3. Klien yang menggunakan versi TLS sebelum 1.2 mungkin mengalami error handshake.
Untuk mendukung versi TLS tambahan, tambahkan konfigurasi berikut ke ConfigMap nginx-configuration di namespace kube-system. Lihat TLS/HTTPS.
Untuk mengaktifkan TLS 1.0 atau 1.1 pada Controller Ingress NGINX versi 1.7.0 dan yang lebih baru, Anda harus menentukan @SECLEVEL=0 dalam parameter ssl-ciphers.

ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"Apakah header permintaan diteruskan ke server backend?
Secara default, ingress-nginx meneruskan header permintaan Lapisan 7 ke server backend, tetapi menyaring header HTTP non-standar (seperti Mobile Version). Untuk mempertahankan header tersebut, jalankan kubectl edit cm -n kube-system nginx-configuration untuk memperbarui ConfigMap. Lihat ConfigMap.
enable-underscores-in-headers: trueBagaimana cara meneruskan permintaan ke server backend HTTPS?
Untuk meneruskan permintaan ke server backend HTTPS melalui ingress-nginx, tambahkan anotasi berikut ke Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xxxx
annotations:
# Anda harus menentukan HTTPS sebagai protokol yang digunakan oleh server backend.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"Bagaimana cara meneruskan alamat IP klien pada Lapisan 7?
Secara default, ingress-nginx menambahkan header X-Forwarded-For dan X-Real-IP untuk meneruskan alamat IP klien. Namun, jika klien sudah menyertakan header tersebut, server backend tidak dapat memperoleh IP klien asli.
Jalankan perintah kubectl edit cm -n kube-system nginx-configuration untuk memodifikasi ConfigMap nginx-configuration. Hal ini memungkinkan ingress-nginx meneruskan alamat IP klien pada Lapisan 7.
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"Jika trafik melewati beberapa server proxy hulu sebelum mencapai Ingress NGINX, Anda harus menambahkan field proxy-real-ip-cidr ke ConfigMap nginx-configuration dan mengatur nilai proxy-real-ip-cidr ke blok CIDR server proxy hulu. Pisahkan beberapa blok CIDR dengan koma (,). Untuk informasi selengkapnya, lihat Gunakan WAF.
proxy-real-ip-cidr: "0.0.0.0/0,::/0" Pada skenario IPv6, jika Ingress NGINX menerima header X-Forwarded-For kosong dan instance Classic Load Balancer (CLB) hulu digunakan, Anda dapat mengaktifkan protokol Proxy pada instance CLB untuk mengambil alamat IP klien. Untuk informasi selengkapnya tentang protokol Proxy, lihat Aktifkan listener Lapisan 4 untuk mempertahankan alamat IP klien dan meneruskannya ke server backend.
Bagaimana cara mengonfigurasi HSTS?
HTTP Strict Transport Security (HSTS) diaktifkan secara default. Saat browser pertama kali mengakses layanan melalui HTTP biasa, server (dengan HSTS aktif) memicu respons HSTS. Di developer tools browser, Anda akan melihat field Non-Authoritative-Reason: HSTS di header respons, yang menunjukkan dukungan HSTS. Jika browser kompatibel dengan HSTS, browser tersebut akan secara otomatis beralih ke HTTPS untuk permintaan berikutnya, menghasilkan kode status 307 Internal Redirect, seperti yang ditunjukkan pada gambar di bawah.
Jika Anda tidak ingin meneruskan permintaan klien ke server backend HTTPS, nonaktifkan HSTS untuk nginx-ingress-controller. Untuk instruksi selengkapnya, lihat HSTS.
Secara default, konfigurasi HSTS di-cache oleh browser. Anda harus menghapus cache browser secara manual setelah menonaktifkan HSTS untuk nginx-ingress-controller.
Aturan penulisan ulang apa saja yang didukung?
Ingress-nginx hanya mendukung aturan rewrite sederhana. Untuk aturan rewrite kompleks, gunakan:
configuration-snippet: Tambahkan anotasi ini ke konfigurasi location Ingress.
server-snippet: Tambahkan ke konfigurasi server Ingress.
Anda dapat menggunakan snippet lain untuk menambahkan konfigurasi global, seperti yang ditunjukkan pada gambar berikut. Untuk informasi selengkapnya, lihat main-snippet.
Resource apa saja yang diperbarui saat melakukan peningkatan Controller Ingress NGINX?
Jika versi Controller Ingress NGINX lebih awal dari 0.44, resource berikut disertakan:
serviceaccount/ingress-nginx
configmap/nginx-configuration
configmap/tcp-services
configmap/udp-services
clusterrole.rbac.authorization.k8s.io/ingress-nginx
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx
role.rbac.authorization.k8s.io/ingress-nginx
rolebinding.rbac.authorization.k8s.io/ingress-nginx
service/nginx-ingress-lb
deployment.apps/nginx-ingress-controller
Jika versinya 0.44 atau lebih baru, selain resource di atas, resource berikut juga disertakan:
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission
service/ingress-nginx-controller-admission
serviceaccount/ingress-nginx-admission
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
role.rbac.authorization.k8s.io/ingress-nginx-admission
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
job.batch/ingress-nginx-admission-create
job.batch/ingress-nginx-admission-patch
Saat Anda meningkatkan Controller Ingress NGINX melalui halaman Add-ons di konsol ACK, resource berikut tetap tidak berubah:
configmap/nginx-configuration
configmap/tcp-services
configmap/udp-services
service/nginx-ingress-lb
Semua konfigurasi resource lainnya akan dikembalikan ke nilai default. Misalnya, nilai default replicas pada resource deployment.apps/nginx-ingress-controller adalah 2. Jika Anda mengatur replicas ini ke 5 sebelum meningkatkan Controller Ingress NGINX, nilainya akan kembali ke nilai default 2 setelah peningkatan.
Bagaimana cara beralih dari listener Lapisan 4 ke Lapisan 7?
Secara default, LoadBalancer dari ingress-nginx mendengarkan pada port TCP 80 dan 443. Beralih ke listener Lapisan 7 dengan mengubah protokol menjadi HTTP atau HTTPS.
Layanan Anda akan terganggu sementara saat sistem mengubah listener. Kami merekomendasikan melakukan operasi ini pada jam sepi.
Buat sertifikat dan catat ID sertifikatnya (cert-id). Untuk informasi selengkapnya, lihat Gunakan sertifikat dari Certificate Management Service.
Ubah listener LoadBalancer yang digunakan oleh Ingress dari Lapisan 4 ke Lapisan 7 melalui anotasi.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel navigasi kiri, pilih .
Di bagian atas halaman Services, atur Namespace ke
kube-system. Temukan Serviceingress-nginx-lbdan klik Edit YAML di kolom Actions.Di panel Edit YAML, perbarui
targetPortmenjadi80untuk port bernamahttps(port 443).- name: https port: 443 protocol: TCP targetPort: 80 # Setel targetPort ke 80 untuk port 443.Tambahkan konfigurasi berikut ke field
annotations, lalu klik OK.service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80,https:443" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
Verifikasi hasilnya.
Di halaman Services, temukan Service ingress-nginx-lb dan klik ikon
di kolom Type.Klik tab Listener. Jika
HTTP:80danHTTPS:443keduanya ditampilkan di kolom Frontend Protocol/Port, listener LoadBalancer telah berhasil diubah dari Lapisan 4 ke Lapisan 7.
Bagaimana cara menggunakan instance SLB yang sudah ada dengan ack-ingress-nginx?
Masuk ke Konsol ACK. Di panel navigasi kiri, pilih .
Di tab App Catalog, pilih ack-ingress-nginx atau ack-ingress-nginx-v1 berdasarkan versi kluster Anda:
Jika kluster Anda menjalankan Kubernetes 1.20 atau lebih awal, pilih ack-ingress-nginx.
Jika kluster Anda menjalankan versi Kubernetes setelah 1.20, pilih ack-ingress-nginx-v1.
Terapkan controller Ingress. Untuk instruksi, lihat Terapkan beberapa controller Ingress untuk isolasi trafik.
Di halaman wizard Parameters:
Hapus semua anotasi di bagian controller.service.annotations.

Tambahkan anotasi baru.
Tentukan instance SLB yang ingin Anda gunakan. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}" # Timpa listener. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
Klik OK untuk menerapkan controller Ingress.
Setelah controller Ingress diterapkan, konfigurasikan kelas Ingress untuknya. Untuk instruksi, lihat Terapkan beberapa controller Ingress untuk isolasi trafik.
Bagaimana cara mengumpulkan log akses dari beberapa controller Ingress?
Prasyarat
Logtail telah diinstal di kluster Anda. Secara default, Logtail diinstal saat pembuatan kluster. Jika belum diinstal, lihat Kumpulkan log kontainer dari kluster ACK untuk menginstalnya secara manual.
Pengumpulan log telah diaktifkan untuk controller Ingress default.
Label yang ditambahkan ke pod controller Ingress lainnya telah diperoleh. Untuk informasi selengkapnya, lihat Bagaimana cara memperoleh label dan variabel lingkungan kontainer Docker?
Prosedur:
Masuk ke Konsol ACK. Pada panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster target, lalu klik Cluster Information di panel navigasi kiri.
Di halaman Cluster Information, klik tab Basic Information, lalu klik tautan di sebelah kanan Log Service Project di bagian Cluster Resources.
Di halaman Logstores, buat Logstore. Untuk instruksi, lihat Kelola Logstore. Untuk menghindari pengumpulan log ganda, kami merekomendasikan membuat Logstore terpisah untuk setiap controller Ingress.
Anda dapat memberi nama Logstore berdasarkan nama controller Ingress yang menggunakannya.
Pada pesan yang muncul, klik Data Collection Wizard.
Di dialog Quick Data Import, pilih . Di pesan Note, klik Continue. Di halaman Kubernetes Stdout and Stderr, lakukan langkah-langkah berikut:
Di langkah Create Machine Group, klik Use Existing Machine Groups.
Di langkah Machine Group Configurations, pilih kelompok mesin
k8s-group-<YOUR_CLUSTER_ID>, lalu klik>untuk memindahkan kelompok mesin ke bagian Applied Server Groups. Kemudian, klik Next.Di langkah Logtail Configuration:
Klik Import Other Configuration. Pilih proyek yang digunakan oleh kluster dan konfigurasi
k8s-nginx-ingress. Lalu, klik OK.Di bagian Global Configurations, ubah nama konfigurasi. Aktifkan opsi Container Filtering, tambahkan label kontainer controller Ingress sebagai pasangan kunci-nilai.
Di bagian Processor Configurations, klik Extract Field (Regex Mode) di kolom Processor Name untuk melihat field pemrosesan log.
CatatanJika controller Ingress NGINX yang berbeda menggunakan format log yang berbeda, konfigurasikan kunci field log dan ekspresi reguler yang sesuai.
Di langkah Query and Analysis Configurations, klik Next.
Di langkah End, klik Query Log untuk melihat log yang telah dikumpulkan.
Bagaimana cara mengaktifkan listener TCP untuk nginx-ingress-controller?
Secara default, Ingress hanya meneruskan permintaan HTTP dan HTTPS eksternal ke Service di dalam kluster. Anda dapat mengonfigurasi ingress-nginx untuk mengaktifkan penerusan permintaan TCP eksternal yang diterima pada port TCP yang ditentukan dalam ConfigMap terkait.
Gunakan templat tcp-echo untuk menerapkan Service dan Deployment.
Gunakan templat berikut untuk membuat ConfigMap.
Modifikasi file
tcp-services-cm.yaml, simpan perubahan, lalu keluar.apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "default/tcp-echo:9000" # Konfigurasi ini menunjukkan bahwa permintaan TCP eksternal yang diterima pada port 9000 diteruskan ke Service tcp-echo di namespace default. 9001: "default/tcp-echo:9001"Buat ConfigMap.
kubectl apply -f tcp-services-cm.yaml
Tambahkan port TCP untuk Service yang digunakan oleh
nginx-ingress-controller, lalu simpan perubahan dan keluar.kubectl edit svc nginx-ingress-lb -n kube-systemapiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: allocateLoadBalancerNodePorts: true clusterIP: 192.168.xx.xx ipFamilies: - IPv4 ports: - name: http nodePort: 30xxx port: 80 protocol: TCP targetPort: 80 - name: https nodePort: 30xxx port: 443 protocol: TCP targetPort: 443 - name: tcp-echo-9000 # Nama port. port: 9000 # Nomor port. protocol: TCP # Protokol. targetPort: 9000 # Port tujuan. - name: tcp-echo-9001 # Nama port. port: 9001 # Nomor port. protocol: TCP # Protokol. targetPort: 9001 selector: app: ingress-nginx sessionAffinity: None type: LoadBalancerPeriksa apakah konfigurasi telah berlaku.
Jalankan perintah berikut untuk mengkueri informasi tentang Ingress. Anda dapat memperoleh alamat IP instance SLB yang terkait dengan Ingress.
kubectl get svc -n kube-system| grep nginx-ingress-lbOutput yang diharapkan:
nginx-ingress-lb LoadBalancer 192.168.xx.xx 172.16.xx.xx 80:31246/TCP,443:30298/TCP,9000:32545/TCP,9001:31069/TCPJalankan perintah
ncuntuk mengirimhelloworldke alamat IP yang sesuai dengan port 9000. Jika tidak ada respons yang dikembalikan, konfigurasi telah berlaku.echo "helloworld" | nc <172.16.xx.xx> 9000 echo "helloworld" | nc <172.16.xx.xx> 9001
Bagaimana cara Controller Ingress NGINX mencocokkan sertifikat TLS dengan permintaan?
Dalam resource Ingress Kubernetes, sertifikat TLS didefinisikan di field spec.tls, tetapi hostname yang berlaku ditentukan di field spec.rules.host.
Controller Ingress NGINX memproses aturan ini dan menyimpan pemetaan antara setiap hostname dan sertifikat yang sesuai dalam tabel Lua internal.
Alur Permintaan
Saat klien memulai permintaan HTTPS, klien menyertakan hostname yang diminta dalam ekstensi Server Name Indication (SNI) dari proses jabat tangan TLS.
Controller Ingress NGINX menerima permintaan ini dan menggunakan fungsi
certificate.call()untuk mencari hostname SNI dalam tabel pemetaan Lua-nya.Jika ditemukan sertifikat yang cocok, sertifikat tersebut disajikan kepada klien untuk menyelesaikan proses jabat tangan TLS.
Jika tidak ditemukan sertifikat yang cocok untuk hostname yang diminta, controller menyajikan sertifikat default yang ditandatangani sendiri
fake.
Konfigurasi NGINX terkait yang mengimplementasikan logika ini ditunjukkan di bawah ini:
## Start server _
server {
server_name _ ;
listen 80 default_server reuseport backlog=65535 ;
listen [::]:80 default_server reuseport backlog=65535 ;
listen 443 default_server reuseport backlog=65535 ssl http2 ;
listen [::]:443 default_server reuseport backlog=65535 ssl http2 ;
set $proxy_upstream_name "-";
ssl_reject_handshake off;
ssl_certificate_by_lua_block {
certificate.call()
}
...
}
## Start server www.example.com
server {
server_name www.example.com ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
...
}ingress-nginx mendukung Pengikatan OCSP (Online Certificate Status Protocol), sebuah fitur yang meningkatkan kinerja validasi status sertifikat. Dengan fitur ini diaktifkan, klien tidak perlu lagi menghubungi Certificate Authority (CA) secara langsung untuk memeriksa status pencabutan sertifikat. Hal ini mengurangi waktu validasi sertifikat dan meningkatkan kecepatan koneksi awal secara keseluruhan. Untuk informasi selengkapnya, lihat Konfigurasikan OCSP stapling.
Apa yang harus saya lakukan jika tidak ada sertifikat yang cocok dengan Ingress NGINX?
Error akses HTTPS dapat terjadi jika sertifikat TLS dan kunci privatnya tidak cocok, atau jika nama domain dalam sertifikat tidak sesuai dengan hostname yang digunakan oleh klien. Lakukan operasi berikut untuk troubleshooting masalah ini:
Verifikasi bahwa sertifikat dan kunci privat cocok
Jalankan perintah berikut untuk mengekstrak sertifikat dan kunci privat dari Secret Kubernetes dan membandingkan modulus kriptografinya.
# Ganti <YOUR-SECRET-NAME> dan <SECRET-NAMESPACE> dengan nilai Anda kubectl get secret <YOUR-SECRET-NAME> -n <SECRET-NAMESPACE> -o jsonpath='{.data.tls\.crt}' | base64 -d > /tmp/tls.crt && \ # Ganti <YOUR-SECRET-NAME> dengan Secret yang Anda gunakan. kubectl get secret <YOUR-SECRET-NAME> -n <SECRET-NAMESPACE> -o jsonpath='{.data.tls\.key}' | base64 -d > /tmp/tls.key && \ # Hitung dan bandingkan hash MD5 modulus untuk sertifikat dan kunci openssl x509 -noout -modulus -in /tmp/tls.crt | openssl md5 && \ openssl rsa -noout -modulus -in /tmp/tls.key | openssl md5Perintah di atas mengekstrak dan mendekode sertifikat serta kunci, menyimpannya ke
/tmp/tls.crtdan/tmp/tls.keymasing-masing. Perintahopensslkemudian menghitung hash MD5 dari modulus publik untuk kedua file tersebut.Jika dua nilai hash yang dihasilkan tidak identik, artinya sertifikat dan kunci privat tidak cocok. Untuk memperbaikinya, Anda harus memperbarui Secret dengan pasangan kunci yang valid dan cocok.
Verifikasi bahwa sertifikat cocok dengan nama domain
Jalankan perintah berikut untuk memeriksa isi sertifikat dan memeriksa nama domain yang dicakupnya.
kubectl get secret <YOUR-SECRET-NAME> -n <SECRET-NAMESPACE> -o jsonpath={.data."tls\.crt"} | base64 -d | openssl x509 -text -nooutTinjau output dari perintah dan periksa:
Subject: Cari field Common Name (CN), yang akan berformat mirip
CN = example.com.Subject Alternative Name (SAN): Cari entri
DNS:.
Jika hostname yang Anda gunakan untuk mengakses layanan tidak tercantum di field
CNatau entri SAN, artinya sertifikat tersebut tidak valid untuk domain tersebut. Untuk mengatasinya, Anda harus memperoleh dan mengonfigurasi sertifikat baru yang mencakup hostname yang benar.
Apa yang harus saya lakukan jika pod NGINX gagal pemeriksaan kesehatan di bawah trafik tinggi?
Latar Belakang
Pemeriksaan kesehatan untuk Controller Ingress NGINX bekerja dengan mengakses path /healthz, yang diekspos oleh proses NGINX pada port 10246. Pemeriksaan ini memverifikasi bahwa proses NGINX sehat dan layanan berjalan dengan benar.
Gejala
Saat pemeriksaan kesehatan gagal, Anda akan melihat entri log seperti berikut, yang menunjukkan bahwa endpoint healthz tidak dapat dijangkau:
I0412 11:01:52.581960 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:01:55 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:01:55.895683 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:02.582247 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:05 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:05.896126 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:12.582687 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:15 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:15.895719 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:22.582516 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:25 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:25.896955 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:28.983016 7 nginx.go:408] "NGINX process has stopped"
I0412 11:02:28.983033 7 sigterm.go:44] Handled quit, delaying controller exit for 10 seconds
I0412 11:02:32.582587 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:35 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:35.895853 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:38.986048 7 sigterm.go:47] "Exiting" code=0Penyebab
Di bawah trafik tinggi, proses worker NGINX dapat menjadi kelebihan beban, menyebabkan penggunaan CPU sangat tinggi (kadang-kadang mendekati 100%). Saat sistem berada di bawah tekanan sebesar ini, sistem mungkin tidak memiliki cukup sumber daya untuk merespons probe pemeriksaan kesehatan secara tepat waktu, sehingga menyebabkan kegagalan.
Solusi
Solusi yang direkomendasikan adalah meningkatkan jumlah replika pod untuk Controller Ingress NGINX. Hal ini akan mendistribusikan beban trafik ke beberapa pod, mengurangi tekanan CPU pada setiap instance dan memungkinkan pemeriksaan kesehatan berhasil.
Apa yang harus saya lakukan jika cert-manager gagal menerbitkan sertifikat?
Masalah ini dapat terjadi saat Web Application Firewall (WAF) diaktifkan. WAF dapat mencegat atau memblokir permintaan HTTP01 yang digunakan cert-manager untuk memverifikasi kepemilikan domain, yang mencegah proses penerbitan sertifikat selesai dengan sukses.
Untuk mengatasinya, nonaktifkan sementara WAF untuk memungkinkan tantangan HTTP-01 berhasil.
Sebelum menonaktifkan WAF Anda, Anda harus sepenuhnya mengevaluasi implikasi keamanan potensial untuk menghindari mengekspos aplikasi Anda terhadap risiko yang tidak perlu.
Mengapa NGINX menggunakan banyak memori di bawah trafik tinggi?
Gejala
Di bawah beban trafik tinggi, Anda mengamati bahwa penggunaan memori Controller Ingress NGINX meningkat secara signifikan, yang akhirnya menyebabkan kejadian Out-of-Memory (OOM).
Penyebab
Jika Anda memeriksa pod dan menemukan bahwa proses controller mengonsumsi banyak memori, masalahnya kemungkinan adalah kebocoran memori yang terkait dengan pengumpulan metrik Prometheus.
Ini adalah masalah yang diketahui pada Controller Ingress NGINX versi 1.6.4, sering dikaitkan dengan metrik berdimensi tinggi seperti nginx_ingress_controller_ingress_upstream_latency_seconds.
Solusi
Tingkatkan Controller Ingress NGINX ke versi terbaru, yang berisi perbaikan untuk masalah ini. Saat mengonfigurasi Ingress NGINX untuk lingkungan bertrafik tinggi, berikan perhatian khusus pada metrik yang dapat berdampak signifikan pada penggunaan memori.
Untuk detail selengkapnya, lihat sumber daya komunitas berikut:
Apa yang harus saya lakukan jika Controller Ingress NGINX berada dalam status peningkatan yang macet?
Gejala
Saat melakukan peluncuran bertahap (peningkatan canary) Controller Ingress NGINX, prosesnya macet di fase validasi dan Anda tidak dapat melanjutkan. Anda mungkin melihat pesan error seperti: Operation is forbidden for task in a failed state.
Penyebab
Masalah ini biasanya terjadi ketika tugas peningkatan add-on secara otomatis dibersihkan oleh sistem karena telah melebihi periode kedaluwarsa 4 hari yang telah ditentukan. Saat hal ini terjadi, Anda harus mengatur ulang status deployment add-on secara manual untuk menyelesaikan masalah.
Catatan: Jika add-on telah mencapai fase Released akhir dari peningkatan, tidak diperlukan tindakan apa pun. Cukup tunggu hingga tugas saat ini habis waktu dan berhenti secara otomatis.
Prosedur
Ikuti langkah-langkah berikut untuk mengatur ulang Deployment dan memungkinkan peningkatan dilanjutkan.
Jalankan perintah berikut untuk membuka manifes
Deploymentuntuk diedit:kubectl edit deploy -n kube-system nginx-ingress-controllerDi editor, cari field berikut di bawah bagian
specdan kembalikan ke nilai default seperti yang ditunjukkan di bawah:spec.minReadySeconds: 0spec.progressDeadlineSeconds: 600spec.strategy.rollingUpdate.maxSurge: 25%spec.strategy.rollingUpdate.maxUnavailable: 25%

Simpan perubahan dan keluar dari editor.
Hasil yang diharapkan
Setelah Anda menyimpan perubahan, peningkatan add-on akan dilanjutkan secara otomatis, dan pod lama akan diganti untuk menyelesaikan peluncuran bertahap.
Meskipun peningkatan akan selesai dengan sukses di latar belakang, status add-on di halaman Add-ons di konsol ACK mungkin tetap macet di status Upgrading. Masalah tampilan ini biasanya akan teratasi sendiri secara otomatis setelah sekitar dua minggu.
Mengapa encoding transfer chunked (Transfer-Encoding: chunked) berhenti berfungsi sejak versi controller 1.10?
Gejala
Aplikasi Anda menyetel header HTTP Transfer-Encoding: chunked, dan Anda melihat error di log controller terkait header duplikat.
Penyebab
Hal ini terkait dengan pembaruan versi NGINX yang mendasari yang digunakan oleh controller mulai dari v1.10 (lihat log pembaruan NGINX). Versi NGINX yang lebih baru menerapkan validasi yang lebih ketat terhadap respons HTTP. Jika layanan backend mengembalikan beberapa header Transfer-Encoding: chunked, NGINX sekarang menganggap respons tersebut tidak valid.
Solusi
Pastikan layanan backend Anda hanya mengembalikan satu header Transfer-Encoding: chunked. Untuk detail selengkapnya, lihat GitHub Issue #11162.
Bagaimana cara mengonfigurasi daftar izin/daftar larang IP untuk kontrol akses?
Ingress NGINX mendukung kontrol akses berbasis IP menggunakan anotasi pada resource Ingress atau pasangan kunci-nilai di ConfigMap global.
ConfigMap: Berlaku secara global untuk semua Ingress.
Anotasi Ingress: Hanya berlaku untuk resource Ingress tertentu.
Anotasi pada resource Ingress akan selalu mengambil prioritas dibandingkan pengaturan ConfigMap global.
Gunakan anotasi berikut dalam manifes Ingress Anda:
Anotasi | Deskripsi |
| Daftar izin berisi alamat IP klien atau blok CIDR. Beberapa nilai dapat diberikan, dipisahkan dengan koma (,). |
| Daftar larang alamat IP klien atau blok CIDR. Beberapa nilai dapat diberikan, dipisahkan dengan koma (,). |
Untuk informasi selengkapnya, lihat dokumentasi resmi untuk Denylist Source Range dan Whitelist Source Range.
Masalah yang diketahui pada Ingress NGINX v1.2.1 dengan defaultBackend
Gejala
Mengonfigurasi defaultBackend dalam resource Ingress dapat secara salah menimpa pengaturan defaultBackend dari server default.
Solusi
Ini adalah masalah yang diketahui (lihat GitHub Issue #8823). Untuk mengatasinya, kami merekomendasikan menaikkan versi Controller Ingress NGINX ke versi 1.3 atau yang lebih baru. Untuk instruksi, lihat Tingkatkan Controller Ingress NGINX.
Mengapa saya mendapatkan error Connection reset by peer saat menggunakan curl?
Gejala
Saat menggunakan curl untuk mengakses layanan publik eksternal melalui HTTP, Anda menerima error: curl: (56) Recv failure: Connection reset by peer.
Penyebab
Hal ini biasanya terjadi ketika permintaan HTTP teks biasa berisi kata kunci yang ditandai sebagai sensitif oleh perantara jaringan, menyebabkan koneksi diblokir atau direset.
Solusi
Konfigurasikan sertifikat TLS untuk rute Ingress Anda dan gunakan HTTPS untuk semua komunikasi guna memastikan trafik dienkripsi.
Bagaimana cara kerja prioritas pencocokan path?
Path ekspresi reguler NGINX dievaluasi sesuai urutan definisinya, dan pencocokan pertama yang ditemukan digunakan. Untuk mengaktifkan pencocokan path yang lebih tepat, ingress-nginx pertama-tama mengurutkan semua path secara menurun berdasarkan panjangnya, lalu menuliskannya sebagai blok location di file nginx.conf.
Untuk penjelasan mendetail, lihat dokumentasi resmi Ingress Path Matching.
Mengapa permintaan non-idempoten tidak dicoba ulang?
Mulai dari versi 1.9.13, NGINX tidak akan mencoba ulang permintaan non-idempoten (POST, LOCK, dan PATCH) saat terjadi error.
Untuk mengembalikan perilaku sebelumnya, atur retry-non-idempotent: "true" di ConfigMap nginx-configuration.
Bagaimana cara mendukung permintaan dengan header atau cookie klien yang besar?
Gejala
Saat mengakses layanan Anda melalui Ingress NGINX, Anda menerima error 400 Bad Request dengan pesan Request Header Or Cookie Too Large.
Penyebab
Error ini terjadi ketika ukuran header atau cookie permintaan klien melebihi ukuran buffer default yang dikonfigurasi di Nginx.
Solusi
Tingkatkan ukuran buffer terkait. Dua parameter utama adalah:
client-header-buffer-size: Ukuran buffer untuk header permintaan klien. Default-nya adalah
1k.large-client-header-buffers: Jumlah maksimum dan ukuran buffer untuk membaca header permintaan klien yang besar. Default-nya adalah
4 8k.
Ubah parameter ini dengan mengedit ConfigMap nginx-configuration:kubectl edit cm -n kube-system nginx-configuration
Contoh:
client-max-body-size: "16k"
large-client-header-buffers: "4 32k" Setelah menerapkan perubahan, verifikasi bahwa perubahan tersebut telah berlaku di konfigurasi NGINX. Anda dapat memeriksa file nginx.conf di dalam salah satu pod controller Ingress:kubectl exec <nginx-ingress-pod> -n kube-system -- cat /etc/nginx/nginx.conf
Mengapa path Exact atau Prefix saya masih diperlakukan sebagai ekspresi reguler?
Jika salah satu aturan Ingress untuk host tertentu menggunakan anotasi use-regex atau rewrite-target, semua path di bawah host yang sama akan dipaksa menggunakan pencocokan ekspresi reguler case-insensitive. Ini adalah logika implementasi saat ini dari Controller Ingress NGINX. Untuk informasi selengkapnya, lihat Dokumentasi komunitas.

Mengapa webhook validasi merespons lambat saat menambahkan Ingress di kluster dengan banyak Ingress?
Ini adalah masalah kinerja yang diketahui pada Controller Ingress NGINX V1.12 dan sebelumnya. Webhook validasi melakukan pemeriksaan penuh terhadap semua Ingress yang ada, yang bisa lambat di lingkungan besar. Lihat #11115.
Solusi:
Opsi 1: Tingkatkan timeout webhook
Jika Anda dapat mentolerir waktu respons yang lebih lama dan tidak ingin menggunakan validasi inkremental, tingkatkan timeout untuk webhook validasi. Default-nya adalah10s.Tindakan: Edit objek
validatingwebhookconfigurationsbernamaingress-nginx-admissiondan tingkatkan nilaitimeoutSeconds(maksimum30s).Peringatan: Nilai ini akan ditimpa selama peningkatan add-on.
Opsi 2: Aktifkan validasi inkremental
UbahDeploymentController Ingress NGINX untuk menambahkan argumen startup--disable-full-test=true.Efek: Dengan flag ini, webhook hanya akan melakukan validasi inkremental pada aturan Ingress baru. Hal ini secara signifikan meningkatkan kecepatan validasi tetapi tidak akan mendeteksi konflik antara resource Ingress yang berbeda.
Catatan tentang penggunaan snippet
Masalah
Jika Anda mengonfigurasi anotasi server-snippet untuk domain yang sama di beberapa resource Ingress, Anda mungkin menemui peringatan di log, dan hanya snippet pertama yang diterapkan. Hal ini dapat menyebabkan perilaku yang tidak terduga.
Contoh peringatan log:
W0619 14:58:49.323721 7 controller.go:1314] Server snippet already configured for server "test.example.com", skipping (Ingress "default/test.example.com")
W0619 14:58:49.323727 7 controller.go:1314] Server snippet already configured for server "test.example.com", skipping (Ingress "default/test.example.com")
W0619 14:58:49.323734 7 controller.go:1314] Server snippet already configured for server "test.example.com", skipping (Ingress "default/test.example.com")Peringatan ini menunjukkan bahwa snippet untuk test.example.com telah didefinisikan, dan definisi berikutnya dari resource Ingress lainnya diabaikan.
Mengapa sertifikat TLS yang saya konfigurasikan di Secret tidak berfungsi?
Periksa log controller
Periksa log pod Controller Ingress NGINX Anda untuk error terkait sertifikat.
kubectl -n kube-system logs <nginx-ingress-controller-pod-name> | grep "Error getting SSL certificate"Jika Anda melihat error seperti di bawah, hal ini menunjukkan masalah memuat Secret sertifikat Anda (di mana xxxx adalah nama Secret Anda).
Error getting SSL certificate "xxxx": local SSL certificate xxxx tls was not found. Using default certificateError ini dapat memiliki tiga penyebab utama:
Penyebab 1: Secret tidak ada
Verifikasi bahwa Secret yang disebutkan dalam pesan log benar-benar ada di namespace yang benar.
Penyebab 2: Sertifikat dan kunci privat tidak cocok
tls.crt (kunci publik) dan tls.key (kunci privat) yang disimpan di Secret harus merupakan pasangan yang cocok.
Jika Anda mencoba membuat Secret
tlsdengan pasangan yang tidak cocok menggunakankubectl create secret tls, perintah tersebut akan gagal dengan error:error: tls: private key does not match public keyUntuk memeriksa Secret yang sudah ada terhadap ketidakcocokan, jalankan skrip berikut:
export SECRET_NAME=<Your Secret Name> export NAME_SPACE=<Your Secret Namespace> diff <(kubectl get secret $SECRET_NAME -n $NAME_SPACE -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -modulus | openssl md5) <(kubectl get secret $SECRET_NAME -n $NAME_SPACE -o jsonpath='{.data.tls\.key}' | base64 -d | openssl rsa -noout -modulus | openssl md5) && echo "Certificate and Key match" || echo "Certificate and Key do not match"Perintah ini membandingkan modulus sertifikat dan kunci. Jika kunci dan sertifikat tidak cocok, output akan menunjukkan dua nilai hash yang berbeda dan pesan
Certificate and Key do not match. Anda harus memperbarui Secret dengan pasangan kunci yang valid.root@Aliyun ~/ssl # export SECRET_NAME=test root@Aliyun ~/ssl # export NAME_SPACE=default root@Aliyun ~/ssl # diff <(kubectl get secret $SECRET_NAME -n $NAME_SPACE -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -modulus | openssl md5) <(kubectl get secret $SECRET_NAME -n $NAME_SPACE -o jsonpath='{.data.tls\.key}' | base64 -d | openssl rsa -noout -modulus | openssl md5) && echo "Certificate and Key match" || echo "Certificate and Key do not match" 1c1 < (stdin)= 66a309089e87e32d1b6fe361ebf8cd88 --- > (stdin)= 12e15c5fe35585b6fd9920abc8e8706d Certificate and Key do not match
Penyebab 3: Entri TLS yang salah dikonfigurasi di Ingress lain untuk domain yang sama
Jika Anda telah mendefinisikan bagian tls untuk domain yang sama di beberapa resource Ingress, error pada salah satu konfigurasi tersebut dapat mencegah sertifikat dimuat dengan benar. Tinjau semua resource Ingress yang mereferensikan domain tersebut dan perbaiki konfigurasi yang salah.
Mengapa saya masih menerima peringatan kedaluwarsa sertifikat setelah memperbarui sertifikat saya?
Penyebab
Versi lama Controller Ingress NGINX memiliki bug yang diketahui di mana metrik nginx_ingress_controller_ssl_expire_time_seconds tidak diperbarui atau dibersihkan dengan benar setelah sertifikat diperbarui. Hal ini dapat menyebabkan sistem pemantauan terus memicu peringatan certificate expired berdasarkan data lama.
Solusi
Untuk membersihkan metrik lama, Anda harus melakukan restart bergulir pod Controller Ingress NGINX.
Kami sangat merekomendasikan meningkatkan Controller Ingress NGINX ke versi 1.11.4 atau yang lebih baru, karena masalah ini telah diselesaikan di versi yang lebih baru.
Bagaimana saya dapat menemukan konfigurasi default untuk versi Controller Ingress NGINX tertentu?
Nilai default untuk parameter konfigurasi berubah antar versi Controller Ingress NGINX. Misalnya, use-gzip diaktifkan secara default di versi 0.35.0 dan sebelumnya, tetapi dinonaktifkan secara default di versi 1.11.4.
Untuk menemukan perilaku default untuk parameter tertentu di versi tertentu, konsultasikan file configmap.md di cabang versi yang sesuai dari dokumentasi resmi.
Contoh: Untuk controller-v1.8.0, gunakan pemilih versi di sisi kiri halaman untuk beralih ke versi lain.
