Anda mungkin perlu mengubah konfigurasi Nginx Ingress Controller untuk berbagai skenario bisnis. Topik ini menjelaskan praktik terbaik untuk membantu Anda mengonfigurasi Nginx Ingress Controller guna mencapai kinerja optimal.
Indeks
Tingkatkan kinerja dan stabilitas Nginx Ingress Controller
Gunakan jumlah replika dan batas sumber daya yang sesuai
Secara default, jumlah replika Nginx Ingress Controller adalah 2, baik saat dibuat bersama kluster maupun diinstal dari pusat komponen. Anda dapat menyesuaikan jumlah replika sesuai kebutuhan. Pastikan Nginx Ingress Controller didistribusikan di node yang berbeda untuk mencegah persaingan sumber daya dan titik kegagalan tunggal. Anda juga dapat menggunakan node khusus untuk Nginx Ingress Controller guna memastikan kinerja dan stabilitas. Untuk informasi selengkapnya, lihat Gunakan node khusus untuk meningkatkan kinerja dan stabilitas Nginx Ingress. Kami menyarankan agar Anda tidak menetapkan batas sumber daya untuk Nginx Ingress Controller guna mencegah gangguan lalu lintas akibat kesalahan kehabisan memori (OOM). Jika Anda harus menetapkan batas sumber daya, kami menyarankan agar Anda menetapkan batas CPU minimal 1.000 millicore dan batas memori minimal 2 GiB.
Gunakan node khusus untuk meningkatkan kinerja dan stabilitas Nginx Ingress
Jika Anda memiliki persyaratan stabilitas tinggi untuk Ingress Controller, Anda dapat menetapkan node khusus untuknya guna mencegah persaingan sumber daya. Untuk informasi selengkapnya, lihat Menyebarkan Nginx Ingress Controller dengan ketersediaan tinggi.
Untuk skenario muatan tinggi, Anda juga dapat mengonfigurasi Ingress Controller agar mendukung aplikasi berbeban tinggi. Untuk informasi selengkapnya, lihat Mengonfigurasi Nginx Ingress Controller untuk skenario muatan tinggi.
Optimalkan kinerja Nginx Ingress
Optimasi kinerja Nginx Ingress Controller mencakup optimasi parameter sistem dan optimasi parameter Nginx:
Optimasi parameter sistem: Sistem operasi di Alibaba Cloud telah mengoptimalkan beberapa parameter umum secara default. Parameter sistem lain yang perlu dioptimalkan meliputi backlog sistem maksimum dan rentang maksimum port yang tersedia. Setelah mengoptimalkan parameter sistem, Nginx dapat menangani permintaan konkurensi tinggi dan koneksi backend tidak akan gagal karena kehabisan port.
Optimasi parameter Nginx:
Sesuaikan jumlah maksimum koneksi untuk satu worker guna memastikan Nginx Ingress Controller dapat menangani permintaan konkurensi tinggi.
Tingkatkan periode timeout koneksi: Secara default, Nginx Ingress Controller menggunakan koneksi persisten untuk mengirim permintaan ke Pod aplikasi backend. Untuk memungkinkan satu koneksi memproses lebih banyak permintaan dan mengurangi overhead koneksi, Anda perlu meningkatkan periode timeout koneksi.
Tetapkan periode timeout koneksi persisten: Pastikan periode timeout koneksi persisten layanan backend tidak lebih pendek daripada periode timeout Nginx Ingress Controller. Nilai defaultnya adalah 900 detik di kluster ACK.
Komponen Nginx Ingress telah dilengkapi optimasi bawaan yang memberikan kinerja optimal di sebagian besar skenario. Jika Anda memiliki persyaratan khusus, Anda dapat lebih lanjut mengoptimalkan parameter sistem dan parameter Nginx menggunakan bidang terkait dalam ConfigMap. Untuk informasi selengkapnya tentang ConfigMap, lihat ConfigMap.
Konfigurasikan HPA untuk melakukan penskalaan otomatis Nginx Ingress Controller
Dalam sebagian besar kasus, Nginx Ingress Controller dapat menangani lonjakan lalu lintas. Jika Nginx Ingress Controller tidak memenuhi kebutuhan Anda dalam skenario muatan tinggi, Anda dapat mengonfigurasi Horizontal Pod Autoscaler (HPA) untuk melakukan penskalaan otomatis terhadap Nginx Ingress Controller. Untuk informasi selengkapnya, lihat Menggunakan Horizontal Pod Autoscaling (HPA).
Penskalaan Pod dapat mengganggu beberapa koneksi layanan. Konfigurasikan HPA dengan hati-hati.
Kode berikut menyediakan contoh file YAML:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-ingress-controller-hpa
namespace: kube-system
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-ingress-controller
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50Konfigurasikan preStop hook yang tepat untuk layanan backend
Saat pembaruan bergulir (rolling update) layanan backend, Nginx Ingress Controller menghapus endpoint Pod yang sedang dihentikan dan mempertahankan koneksi untuk permintaan yang sedang diproses. Jika Pod layanan backend langsung keluar setelah menerima sinyal penghentian, permintaan yang sedang diproses mungkin gagal. Karena masalah waktu, sebagian lalu lintas mungkin masih diteruskan ke Pod yang telah dihentikan, sehingga menyebabkan kehilangan lalu lintas.
Untuk mencegah kehilangan lalu lintas selama pembaruan bergulir, kami menyarankan agar Anda mengonfigurasi preStop hook pada Pod layanan backend. Dengan cara ini, Pod tetap berjalan selama periode tertentu setelah endpoint-nya dihapus, sehingga mencegah gangguan lalu lintas.
Tambahkan konten berikut ke konfigurasi kontainer dalam templat Pod:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
lifecycle:
# Konfigurasikan preStop hook untuk menunggu selama 30 detik sebelum keluar.
# Perintah sleep harus ada di dalam kontainer.
preStop:
exec:
command:
- sleep
- 30Tingkatkan observabilitas Nginx Ingress Controller
Gunakan SLS dan Alibaba Cloud Prometheus untuk meningkatkan observabilitas
Nginx Ingress Controller menyediakan dasbor berdasarkan log Simple Log Service (SLS) dan pemantauan Prometheus untuk membantu Anda lebih memahami lalu lintas layanan.
Log SLS:
Jika Anda mengaktifkan komponen log dan Dasbor Ingress saat membuat kluster, Anda dapat melihat dasbor yang disediakan oleh Simple Log Service di bagian Nginx Ingress Overview pada halaman di Konsol Manajemen Container Service. Anda juga dapat langsung melihat log yang dihasilkan oleh Nginx Ingress Controller di . Untuk informasi selengkapnya, lihat Analisis dan Pemantauan Log Akses Nginx Ingress.
Jika Anda tidak memilih opsi log dan Ingress saat membuat kluster, Anda dapat mengonfigurasi komponen dan aturan pengumpulan log secara manual. Untuk informasi selengkapnya, lihat Analisis dan pantau log akses Nginx Ingress. Untuk informasi selengkapnya tentang pemantauan, lihat Pemantauan Dasbor Ingress.
Alibaba Cloud Prometheus Pemantauan: Anda dapat menginstal Alibaba Cloud Prometheus Pemantauan saat membuat kluster, atau menginstal/melihatnya di halaman setelah membuat kluster. Untuk informasi selengkapnya, lihat Menggunakan Alibaba Cloud Prometheus untuk pemantauan.
CatatanSaat menggunakan Alibaba Cloud Prometheus Pemantauan, tambahkan bidang
hostke sumber daya Ingress di kluster. Jika tidak, beberapa metrik Ingress tidak dikumpulkan secara default. Anda juga dapat menambahkan--metrics-per-host=falseke parameter startupcontrollerdalam deployment Nginx Ingress Controller untuk mengatasi masalah ini.
Fitur lanjutan Nginx Ingress Controller
Gunakan beberapa Nginx Ingress Controller
Pada beberapa aplikasi, Anda mungkin perlu menyebarkan beberapa Nginx Ingress Controller dalam satu kluster untuk tujuan seperti mengisolasi jaringan publik dan pribadi. Untuk informasi selengkapnya, lihat Menyebarkan beberapa controller Ingress.
Akses Nginx Ingress Controller dari dalam kluster
Dalam kluster, lalu lintas ke alamat IP eksternal layanan LoadBalancer, yaitu Alamat IP publik Nginx Ingress Controller, biasanya dirutekan oleh iptables atau IPVS. Jika externalTrafficPolicy diatur ke Local dan tidak ada Pod Nginx Ingress yang sesuai di node tersebut, maka terjadi kegagalan koneksi jaringan. Secara default, Nginx Ingress Controller di kluster ACK menggunakan layanan LoadBalancer dalam mode Local. Oleh karena itu, kegagalan koneksi jaringan mungkin terjadi saat Anda mengakses alamat SLB yang terikat ke Nginx Ingress Controller dari dalam kluster. Kami menyarankan agar Anda menggunakan Service ClusterIP atau nama domain internal (nginx-ingress-lb.kube-system) untuk mengakses Nginx Ingress Controller. Jangan mengakses Nginx Ingress Controller dari dirinya sendiri. Hal ini juga dapat menyebabkan kegagalan koneksi jaringan akibat masalah hairpin. Untuk informasi selengkapnya tentang solusi masalah ini, lihat Gagal mengakses alamat SLB yang diekspos oleh layanan LoadBalancer di kluster Kubernetes.
Gunakan WAF
Untuk memblokir permintaan berbahaya, Anda dapat mengaktifkan WAF untuk Instance SLB yang digunakan oleh Nginx Ingress Controller kluster. Saat Anda mengaktifkan WAF pada port HTTPS, Anda harus mengonfigurasi sertifikat yang akan digunakan di konsol. Dalam kasus ini, masalah berikut mungkin terjadi:
Permintaan TLS dihentikan di WAF. Oleh karena itu, sertifikat yang dikonfigurasi menggunakan Secrets di kluster tidak diekspos di egress Internet.
Mengakses port 443 menggunakan alamat IP SLB atau Service ClusterIP dari dalam kluster mungkin tidak melewati WAF, sehingga menyebabkan kesalahan sertifikat.
Jika WAF diaktifkan, Nginx Ingress Controller tidak dapat mengambil alamat IP klien asli secara default. Anda dapat menambahkan konten berikut ke ConfigMap untuk mengaktifkan modul Nginx Realip dan menggunakan header
X-Forwarded-Forsebagai alamat IP klien asli. Untuk Nginx Ingress Controller yang diinstal menggunakan manajemen komponen, ConfigMap default-nya adalah nginx-configuration di namespace kube-system.use-forwarded-headers: "true" # Gunakan opsi ini untuk versi 0.30.0 dan sebelumnya. enable-real-ip: "true" # Gunakan opsi ini untuk versi 0.44.0 dan seterusnya. proxy-real-ip-cidr: <Blok CIDR alamat IP sumber yang Anda peroleh dari WAF>
Gunakan Nginx Ingress Controller untuk penyebaran biru-hijau atau rilis bertahap aplikasi
Anda dapat menggunakan fitur rilis bertahap di Konsol Container Service for Kubernetes (ACK) atau menambahkan anotasi secara manual untuk menggunakan fitur rilis bertahap yang disediakan oleh Nginx Ingress Controller. Untuk informasi selengkapnya, lihat Menggunakan Nginx Ingress untuk menerapkan rilis bertahap dan penyebaran biru-hijau.
Pastikan bahwa layanan yang akan dirilis secara bertahap, termasuk layanan asli dan layanan rilis bertahap, tidak direferensikan oleh sumber daya Ingress selain Ingress rilis bertahap. Jika tidak, konflik aturan rilis bertahap mungkin terjadi dan menyebabkan kesalahan perutean lalu lintas.
Gunakan Nginx Ingress Controller untuk meneruskan permintaan non-HTTP
Secara default, Nginx Ingress Controller menggunakan HTTP untuk terhubung ke layanan backend. Nginx Ingress Controller juga mendukung berbagai protokol backend, seperti WebSocket, HTTPS, dan gRPC. Untuk informasi selengkapnya tentang protokol backend yang didukung, lihat Protokol Backend.
WebSocket: Nginx Ingress Controller menyediakan dukungan native untuk WebSocket. Anda tidak perlu melakukan konfigurasi apa pun untuk meneruskan koneksi WebSocket. Jika Anda memiliki koneksi WebSocket berdurasi panjang, Anda dapat menyesuaikan periode timeout koneksi backend menggunakan anotasi untuk mencegah pemutusan layanan akibat timeout. Untuk informasi selengkapnya tentang cara menyesuaikan periode timeout, lihat Timeout kustom.
HTTPS: Untuk layanan backend yang menggunakan HTTPS, Anda dapat menambahkan anotasi
nginx.ingress.kubernetes.io/backend-protocol:"HTTPS"ke Ingress untuk beralih ke koneksi HTTPS.gRPC: gRPC hanya dapat diakses melalui port TLS. Oleh karena itu, pastikan Anda menggunakan port TLS terenkripsi saat mengakses layanan gRPC melalui Nginx Ingress Controller. Untuk informasi selengkapnya tentang cara mengonfigurasi gRPC, lihat Menyebarkan layanan gRPC di backend Nginx Ingress Controller.