Konfigurasikan NGINX Ingress secara global melalui ConfigMap nginx-configuration atau per Ingress melalui anotasi.
Lihat dokumentasi ConfigMap NGINX Ingress dan dokumentasi anotasi NGINX Ingress.
ConfigMap
ConfigMap nginx-configuration menetapkan nilai default global untuk semua Ingress yang dikelola oleh controller NGINX Ingress.
Edit ConfigMap
kubectl edit cm -n kube-system nginx-configuration
Konfigurasi default
ConfigMap berikut menunjukkan nilai default ACK. Bidang yang tidak tercantum mewarisi nilai default upstream ingress-nginx.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: <namespace> # Default: kube-system
labels:
app: ingress-nginx
data:
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]'
proxy-body-size: 20m
proxy-connect-timeout: "10"
max-worker-connections: "65536"
enable-underscores-in-headers: "true"
reuse-port: "true"
worker-cpu-affinity: "auto"
server-tokens: "false"
ssl-redirect: "false"
allow-backend-server-header: "true"
ignore-invalid-headers: "true"
generate-request-id: "true"
upstream-keepalive-timeout: "900"
Deskripsi bidang
| Bidang | Default | Deskripsi |
|---|---|---|
log-format-upstream |
(lihat di atas) | Format log untuk permintaan upstream. Jika Anda mengubah bidang ini, perbarui juga AliyunLogConfig kube-system/k8s-nginx-ingress dan format pengumpulan log di Simple Log Service (SLS). Lihat Diagnosis log akses controller NGINX Ingress di Simple Log Service. |
proxy-body-size |
20m |
Ukuran maksimum badan permintaan klien. Memetakan ke client_max_body_size. |
proxy-connect-timeout |
10 |
Timeout (detik) untuk membuat koneksi dengan server proxy. Maksimum: 75. Untuk gRPC, atur juga grpc_connect_timeout. Lihat proxy_connect_timeout. |
max-worker-connections |
65536 |
Koneksi simultan maksimum per proses worker. Atur ke 0 untuk menggunakan nilai max-worker-open-files sebagai gantinya. |
enable-underscores-in-headers |
true |
Apakah mengizinkan garis bawah (_) dalam nama header permintaan. |
reuse-port |
true |
Membuat socket listening terpisah per worker menggunakan SO_REUSEPORT, mendistribusikan koneksi masuk ke seluruh worker. |
worker-cpu-affinity |
auto |
Mengikat setiap proses worker ke core CPU yang tersedia. Berguna untuk beban kerja berkinerja-tinggi. |
server-tokens |
false |
Jika true, menyertakan versi NGINX dalam header respons Server dan halaman error. Atur ke false untuk menyembunyikan informasi versi. |
ssl-redirect |
false |
Jika true, mengalihkan HTTP ke HTTPS (301) secara global untuk semua server yang memiliki sertifikat TLS. |
allow-backend-server-header |
true |
Jika true, meneruskan header Server dari backend alih-alih string generik NGINX. |
ignore-invalid-headers |
true |
Apakah mengabaikan bidang header yang tidak valid dalam permintaan. |
generate-request-id |
true |
Jika true, menghasilkan nilai acak X-Request-ID untuk permintaan yang belum menyertakan header ini. |
upstream-keepalive-timeout |
900 (ACK) / 60 (open source) |
Timeout idle (detik) untuk koneksi keep-alive ke server upstream. Memetakan ke direktif NGINX keepalive_timeout. |
Anotasi
Tambahkan anotasi ke sumber daya Ingress individual untuk mengganti atau memperluas pengaturan ConfigMap global.
Lihat dokumentasi anotasi NGINX Ingress.
Load balancing
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/load-balance |
round_robin | ewma |
Algoritma load balancing untuk layanan backend. round_robin (default) cocok untuk sebagian besar beban kerja. ewma (Peak Exponential Weighted Moving Average) lebih baik untuk aplikasi yang sensitif terhadap latensi. |
nginx.ingress.kubernetes.io/upstream-hash-by |
string | Mengaktifkan consistent hashing. Nilainya adalah variabel kunci hash. Contoh: $request_uri, $request_uri$host, ${request_uri}-text-value. Menambah atau menghapus node hanya memigrasikan subset entri rute. |
Contoh: consistent hashing berdasarkan URI permintaan
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <your-service-name>
port:
number: <your-service-port>
Untuk kluster Kubernetes versi sebelum 1.22, gunakanapiVersion: networking.k8s.io/v1beta1dan bidangserviceName/servicePortdi bawahbackend.
Afinitas cookie
| Anotasi | Tipe | Default | Deskripsi |
|---|---|---|---|
nginx.ingress.kubernetes.io/affinity |
cookie |
— | Tipe afinitas. Hanya cookie yang didukung. |
nginx.ingress.kubernetes.io/affinity-mode |
balanced | persistent |
balanced |
balanced mendistribusikan permintaan ke seluruh instans. persistent selalu mengarahkan klien ke instans backend yang sama, memastikan konsistensi sesi. |
nginx.ingress.kubernetes.io/session-cookie-name |
string | — | Nama cookie yang digunakan sebagai kunci hash untuk routing sesi. |
nginx.ingress.kubernetes.io/session-cookie-path |
string | / |
Atribut path yang diatur pada cookie sesi. Tidak mendukung ekspresi reguler ketika nginx.ingress.kubernetes.io/use-regex bernilai true. |
nginx.ingress.kubernetes.io/session-cookie-max-age |
integer (detik) | — | Max-Age pada cookie sesi (detik). |
nginx.ingress.kubernetes.io/session-cookie-expires |
integer (detik) | — | Masa berlaku cookie (detik). Mengatur atribut Expires. |
Contoh: afinitas sesi berbasis cookie
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
ingressClassName: nginx
rules:
- host: stickyingress.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
Pengalihan
| Anotasi | Tipe | Default | Deskripsi |
|---|---|---|---|
nginx.ingress.kubernetes.io/ssl-redirect |
"true" | "false" |
— | Mengalihkan HTTP ke HTTPS untuk Ingress ini jika memiliki sertifikat TLS. Lihat Pengalihan HTTP ke HTTPS. |
nginx.ingress.kubernetes.io/force-ssl-redirect |
"true" | "false" |
"false" |
Memaksa pengalihan HTTP ke HTTPS bahkan tanpa sertifikat TLS. |
nginx.ingress.kubernetes.io/permanent-redirect |
URL | — | URL tujuan untuk pengalihan permanen. Harus mencakup skema (http:// atau https://). |
nginx.ingress.kubernetes.io/permanent-redirect-code |
integer | 301 |
Kode status HTTP untuk pengalihan permanen. |
nginx.ingress.kubernetes.io/temporal-redirect |
URL | — | URL tujuan untuk pengalihan sementara. Harus mencakup skema (http:// atau https://). |
nginx.ingress.kubernetes.io/app-root |
path | — | Mengalihkan permintaan ke / ke path root aplikasi yang ditentukan. |
Contoh: pengalihan permanen dari `foo.com` ke `bar.com`
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: "https://bar.com"
spec:
ingressClassName: nginx
rules:
- host: foo.com
http:
paths:
- path: "/"
pathType: ImplementationSpecific
backend:
service:
name: httpbin
port:
number: 8000
Menulis ulang
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
string | Path tujuan untuk penulisan ulang. Mendukung grup tangkapan. Lihat Konfigurasi pengalihan URL. |
nginx.ingress.kubernetes.io/upstream-vhost |
string | Menulis ulang header Host yang dikirim ke layanan upstream. |
Contoh: menulis ulang header `Host` menjadi `test.com` untuk permintaan ke `example.com/test`
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /test
pathType: ImplementationSpecific
backend:
service:
name: demo-service
port:
number: 80
Pembatasan kecepatan
Batasi laju permintaan dan koneksi bersamaan per IP klien untuk melindungi layanan backend dari lonjakan lalu lintas.
| Anotasi | Tipe | Default | Deskripsi |
|---|---|---|---|
nginx.ingress.kubernetes.io/limit-connections |
integer | — | Koneksi bersamaan maksimum per IP. Permintaan berlebih menerima respons 503. |
nginx.ingress.kubernetes.io/limit-rate |
integer (KB) | — | Data maksimum yang ditransmisikan per koneksi per detik (KB). Atur ke 0 untuk menonaktifkan. Memerlukan proxy buffering diaktifkan. |
nginx.ingress.kubernetes.io/limit-rps |
integer | — | Permintaan maksimum per detik per alamat IP. Permintaan yang melebihi batas burst (laju × limit-burst-multiplier) mengembalikan error limit-req-status-code (503 secara default). |
nginx.ingress.kubernetes.io/limit-rpm |
integer | — | Permintaan maksimum per menit per alamat IP. Memiliki perilaku burst yang sama seperti limit-rps. |
nginx.ingress.kubernetes.io/limit-burst-multiplier |
integer | 5 |
Pengali batas laju burst. |
nginx.ingress.kubernetes.io/limit-whitelist |
Daftar Blok CIDR | — | Blok CIDR yang dipisahkan koma dan dikecualikan dari pembatasan kecepatan. |
Contoh: pembatasan laju dengan daftar putih IP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/limit-rate: "100K"
nginx.ingress.kubernetes.io/limit-rps: "1"
nginx.ingress.kubernetes.io/limit-rpm: "30"
nginx.ingress.kubernetes.io/limit-whitelist: "10.1.10.100"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 80
Fallback
Arahkan lalu lintas ke layanan cadangan saat backend utama tidak tersedia.
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/default-backend |
string | Layanan fallback saat tidak ada node backend yang tersedia. Konfigurasikan secara global melalui halaman Add-ons di Konsol ACK. |
nginx.ingress.kubernetes.io/custom-http-errors |
Kode status HTTP | Bekerja dengan default-backend. NGINX meneruskan permintaan ke layanan fallback saat backend mengembalikan kode status yang terdaftar. Path ditulis ulang menjadi /. Mengganti pengaturan ConfigMap custom-http-errors global. |
Rilis canary
Terapkan rilis canary dan penyebaran biru-hijau. Lihat Gunakan controller NGINX Ingress untuk menerapkan rilis canary dan penyebaran biru-hijau.
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/canary |
"true" | "false" |
Menentukan apakah akan mengaktifkan rilis canary. |
nginx.ingress.kubernetes.io/canary-by-header |
string | Kunci header untuk pemisahan lalu lintas. |
nginx.ingress.kubernetes.io/canary-by-header-value |
string | Nilai pencocokan eksak untuk kunci header. Mengarahkan permintaan yang cocok ke canary. |
nginx.ingress.kubernetes.io/canary-by-header-pattern |
regex | Pencocokan ekspresi reguler untuk nilai header. |
nginx.ingress.kubernetes.io/canary-by-cookie |
string | Kunci cookie yang digunakan untuk pemisahan lalu lintas. |
nginx.ingress.kubernetes.io/canary-weight |
integer | Persentase lalu lintas yang diarahkan ke canary (0–canary-weight-total). |
nginx.ingress.kubernetes.io/canary-weight-total |
integer | Penyebut bobot untuk canary-weight. |
Timeout
Pengaturan timeout global
Edit ConfigMap nginx-configuration untuk mengatur timeout secara global:
kubectl edit cm -n kube-system nginx-configuration
| Bidang | Default | Deskripsi |
|---|---|---|
proxy-connect-timeout |
5s |
Timeout koneksi proxy. Maksimum: 75s. |
proxy-read-timeout |
60s |
Timeout antara pembacaan proxy berturut-turut (bukan waktu respons total). |
proxy-send-timeout |
60s |
Timeout antara penulisan proxy berturut-turut (bukan waktu transmisi total). |
proxy-stream-next-upstream-timeout |
600s |
Waktu maksimum untuk meneruskan koneksi ke server upstream berikutnya. Atur ke 0 untuk tanpa batas. |
proxy-stream-timeout |
600s |
Timeout idle pada koneksi klien atau proxy. Ditutup jika tidak ada data yang ditransfer. |
upstream-keepalive-timeout |
900s (ACK) / 60s (open source) |
Timeout idle untuk koneksi keep-alive ke server upstream. |
worker-shutdown-timeout |
240s |
Timeout shutdown graceful. |
proxy-protocol-header-timeout |
5s |
Timeout untuk menerima header protokol PROXY. Mencegah penanganan passthrough TLS terblokir pada koneksi rusak. |
ssl-session-timeout |
10m |
Masa berlaku cache sesi SSL. Setiap entri menggunakan sekitar 0,25 MB. |
client-body-timeout |
60s |
Timeout untuk membaca badan permintaan klien. |
client-header-timeout |
60s |
Timeout untuk membaca header permintaan klien. |
Pengaturan timeout per Ingress
Ganti timeout global untuk Ingress tertentu dengan anotasi berikut:
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/proxy-connect-timeout |
Timeout koneksi proxy. |
nginx.ingress.kubernetes.io/proxy-send-timeout |
Timeout pengiriman proxy. |
nginx.ingress.kubernetes.io/proxy-read-timeout |
Timeout pembacaan proxy. |
nginx.ingress.kubernetes.io/proxy-request-buffering |
Mode buffering permintaan. on: buffer seluruh permintaan sebelum diteruskan (permintaan chunked HTTP/1.1 selalu dibuffer). off: streaming data permintaan langsung; tidak ada retry saat terjadi error transmisi. |
CORS
Aktifkan Berbagi Sumber Daya Lintas Asal (CORS) untuk permintaan browser. Lihat Konfigurasi CORS pada NGINX Ingress.
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/enable-cors |
Mengaktifkan CORS untuk Ingress ini. |
nginx.ingress.kubernetes.io/cors-allow-origin |
Origin yang diizinkan untuk permintaan CORS. |
nginx.ingress.kubernetes.io/cors-allow-methods |
Metode permintaan yang diizinkan, termasuk GET, POST, dan PUT. |
nginx.ingress.kubernetes.io/cors-allow-headers |
Header permintaan yang diizinkan. |
nginx.ingress.kubernetes.io/cors-expose-headers |
Header respons yang diekspos ke browser. |
nginx.ingress.kubernetes.io/cors-allow-credentials |
Apakah mengizinkan kredensial (cookie, header otorisasi) dalam permintaan CORS. |
nginx.ingress.kubernetes.io/cors-max-age |
Durasi cache preflight CORS (detik). |
Kebijakan retry
| Anotasi | Default | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-next-upstream-tries |
3 |
Jumlah retry saat kondisi terpenuhi. |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout |
— | Timeout (detik) untuk seluruh urutan retry. Tidak ada default (tidak terbatas). |
nginx.ingress.kubernetes.io/proxy-next-upstream |
— | Kondisi retry. Pisahkan beberapa nilai dengan spasi. Nilai yang valid: error (kegagalan koneksi), timeout (timeout), invalid_response (kode status tidak valid), http_500, http_502, http_503, http_504, http_403, http_404, http_429, off (nonaktifkan retry). |
Kontrol akses berbasis alamat IP
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/whitelist-source-range |
Daftar Blok CIDR | Daftar putih IP. Hanya alamat IP atau blok CIDR yang tercantum yang diizinkan. Dipisahkan koma. |
nginx.ingress.kubernetes.io/denylist-source-range |
Daftar Blok CIDR | Daftar hitam IP. Alamat IP atau blok CIDR yang tercantum ditolak. Dipisahkan koma. |
Contoh: izinkan hanya alamat IP tertentu
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/whitelist-source-range: "10.1.10.2"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 80
Untuk menerapkan secara global, atur whitelist-source-range di ConfigMap nginx-configuration.
Mirror lalu lintas
Duplikasi permintaan produksi ke lingkungan shadow untuk pengujian tanpa memengaruhi lalu lintas langsung. Lihat Gunakan controller Ingress untuk mencerminkan lalu lintas jaringan.
| Anotasi | Tipe | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/mirror-target |
URL | Tujuan mirror. Menerima alamat IP Layanan atau URL eksternal. Gunakan $request_uri untuk menambahkan URI permintaan asli. Contoh: https://test.env.com/$request_uri. |
nginx.ingress.kubernetes.io/mirror-request-body |
"true" | "false" |
Apakah akan mencerminkan badan permintaan. |
nginx.ingress.kubernetes.io/mirror-host |
string | Host yang dikirim bersama permintaan yang dicerminkan. |
Proteksi keamanan
Konfigurasikan enkripsi TLS antara klien dan controller NGINX Ingress, serta antara controller dan layanan backend. Lihat Enkripsi controller NGINX Ingress.
Enkripsi klien-ke-gerbang
| Anotasi | Ruang Lingkup | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/ssl-cipher |
Domain | Paket sandi TLS (dipisahkan koma). Hanya berlaku untuk jabat tangan TLS 1.0–1.2. Paket sandi default: ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES128-SHA, ECDHE-RSA-AES128-SHA, AES128-GCM-SHA256, AES128-SHA, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES256-SHA, ECDHE-RSA-AES256-SHA, AES256-GCM-SHA384, AES256-SHA. |
nginx.ingress.kubernetes.io/auth-tls-secret |
Domain | Secret sertifikat CA untuk memverifikasi sertifikat klien dalam mTLS. Harus mencakup file ca.crt dengan rantai CA lengkap. |
Enkripsi gerbang-ke-backend
| Anotasi | Ruang Lingkup | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-ssl-secret |
Layanan | Secret sertifikat klien yang disajikan ke backend. Harus dalam format PEM dengan tls.crt (sertifikat klien), tls.key (kunci privat), dan ca.crt (sertifikat CA tepercaya). Tentukan sebagai "namespace/secretName". |
nginx.ingress.kubernetes.io/proxy-ssl-name |
Layanan | Nilai Indikasi Nama Server (SNI) untuk proses jabat tangan TLS dengan backend. |
nginx.ingress.kubernetes.io/proxy-ssl-server-name |
Layanan | Mengaktifkan atau menonaktifkan SNI untuk proses jabat tangan TLS dengan backend. |
Otentikasi keamanan
Batasi akses dengan Otentikasi Dasar. Hanya permintaan yang terotentikasi yang mencapai layanan backend.
| Anotasi | Ruang Lingkup | Deskripsi |
|---|---|---|
nginx.ingress.kubernetes.io/auth-type |
Ingress | Tipe otentikasi. Atur ke basic. |
nginx.ingress.kubernetes.io/auth-secret |
Ingress | Nama Secret kredensial. Format: namespace/secretName. |
nginx.ingress.kubernetes.io/auth-secret-type |
Ingress | Format data Secret. auth-file: kunci auth memiliki entri username:password yang dipisahkan baris baru. auth-map: kunci adalah username, nilai adalah password. |
nginx.ingress.kubernetes.io/auth-realm |
Ingress | Realm otentikasi yang ditampilkan ke klien saat diminta memasukkan kredensial. |
Siapkan Otentikasi Dasar
-
Buat file password dengan
htpasswd:htpasswd -c auth jokerVerifikasi file tersebut:
cat auth # Expected output: joker:$apr1$R.G4krs/$hh0mX8xe4A3lYKMjvlVs1/ -
Buat Secret dari file password:
kubectl create secret generic basic-auth --from-file=auth -
Tambahkan anotasi ke Ingress Anda:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth spec: ingressClassName: nginx rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: backend-svc port: number: 80