All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan NGINX Ingress controller untuk beban tinggi

Last Updated:Jun 19, 2026

Sediakan node khusus, konfigurasikan autoscaling, dan sesuaikan parameter NGINX agar dapat menangani trafik puncak.

Penting
  • Karena proyek open-source Ingress NGINX tidak akan lagi dipelihara setelah Maret 2026, Container Service for Kubernetes akan menghentikan pemeliharaan komponen NGINX Ingress controller. Harap waspada terhadap risiko yang terkait. Lihat Pengumuman Produk: Penghentian pemeliharaan komponen NGINX Ingress controller.

  • Konfigurasi berikut hanya sebagai referensi. Pilih parameter dan spesifikasi berdasarkan beban aktual NGINX Ingress controller Anda.

Pastikan sumber daya komponen mencukupi

Deploy pada kelompok node khusus

Kelompok node khusus mengisolasi NGINX Ingress controller dari beban kerja lain, sehingga mencegah konflik sumber daya.

Penting

Menetapkan resources.limits untuk Pod NGINX Ingress controller dapat memicu error OOM akibat pembatasan memori atau menyebabkan gangguan layanan dan jitter akibat pembatasan kecepatan CPU. Jangan konfigurasikan batas sumber daya. Jika harus, atur CPU minimal 1 core dan memori minimal 2 GiB.

Buat kelompok node khusus

Buat kelompok node khusus untuk Pod NGINX Ingress controller. Perhatikan hal-hal berikut:

  • Pilih tipe instans: Performa jaringan Pod dibatasi oleh tipe instans node host. Misalnya, jika PPS sebuah node adalah 300.000, maka PPS maksimum per Pod juga 300.000. Pilih instans yang dioptimalkan untuk jaringan dengan minimal 32 core CPU.

  • Jumlah node: NGINX Ingress controller secara default mendeploy dua Pod dengan anti-affinity, sehingga kelompok node memerlukan minimal dua node.

  • Konfigurasikan taint dan label: Tambahkan taint dan label untuk mencegah Pod lain dijadwalkan ke node ini. Contohnya, tambahkan system-addon: nginx-ingress sebagai taint dan label, dengan Effect diatur ke NoSchedule.

  • Pilih ukuran Pod: Karena overhead dasar NGINX, satu Pod ber-spesifikasi tinggi (misalnya, 32 core) memberikan performa lebih baik daripada beberapa Pod ber-spesifikasi rendah (misalnya, dua Pod 16-core) dengan total sumber daya yang sama. Lebih baik gunakan jumlah Pod lebih sedikit dengan spesifikasi tinggi sambil tetap menjaga ketersediaan tinggi.

Konfigurasikan komponen

Masuk ke ACK console. Pada halaman Add-ons, temukan kartu NGINX Ingress controller lalu klik Configuration.

  1. Pada NodeSelector, tambahkan label dari kelompok node khusus.

    Jangan hapus label NodeSelector yang sudah ada.
  2. Pada Tolerations, tambahkan taint dari kelompok node khusus dan atur Effect menjadi NoSchedule.

  3. Klik Confirm, lalu verifikasi bahwa Pod dijadwalkan ke kelompok node khusus.

Sesuaikan spesifikasi instans CLB

Spesifikasi instans CLB menentukan jumlah koneksi maksimum dan QPS untuk NGINX Ingress controller. Gunakan instans ber-spesifikasi tinggi.

Edit Service untuk menentukan spesifikasi instans CLB menggunakan anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec:

kubectl edit service -n kube-system nginx-ingress-lb
apiVersion: v1
kind: Service
metadata:
  annotations:
    ...
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s3.large" # Tentukan spesifikasi instans CLB
  name: nginx-ingress-lb
  namespace: kube-system
  ...
spec:
  ...
Hanya instans CLB berbasis spesifikasi yang dibuat sebelum Juni 2025 yang mendukung operasi ini. Lihat Spesifikasi performa.

Gunakan HPA untuk autoscaling

Jika Pod pada kelompok node khusus tidak mampu menyerap lonjakan trafik, konfigurasikan HPA untuk melakukan autoscaling pada NGINX Ingress controller.

Penting

Penskalaan masuk (scale-in) Pod dapat mengganggu beberapa koneksi aktif. Konfigurasikan kebijakan penskalaan masuk Anda dengan hati-hati.

Simpan konten berikut sebagai nginx-hpa.yaml dan terapkan dengan kubectl apply -f nginx-hpa.yaml:

apiVersion: autoscaling/v2
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
      target:
        type: Utilization
        averageUtilization: 50

Pastikan shutdown yang mulus untuk beban kerja backend

Saat pembaruan rolling, NGINX Ingress controller mempertahankan koneksi yang sedang berlangsung ke Pod yang sedang dihentikan. Jika Pod langsung keluar, permintaan tersebut akan gagal.

Panggilan balik preStop membuat Pod tetap berjalan setelah menerima sinyal SIGTERM, sehingga memungkinkan permintaan yang sedang berlangsung selesai:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        lifecycle:
          # Konfigurasikan panggilan balik preStop untuk menunggu selama 30 detik sebelum keluar.
          # Perintah sleep harus tersedia dalam kontainer.
          preStop:
            exec:
              command:
              - sleep
              - 30
 ...
Atur waktu tunggu preStop menjadi 1,5–2× waktu respons maksimum Anda. Pastikan perintah sleep tersedia dalam gambar kontainer.

Pantau status komponen melalui metrik dan log

Log SLS

  • Di ACK console, buka tab NGINX Ingress Overview pada halaman Network > Ingresses. Di sini, Anda dapat melihat dasbor log untuk memeriksa data akses klien. Anda juga dapat membuka Operations > Log Center > Application Logs > Logstore dan pilih nginx-ingress untuk melihat entri log tertentu.

  • Jika dasbor log menampilkan titik data null, atau log nginx-ingress di Logstore kosong, artinya pencatatan log tidak diaktifkan saat pembuatan kluster. Lihat Kumpulkan dan analisis log akses NGINX Ingress.

Pemantauan Prometheus

Masuk ke ACK console, lalu navigasi ke Operations > Prometheus Monitoring untuk melihat dasbor pemantauan.

  • Jika komponen belum terinstal, ikuti petunjuk untuk menginstalnya dan periksa dasbor.

  • Pilih tab Ingresses. Pada dropdown Controller Class, pilih k8s.io/ingress-nginx untuk melihat metrik NGINX Ingress. Jika k8s.io/ingress-nginx tidak muncul, berarti NGINX Ingress controller belum terinstal.

Tambahkan bidang host ke resource Ingress Anda. Resource tanpa host tidak diambil metriknya secara default. Untuk melewatkan pemantauan per-host, tambahkan --metrics-per-host=false ke argumen controller dalam Penyebaran NGINX Ingress.

Optimalkan konfigurasi NGINX

Konfigurasikan rotasi log otomatis

Pod NGINX Ingress controller mencatat log ke /dev/stdout dan /var/log/nginx/. Saat file log membesar, penulisan entri baru semakin banyak mengonsumsi sumber daya. Rotasi otomatis mengatasi hal ini dengan secara berkala mengarsipkan dan membersihkan log.

  1. Masuk ke node yang menjalankan Pod NGINX Ingress controller.

  2. Buat file nginx-log-rotate.sh di direktori /root.

    Node Containerd

    #!/bin/bash
    # Jumlah maksimum file log yang disimpan. Sesuaikan sesuai kebutuhan.
    keep_log_num=5
    
    # Dapatkan ID semua kontainer ingress-nginx yang sedang berjalan.
    ingress_nginx_container_ids=$(crictl ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # Tunggu selama interval acak antara 5 hingga 10 detik.
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     crictl exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done

    Node Docker

    #!/bin/bash
    # Jumlah maksimum file log yang disimpan. Sesuaikan sesuai kebutuhan.
    keep_log_num=5
    
    # Dapatkan ID semua kontainer ingress-nginx yang sedang berjalan.
    ingress_nginx_container_ids=$(docker ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # Tunggu selama interval acak antara 5 hingga 10 detik.
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     docker exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done
  3. Buat file nginx-log-rotate.sh dapat dieksekusi.

    chmod 755 /root/nginx-log-rotate.sh
  4. Tambahkan baris berikut ke /etc/crontab:

    Ini akan merotasikan log setiap 15 menit. Sesuaikan jadwal sesuai kebutuhan.
    */15 * * * *  root /root/nginx-log-rotate.sh

Nonaktifkan pengumpulan metrik

Pengumpulan metrik diaktifkan secara default dan mengonsumsi CPU. Nonaktifkan jika Anda tidak memerlukannya.

Edit Penyebaran controller (kubectl edit deploy nginx-ingress-controller -n kube-system). Tambahkan --enable-metrics=false ke argumen kontainer untuk menonaktifkan metrik.

v1.9.3 atau lebih lama

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=false

Versi lebih baru dari v1.9.3

Versi NGINX Ingress controller yang lebih baru dari v1.9.3 memungkinkan penonaktifan metrik tertentu. Misalnya, tambahkan --exclude-socket-metrics untuk menghentikan pengumpulan metrik terkait socket. Lihat cli-arguments.

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=true
    - --exclude-socket-metrics # Hanya berlaku ketika --enable-metrics=true

Aktifkan kompresi Brotli

Algoritma Brotli biasanya mencapai kompresi 15%–30% lebih baik daripada gzip untuk sumber daya web berbasis teks.

Peningkatan aktual bergantung pada skenario Anda.

Edit ConfigMap NGINX Ingress (kubectl edit cm -n kube-system nginx-configuration) untuk mengaktifkan kompresi Brotli.

data:
  enable-brotli: "true"
  brotli-level: "6"
  brotli-types: "text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap"
  • enable-brotli: Menentukan apakah kompresi Brotli diaktifkan. Nilai valid: true, false.

  • brotli-level: Tingkat kompresi. Nilai valid: 1–11. Default: 4. Nilai lebih tinggi mengonsumsi lebih banyak CPU.

  • brotli-types: Jenis MIME yang dikompresi dengan Brotli.

Sesuaikan kebijakan timeout

Mengurangi timeout FIN_WAIT2 dan TIME_WAIT memungkinkan NGINX Ingress controller mendaur ulang koneksi yang telah selesai lebih cepat, sehingga membebaskan sumber daya.

Penting

Parameter FIN_WAIT2 dan TIME_WAIT secara langsung memengaruhi daur ulang koneksi NGINX Ingress controller. Pengaturan yang tidak tepat dapat menyebabkan kehabisan kolam koneksi, kehabisan port, atau kemacetan di bawah konkurensi tinggi. Pastikan Anda memahami prinsip koneksi TCP sebelum melakukan penyesuaian. Setelah modifikasi, pantau terus status koneksi dan penggunaan sumber daya.

Edit Penyebaran NGINX Ingress controller (kubectl edit deploy nginx-ingress-controller -n kube-system).

Tambahkan hal berikut ke initContainers:

  • net.ipv4.tcp_fin_timeout: Timeout FIN_WAIT2. Default: 60 detik.

  • net.netfilter.nf_conntrack_tcp_timeout_time_wait: Timeout TIME_WAIT. Default: 60 detik.

dnsPolicy: ...
initContainers:
- command:  
  - /bin/sh
  - -c
  - |
    if [ "$POD_IP" != "$HOST_IP" ]; then
    mount -o remount rw /proc/sys
    sysctl -w net.core.somaxconn=65535
    sysctl -w net.ipv4.ip_local_port_range="1024 65535"
    sysctl -w kernel.core_uses_pid=0
    sysctl -w net.ipv4.tcp_fin_timeout=15 # Atur timeout untuk status FIN_WAIT2 menjadi 15 detik
    sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 # Atur timeout untuk status TIME_WAIT menjadi 30 detik
    fi
  env:                                                           
    ...                                                     
  image: ...
  imagePullPolicy: IfNotPresent                           
  name: init-sysctl            

Optimalkan performa HTTPS

Sesuaikan parameter berikut dalam ConfigMap nginx-configuration.

kubectl edit cm -n kube-system nginx-configuration
  • Cache sesi SSL dan timeout

    Mengatur ukuran cache sesi SSL dan timeout mengurangi overhead handshake.

    data:
      ssl-session-cache-size: "10m"
      ssl-session-timeout: "10m"

    Konfigurasi nginx.conf yang sesuai

    Anda dapat menyesuaikan konfigurasi ini dalam file nginx.conf NGINX berdasarkan skenario Anda.

    ssl_session_cache shared:SSL:10m; # 1 MB dapat menyimpan sekitar 4.000 sesi.
    ssl_session_timeout 10m;
  • Aktifkan OCSP stapling untuk mengurangi waktu verifikasi sertifikat.

    data:
      enable-ocsp: "true"
  • Aktifkan TLS 1.3 0-RTT agar klien dapat mengirim data sebelum handshake selesai, sehingga mengurangi latensi pembentukan koneksi.

    data:
      ssl-early-data: "true"
      ssl-protocols: "TLSv1.3"
  • Sesuaikan prioritas cipher (tidak perlu penyetelan manual)

    Prioritas suite cipher memengaruhi latensi. Konfigurasi default NGINX Ingress controller sudah dioptimalkan.

    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';
    ssl_prefer_server_ciphers on;    # Utamakan konfigurasi cipher dari server.

Konfigurasikan opsi lain yang terkait performa

Opsi ConfigMap nginx-configuration berikut juga memengaruhi performa. Jalankan kubectl edit cm -n kube-system nginx-configuration untuk mengedit.

Kategori

Parameter

Deskripsi

downstream keepalive

keep-alive: "60s"

Waktu maksimum koneksi keepalive downstream tetap terbuka.

keep-alive-requests: "10000"

Jumlah maksimum permintaan keepalive downstream.

upstream keepalive

upstream-keepalive-connections: "1000"

Jumlah maksimum koneksi keepalive upstream.

upstream-keepalive-requests: "2147483647"

Jumlah maksimum permintaan keepalive upstream.

upstream-keepalive-time: "1h"

Waktu maksimum koneksi keepalive upstream tetap terbuka.

upstream-keepalive-timeout: "150s"

Timeout idle untuk koneksi keepalive upstream.

Jumlah koneksi maksimum per worker

max-worker-connections: "65536"

Jumlah koneksi maksimum yang dapat ditangani oleh satu worker.

Pengaturan timeout

Sesuaikan berdasarkan kasus penggunaan Anda.

proxy-connect-timeout: "3s"

Timeout untuk membentuk koneksi TCP.

proxy-read-timeout: "5s"

Timeout untuk membaca data.

proxy-send-timeout: "5s"

Timeout untuk mengirim data.

Mekanisme retry

Retry berlebihan dapat meningkatkan beban backend dan menyebabkan kegagalan berantai saat layanan tidak stabil. Lihat dokumentasi resmi Ingress-nginx.

proxy-next-upstream-tries: "3"

Retry setelah kegagalan. Default: 3 (satu percobaan awal + dua retry).

proxy-next-upstream: "off"

Kondisi retry. Atur ke off untuk menonaktifkan retry.

proxy-next-upstream-timeout: "5s"

Timeout untuk retry permintaan. Sesuaikan berdasarkan skenario Anda.

Referensi

Plugin CNI memengaruhi performa jaringan kluster, yang berdampak pada NGINX Ingress controller. Kami merekomendasikan menggunakan plugin jaringan Terway.