APIG Ingress mengelola akses eksternal ke layanan kluster dengan load balancing lapisan 7. Tambahkan anotasi pada resource Ingress Anda untuk mengonfigurasi perutean trafik tingkat lanjut, pembatasan laju, dan fitur keamanan.
Contoh dalam topik ini menggunakan awalan anotasinginx.ingress.kubernetes.iodanhigress.ingress.kubernetes.io. Awalan yang berlaku untuk setiap anotasi ditampilkan dalam indeks anotasi di bawah.
Indeks anotasi
Klik nama anotasi untuk melompat ke deskripsinya.
| Anotasi | Tipe | Lingkup | Fitur |
|---|---|---|---|
nginx.ingress.kubernetes.io/canary |
string ("true") |
Route | Rilis canary |
nginx.ingress.kubernetes.io/canary-by-header |
string | Route | Rilis canary berbasis header |
nginx.ingress.kubernetes.io/canary-by-header-value |
string | Route | Rilis canary berbasis header |
higress.ingress.kubernetes.io/canary-by-query |
string | Route | Rilis canary berbasis parameter kueri |
higress.ingress.kubernetes.io/canary-by-query-value |
string | Route | Rilis canary berbasis parameter kueri |
nginx.ingress.kubernetes.io/canary-by-cookie |
string | Route | Rilis canary berbasis cookie |
nginx.ingress.kubernetes.io/canary-weight |
integer (0–100) | Route | Rilis canary berbasis bobot |
nginx.ingress.kubernetes.io/canary-weight-total |
integer | Route | Rilis canary berbasis bobot |
higress.ingress.kubernetes.io/service-subset |
string | Route | Subset layanan |
higress.ingress.kubernetes.io/subset-labels |
string | Route | Subset layanan dengan label kustom |
nginx.ingress.kubernetes.io/enable-cors |
boolean | Route | CORS |
nginx.ingress.kubernetes.io/cors-allow-origin |
string | Route | CORS |
nginx.ingress.kubernetes.io/cors-allow-methods |
string | Route | CORS |
nginx.ingress.kubernetes.io/cors-allow-headers |
string | Route | CORS |
nginx.ingress.kubernetes.io/cors-expose-headers |
string | Route | CORS |
nginx.ingress.kubernetes.io/cors-allow-credentials |
boolean | Route | CORS |
nginx.ingress.kubernetes.io/cors-max-age |
integer (seconds) | Route | CORS |
nginx.ingress.kubernetes.io/use-regex |
boolean | Route | Pencocokan ekspresi reguler |
nginx.ingress.kubernetes.io/rewrite-target |
string | Route | Penulisan ulang path |
nginx.ingress.kubernetes.io/upstream-vhost |
string | Domain | Penulisan ulang host |
nginx.ingress.kubernetes.io/ssl-redirect |
boolean | Route | Pengalihan HTTP ke HTTPS |
nginx.ingress.kubernetes.io/force-ssl-redirect |
boolean | Route | Pengalihan HTTP ke HTTPS |
nginx.ingress.kubernetes.io/permanent-redirect |
URL | Route | Pengalihan permanen |
nginx.ingress.kubernetes.io/permanent-redirect-code |
integer | Route | Pengalihan permanen |
nginx.ingress.kubernetes.io/temporal-redirect |
URL | Route | Pengalihan sementara |
higress.ingress.kubernetes.io/request-header-control-add |
string | Route | Kontrol header permintaan |
higress.ingress.kubernetes.io/request-header-control-update |
string | Route | Kontrol header permintaan |
higress.ingress.kubernetes.io/request-header-control-remove |
string | Route | Kontrol header permintaan |
higress.ingress.kubernetes.io/response-header-control-add |
string | Route | Kontrol header respons |
higress.ingress.kubernetes.io/response-header-control-update |
string | Route | Kontrol header respons |
higress.ingress.kubernetes.io/response-header-control-remove |
string | Route | Kontrol header respons |
nginx.ingress.kubernetes.io/proxy-next-upstream-tries |
integer | Route | Retry |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout |
integer (seconds) | Route | Retry |
nginx.ingress.kubernetes.io/proxy-next-upstream |
string | Route | Retry |
nginx.ingress.kubernetes.io/whitelist-source-range |
CIDR/IP | Route | Kontrol akses IP |
higress.ingress.kubernetes.io/blacklist-source-range |
CIDR/IP | Route | Kontrol akses IP |
higress.ingress.kubernetes.io/domain-whitelist-source-range |
CIDR/IP | Domain | Kontrol akses IP |
higress.ingress.kubernetes.io/domain-blacklist-source-range |
CIDR/IP | Domain | Kontrol akses IP |
higress.ingress.kubernetes.io/route-limit-rpm |
integer | Route | Pembatasan kecepatan gateway tunggal |
higress.ingress.kubernetes.io/route-limit-rps |
integer | Route | Pembatasan kecepatan gateway tunggal |
higress.ingress.kubernetes.io/route-limit-burst-multiplier |
integer | Route | Pembatasan kecepatan gateway tunggal |
higress.ingress.kubernetes.io/rate-limit |
integer (RPS) | Route | Kontrol pembatasan laju global |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code |
integer | Route | Kontrol pembatasan laju global |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type |
string | Route | Kontrol pembatasan laju global |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body |
string | Route | Kontrol pembatasan laju global |
higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url |
URL | Route | Kontrol pembatasan laju global |
higress.ingress.kubernetes.io/concurrency-limit |
integer | Route | Kontrol konkurensi global |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code |
integer | Route | Kontrol konkurensi global |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type |
string | Route | Kontrol konkurensi global |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body |
string | Route | Kontrol konkurensi global |
higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url |
URL | Route | Kontrol konkurensi global |
higress.ingress.kubernetes.io/mirror-target-service |
string (namespace/name:port) |
Route | Pencerminan lalu lintas |
higress.ingress.kubernetes.io/mirror-percentage |
integer (0–100) | Route | Pencerminan lalu lintas |
nginx.ingress.kubernetes.io/backend-protocol |
string (HTTPS, GRPC) |
Route | Protokol layanan backend |
nginx.ingress.kubernetes.io/load-balance |
string | Route | Algoritma penyeimbangan beban |
nginx.ingress.kubernetes.io/upstream-hash-by |
string | Route | Penghashan konsisten |
higress.ingress.kubernetes.io/warmup |
integer (seconds) | Route | Warmup (mulai mulus) |
nginx.ingress.kubernetes.io/affinity |
string ("cookie") |
Route | Afinitas cookie |
nginx.ingress.kubernetes.io/affinity-mode |
string ("balanced" or "persistent") |
Route | Afinitas cookie |
nginx.ingress.kubernetes.io/session-cookie-name |
string | Route | Afinitas cookie |
nginx.ingress.kubernetes.io/session-cookie-path |
string | Route | Afinitas cookie |
nginx.ingress.kubernetes.io/session-cookie-max-age |
integer (seconds) | Route | Afinitas cookie |
nginx.ingress.kubernetes.io/session-cookie-expires |
integer (seconds) | Route | Afinitas cookie |
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection |
integer | Route | Pool koneksi |
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint |
integer | Route | Pool koneksi |
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection |
integer | Route | Pool koneksi |
higress.ingress.kubernetes.io/tls-min-protocol-version |
string | Domain | Versi TLS dan paket sandi |
higress.ingress.kubernetes.io/tls-max-protocol-version |
string | Domain | Versi TLS dan paket sandi |
nginx.ingress.kubernetes.io/ssl-cipher |
string | Domain | Versi TLS dan paket sandi |
nginx.ingress.kubernetes.io/proxy-ssl-secret |
string (namespace/name) |
Route | mTLS dengan layanan backend |
nginx.ingress.kubernetes.io/proxy-ssl-name |
string | Route | mTLS dengan layanan backend |
nginx.ingress.kubernetes.io/proxy-ssl-server-name |
boolean | Route | mTLS dengan layanan backend |
Rilis canary
Rilis canary memungkinkan Anda mengalihkan sebagian trafik ke versi layanan baru tanpa menghentikan versi produksi saat ini. Aktifkan fitur ini dengan nginx.ingress.kubernetes.io/canary: "true", lalu tambahkan satu atau beberapa anotasi penargetan untuk mengontrol distribusi trafik.
Jika beberapa metode penargetan dikonfigurasi pada Ingress yang sama, aturan dievaluasi dalam urutan prioritas berikut:
Cookie > Header > Parameter kueri > Bobot
Rilis canary berbasis header
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/canary-by-header |
Mengarahkan trafik berdasarkan nama header permintaan. Atur nilai header ke always untuk selalu mengarahkan ke canary. Nilai lainnya mengarahkan ke produksi kecuali canary-by-header-value juga cocok. |
nginx.ingress.kubernetes.io/canary-by-header-value |
Saat digabungkan dengan canary-by-header, mengarahkan ke layanan canary hanya jika nama dan nilai header cocok. |
Contoh 1: Arahkan permintaan dengan header `apig: always` ke layanan canary
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Arahkan ke beberapa versi canary berdasarkan nilai header (`apig: v1` → v1, `apig: v2` → v2)
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v2
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v2
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Rilis canary berbasis parameter kueri
| Anotasi | Deskripsi |
|---|---|
higress.ingress.kubernetes.io/canary-by-query |
Mengarahkan trafik berdasarkan nama parameter kueri URL. Atur nilai parameter ke always untuk mengarahkan ke layanan canary. |
higress.ingress.kubernetes.io/canary-by-query-value |
Saat digabungkan dengan canary-by-query, mengarahkan ke layanan canary hanya jika nama dan nilai parameter kueri cocok. |
Aturan berbasis header dan parameter kueri dapat digabungkan. Jika keduanya dikonfigurasi, permintaan diarahkan ke layanan canary hanya jika kedua kondisi terpenuhi.
Contoh 1: Arahkan permintaan dengan parameter kueri URL `canary=gray` ke layanan canary
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Arahkan ke canary hanya ketika `canary=gray` ada di URL dan `x-user-id: test` ada di header
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
higress.ingress.kubernetes.io/canary-by-query: "canary"
higress.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Rilis canary berbasis cookie
Gunakan nginx.ingress.kubernetes.io/canary-by-cookie untuk membagi trafik berdasarkan cookie. Atur nilai cookie ke always untuk mengarahkan permintaan ke layanan canary; semua permintaan lainnya dialihkan ke layanan produksi.
Rilis canary berbasis cookie tidak mendukung nilai kustom. Nilai cookie harus always.
Contoh: Arahkan permintaan dengan cookie `demo=always` ke layanan canary
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
name: demo-canary
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Rilis canary berbasis bobot
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
nginx.ingress.kubernetes.io/canary-weight |
Persentase permintaan yang diarahkan ke versi canary. Integer dari 0 hingga 100. | — |
nginx.ingress.kubernetes.io/canary-weight-total |
Bobot total di semua versi. | 100 |
Contoh: Bagi trafik ke tiga versi — canary v1 30%, canary v2 20%, produksi 50%
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
name: demo-canary-v2
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v2
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
name: demo-canary-v2
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v2
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Subset layanan
Subset layanan memungkinkan Anda mengarahkan trafik ke Pod tertentu dalam suatu Layanan — berguna ketika satu Layanan didukung oleh beberapa Deployment yang menjalankan versi kode berbeda.
Gunakan konvensi label pod untuk APIG Ingress
Atur higress.ingress.kubernetes.io/service-subset untuk menentukan grup Pod yang menerima permintaan. Secara bawaan, APIG Ingress memetakan nilai subset ke label Pod dengan awalan opensergo.io/canary:
-
Nilai
""ataubase: mengarahkan ke Pod dengan labelopensergo.io/canary: ""atau Pod yang tidak memiliki label berawalanopensergo.io/canary. -
String apa pun (misalnya,
gray): mengarahkan ke Pod dengan labelopensergo.io/canary-gray: gray.
Contoh: Arahkan permintaan `x-user-id: test` ke Deployment gray go-httpbin
Pertama, terapkan Layanan dan Deployment:
# Kubernetes Service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# Base Deployment — no opensergo.io/canary label
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-base
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# Gray Deployment — has label opensergo.io/canary-gray: gray
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-gray
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
opensergo.io/canary-gray: gray
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin
Kemudian konfigurasi resource Ingress:
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods with label opensergo.io/canary-gray: gray
higress.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# Forward to Pods with no opensergo.io/canary-prefixed label
higress.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods with label opensergo.io/canary-gray: gray
higress.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
# Forward to Pods with no opensergo.io/canary-prefixed label
higress.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
Gunakan label kustom
Untuk menargetkan Pod berdasarkan label apa pun — bukan konvensi opensergo.io/canary — atur higress.ingress.kubernetes.io/service-subset dan higress.ingress.kubernetes.io/subset-labels.
Saatsubset-labelsdikonfigurasi, subset tidak lagi dipetakan ke label berawalanopensergo.io/canary.
Contoh: Arahkan permintaan `x-user-id: test` ke Pod dengan label `version: gray`
Pertama, terapkan Deployment (label version: gray ditambahkan ke templat Pod Deployment gray):
# go-httpbin Kubernetes Service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# Base Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-base
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# Gray Deployment — uses the custom label version: gray
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-gray
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
version: gray
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin
Kemudian konfigurasi resource Ingress:
Kluster dengan versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods with label version: gray
higress.ingress.kubernetes.io/service-subset: gray
higress.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
Kluster dengan versi sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods with label version: gray
higress.ingress.kubernetes.io/service-subset: gray
higress.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
CORS
Cross-origin resource sharing (CORS) mengontrol domain eksternal mana yang dapat membuat permintaan ke layanan Anda.
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
nginx.ingress.kubernetes.io/enable-cors |
Aktifkan atau nonaktifkan CORS. | — |
nginx.ingress.kubernetes.io/cors-allow-origin |
Origin pihak ketiga yang diizinkan. Dipisahkan koma; mendukung wildcard *. |
* (semua asal) |
nginx.ingress.kubernetes.io/cors-allow-methods |
Metode HTTP yang diizinkan. Dipisahkan koma; mendukung wildcard *. |
GET,PUT,POST,DELETE,PATCH,OPTIONS |
nginx.ingress.kubernetes.io/cors-allow-headers |
Header permintaan yang diizinkan. Dipisahkan koma; mendukung wildcard *. |
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization |
nginx.ingress.kubernetes.io/cors-expose-headers |
Header respons yang boleh diakses browser. Dipisahkan koma. | — |
nginx.ingress.kubernetes.io/cors-allow-credentials |
Apakah kredensial diperbolehkan dalam permintaan CORS. | true |
nginx.ingress.kubernetes.io/cors-max-age |
Berapa lama respons preflight dapat di-cache, dalam detik. | 1728000 |
Contoh: Izinkan `example.com`, izinkan hanya `GET` dan `POST`, batasi ke header `X-Foo-Bar`, dan larang kredensial
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Pencocokan ekspresi reguler
Ingress Kubernetes standar hanya mendukung pencocokan path Exact dan Prefix. APIG Ingress juga mendukung pencocokan ekspresi reguler. Aktifkan dengan nginx.ingress.kubernetes.io/use-regex: "true", lalu gunakan pola regex sebagai nilai path.
Contoh: Teruskan permintaan apa pun yang cocok `/app/...` atau `/test/...` ke layanan demo
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
name: regex-match
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo
port:
number: 8080
path: /(app|test)/(.*)
pathType: Prefix
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
name: regex-match
namespace: default
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /(app|test)/(.*)
backend:
serviceName: demo
servicePort: 8080
Penulisan ulang path dan host
Penulisan ulang memodifikasi path atau host dalam permintaan sebelum APIG Ingress meneruskannya ke layanan backend.
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
Path target setelah penulisan ulang. Mendukung grup tangkapan. |
nginx.ingress.kubernetes.io/upstream-vhost |
Nilai header Host yang dikirim ke layanan backend. |
Penulisan ulang path
Semua contoh di bawah menggunakan nginx.ingress.kubernetes.io/rewrite-target untuk memodifikasi path permintaan.
Contoh 1: Tulis ulang `example.com/test` menjadi `example.com/dev` sebelum meneruskan
Kluster pada Kubernetes 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Kubernetes 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /test
pathType: Exact
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Hapus awalan `/v1` — tulis ulang `example.com/v1/xxx` menjadi `example.com/xxx`
Kluster pada Kubernetes 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix
Kluster Sebelum Kubernetes 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80
Contoh 3: Ganti awalan `/v1` dengan `/v2` — tulis ulang `example.com/v1/xxx` menjadi `example.com/v2/xxx`
Kluster pada Kubernetes 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix
Kluster Sebelum Kubernetes 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80
Penulisan ulang host
Contoh: Tulis ulang host dari `example.com` menjadi `test.com` sebelum meneruskan
Kluster pada Kubernetes 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Kubernetes 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pengalihan
Pengalihan HTTP ke HTTPS
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/ssl-redirect |
Alihkan permintaan HTTP ke HTTPS. |
nginx.ingress.kubernetes.io/force-ssl-redirect |
Alihkan permintaan HTTP ke HTTPS. |
APIG Ingress memperlakukan ssl-redirect dan force-ssl-redirect secara identik — keduanya memaksa pengalihan HTTP ke HTTPS.
Contoh: Alihkan `http://example.com/test` ke `https://example.com/test`
Kluster pada Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pengalihan permanen
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
nginx.ingress.kubernetes.io/permanent-redirect |
URL tujuan untuk pengalihan permanen. Harus menyertakan skema (http:// atau https://). |
— |
nginx.ingress.kubernetes.io/permanent-redirect-code |
Kode status HTTP untuk pengalihan. | 301 |
Contoh: Alihkan permanen `http://example.com/test` ke `http://example.com/app`
Kluster pada Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pengalihan sementara
Gunakan nginx.ingress.kubernetes.io/temporal-redirect untuk menentukan URL tujuan pengalihan sementara. URL harus menyertakan skema (http:// atau https://).
Contoh: Alihkan sementara `http://example.com/test` ke `http://example.com/app`
Kluster pada Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Kontrol header
Kontrol header memungkinkan Anda menambah, memperbarui, atau menghapus header HTTP saat APIG Ingress meneruskan permintaan ke layanan backend dan respons kembali ke klien.
Kontrol header permintaan
Ketiga anotasi ini memiliki sintaks multi-header yang sama: satu header menggunakan pasangan kunci-nilai; beberapa header menggunakan skalar blok YAML | dengan satu pasangan kunci-nilai per baris.
| Anotasi | Deskripsi |
|---|---|
higress.ingress.kubernetes.io/request-header-control-add |
Menambahkan header ke permintaan yang diteruskan. Jika header sudah ada, nilainya ditambahkan. |
higress.ingress.kubernetes.io/request-header-control-update |
Memperbarui header dalam permintaan yang diteruskan. Jika header sudah ada, nilainya ditimpa. |
higress.ingress.kubernetes.io/request-header-control-remove |
Menghapus header dari permintaan yang diteruskan. Pisahkan beberapa nama header dengan koma. |
Contoh 1: Tambahkan header `foo: bar` dan `test: true` ke semua permintaan ke `example.com/test`
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Gunakan kontrol header bersama rilis canary untuk memberi tag trafik berdasarkan tahap deployment
Jika header permintaan berisi apig: v1, APIG Ingress mengarahkan ke canary dan menambahkan stage: gray. Semua permintaan lainnya dialihkan ke versi dasar dan menerima stage: production.
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: apig
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "apig"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: apig
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Kontrol header respons
| Anotasi | Deskripsi |
|---|---|
higress.ingress.kubernetes.io/response-header-control-add |
Menambahkan header ke respons sebelum diteruskan ke klien. Jika header sudah ada, nilainya ditambahkan. |
higress.ingress.kubernetes.io/response-header-control-update |
Memperbarui header dalam respons sebelum diteruskan ke klien. Jika header sudah ada, nilainya ditimpa. |
higress.ingress.kubernetes.io/response-header-control-remove |
Menghapus header dari respons sebelum diteruskan ke klien. Pisahkan beberapa nama header dengan koma. |
Contoh: Hapus header `req-cost-time` dari respons ke `example.com/test`
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Retry
APIG Ingress secara otomatis mencoba ulang permintaan yang gagal di tingkat route. Konfigurasikan jumlah maksimum percobaan ulang, timeout, dan kondisi yang memicu retry.
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-next-upstream-tries |
Jumlah maksimum percobaan ulang. | 3 |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout |
Timeout untuk retry, dalam detik. | Tidak ada timeout |
nginx.ingress.kubernetes.io/proxy-next-upstream |
Daftar kondisi retry yang dipisahkan koma. | error,timeout |
Kondisi retry yang valid:
| Kondisi | Deskripsi |
|---|---|
error |
Koneksi gagal dibuat atau kode status 5xx dikembalikan. |
timeout |
Waktu koneksi habis atau kode status 5xx dikembalikan. |
invalid_header |
Terjadi kesalahan permintaan atau kode status 5xx dikembalikan. |
http_xxx |
Retry pada kode status HTTP tertentu (misalnya, http_502, http_403). |
non_idempotent |
Aktifkan retry untuk permintaan non-idempoten (POST, PATCH). Secara bawaan, permintaan ini tidak di-retry. |
off |
Nonaktifkan retry sepenuhnya. |
Contoh: Coba ulang hingga 2 kali dalam 5 detik, hanya pada HTTP 502, dan juga coba ulang permintaan non-idempoten
Kluster untuk Kubernetes 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster untuk Kubernetes Sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Kontrol akses IP
APIG Ingress mendukung daftar putih dan daftar hitam alamat IP di tingkat route maupun tingkat domain. Aturan tingkat route memiliki prioritas lebih tinggi daripada aturan tingkat domain.
Kontrol akses IP tingkat route
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/whitelist-source-range |
Daftar putih untuk route tertentu. Menerima alamat IP dan blok CIDR, dipisahkan koma. |
higress.ingress.kubernetes.io/blacklist-source-range |
Daftar hitam untuk route tertentu. Menerima alamat IP dan blok CIDR, dipisahkan koma. |
Contoh 1: Izinkan akses ke `example.com/test` hanya dari `1.1.X.X`
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Blokir akses ke `example.com/test` dari `2.2.2.2`
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Kontrol akses IP tingkat domain
| Anotasi | Deskripsi |
|---|---|
higress.ingress.kubernetes.io/domain-whitelist-source-range |
Daftar putih yang diterapkan ke semua route di bawah domain. Daftar putih tingkat route memiliki prioritas lebih tinggi. Menerima alamat IP dan blok CIDR, dipisahkan koma. |
higress.ingress.kubernetes.io/domain-blacklist-source-range |
Daftar hitam yang diterapkan ke semua route di bawah domain. Daftar hitam tingkat route memiliki prioritas lebih tinggi. Menerima alamat IP dan blok CIDR, dipisahkan koma. |
Contoh 1: Izinkan akses ke semua route di bawah `example.com` dari `1.1.X.X` dan `2.2.2.2`
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
- backend:
service:
name: app-service
port:
number: 80
path: /app
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
- path: /app
backend:
serviceName: app-service
servicePort: 80
Contoh 2: Gabungkan daftar putih tingkat domain dan tingkat route — batasi `/order` ke `3.3.X.X` sementara mengizinkan `1.1.X.X` dan `2.2.2.2` pada route lainnya
Kluster versi 1.19 dan lebih baru
# Domain-level allowlist for /test and /app
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
- backend:
service:
name: app-service
port:
number: 80
path: /app
pathType: Exact
---
# Route-level allowlist overrides domain-level for /order
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
name: demo-route
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
- path: /app
backend:
serviceName: app-service
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
name: demo-route
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /order
backend:
serviceName: demo-service
servicePort: 80
Pembatasan kecepatan gateway tunggal
Pembatasan kecepatan gateway tunggal membatasi laju permintaan untuk route tertentu pada setiap instans Cloud-native API Gateway. Batasan ini berlaku per replika gateway, bukan di seluruh kluster.
Batas laju berlaku per replika gateway. Jika Anda menjalankan beberapa replika atau menggunakan Horizontal Pod Autoscaler (HPA), batas efektif di seluruh kluster adalah nilai yang dikonfigurasi dikalikan jumlah replika. Untuk batas di seluruh kluster yang tidak terpengaruh jumlah replika, gunakan kontrol pembatasan laju global sebagai gantinya.
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
higress.ingress.kubernetes.io/route-limit-rpm |
Permintaan maksimum per menit (RPM) per instans gateway. Saat batas terlampaui, badan respons adalah local_rate_limited. |
— |
higress.ingress.kubernetes.io/route-limit-rps |
Permintaan maksimum per detik (RPS) per instans gateway. Saat batas terlampaui, badan respons adalah local_rate_limited. |
— |
higress.ingress.kubernetes.io/route-limit-burst-multiplier |
Pengali batas burst. Batas burst sama dengan nilai RPM atau RPS dikalikan angka ini. | 5 |
Kode status respons saat pembatasan kecepatan dipicu tergantung pada versi gateway Anda:
-
Versi gateway sebelum 1.2.23: HTTP 503
-
Versi gateway 1.2.23 atau lebih baru: HTTP 429
Contoh 1: Batasi `example.com/test` hingga 100 RPM dengan batas burst 200 (pengali 2)
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/route-limit-rpm: "100"
higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/route-limit-rpm: "100"
higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Batasi `example.com/test` hingga 10 RPS dengan batas burst bawaan (pengali 5, burst = 50)
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/route-limit-rps: "10"
# Default burst multiplier is 5; burst limit = 50
# higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/route-limit-rps: "10"
# Default burst multiplier is 5; burst limit = 50
# higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Kontrol pembatasan laju global
Fitur ini memerlukan gateway APIG Ingress versi 1.2.25 atau lebih baru.
Kontrol pembatasan laju global terintegrasi dengan Sentinel untuk memberlakukan batas RPS di seluruh kluster pada route tertentu. Saat batas terlampaui, respons bawaan adalah HTTP 429 dengan badan sentinel rate limited. Timpa perilaku ini dengan respons kustom atau pengalihan — tetapi tidak keduanya.
Respons kustom
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
higress.ingress.kubernetes.io/rate-limit |
RPS maksimum untuk route di seluruh kluster gateway. | — |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code |
Kode status HTTP saat pembatasan laju dipicu. | 429 |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type |
Format badan respons: text (text/plain; charset=UTF-8) atau json (application/json; charset=UTF-8). |
text |
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body |
Isi badan respons saat pembatasan laju dipicu. | sentinel rate limited |
Contoh 1: Batasi `example.com/test` hingga 100 RPS dengan respons pembatasan laju bawaan
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Batasi `example.com/test` hingga 100 RPS; kembalikan HTTP 503 dengan badan `server is overload` saat dibatasi
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pengalihan
Gunakan higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url untuk mengalihkan klien ke URL fallback saat pembatasan laju dipicu.
Contoh: Batasi `example.com/test` hingga 100 RPS; alihkan ke `example.com/fallback` saat dibatasi
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/rate-limit: "100"
higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Kontrol konkurensi global
Fitur ini memerlukan gateway APIG Ingress versi 1.2.25 atau lebih baru.
Kontrol konkurensi global terintegrasi dengan Sentinel untuk memberlakukan batas permintaan konkuren di seluruh kluster untuk route tertentu. Saat batas terlampaui, respons bawaan adalah HTTP 429 dengan badan sentinel rate limited. Timpa ini dengan respons kustom atau pengalihan — tetapi tidak keduanya.
Respons kustom
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
higress.ingress.kubernetes.io/concurrency-limit |
Permintaan konkuren maksimum untuk route di seluruh kluster gateway. | — |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code |
Kode status HTTP saat kontrol konkurensi dipicu. | 429 |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type |
Format badan respons: text (text/plain; charset=UTF-8) atau json (application/json; charset=UTF-8). |
text |
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body |
Isi badan respons saat kontrol konkurensi dipicu. | sentinel rate limited |
Contoh 1: Batasi permintaan konkuren ke `example.com/test` hingga 1.000 dengan respons bawaan
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Batasi permintaan konkuren hingga 1.000; kembalikan HTTP 503 dengan badan `server is overloaded` saat batas tercapai
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pengalihan
Gunakan higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url untuk mengalihkan klien ke URL fallback saat kontrol konkurensi dipicu.
Contoh: Batasi permintaan konkuren hingga 1.000; alihkan ke `example.com/fallback` saat batas tercapai
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/concurrency-limit: "1000"
higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pencerminan lalu lintas
Pencerminan lalu lintas menyalin trafik permintaan langsung ke layanan bayangan tanpa memengaruhi alur permintaan asli. Gunakan untuk audit operasional, pengujian trafik, atau validasi versi layanan baru dalam mode bayangan.
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
higress.ingress.kubernetes.io/mirror-target-service |
Layanan tujuan untuk trafik yang dicerminkan. Format: namespace/name:port. Kolom namespace dan port bersifat opsional — namespace bawaan adalah namespace gateway Ingress, dan port bawaan adalah port pertama layanan. |
— |
higress.ingress.kubernetes.io/mirror-percentage |
Persentase trafik yang dicerminkan. Nilai valid: 0–100. | 100 |
Saat trafik yang dicerminkan diteruskan ke layanan tujuan, APIG Ingress secara otomatis menambahkan -shadow ke header Host. Misalnya, example.com menjadi example.com-shadow. Jika layanan tujuan menggunakan header Host untuk perutean atau pencatatan log, pertimbangkan penulisan ulang ini dalam konfigurasi layanan Anda.
Contoh 1: Cermin semua trafik dari `example.com/test` ke `test/app:8080`
Kluster Menjalankan Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Menjalankan Versi Sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Cermin 10% trafik dari `example.com/test` ke `test/app:8080`
Kluster Menjalankan Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
higress.ingress.kubernetes.io/mirror-percentage: "10"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Menjalankan Versi Sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
higress.ingress.kubernetes.io/mirror-percentage: "10"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Protokol layanan backend
Secara bawaan, APIG Ingress meneruskan permintaan ke layanan backend melalui HTTP. Gunakan anotasi nginx.ingress.kubernetes.io/backend-protocol untuk beralih ke HTTPS atau gRPC.
Jika nama port dalam resource Layanan Kubernetes diatur kegrpcatauhttp2, APIG Ingress secara otomatis menggunakan gRPC atau HTTP/2 untuk backend tersebut — tanpa anotasi. Ini berbeda dari NGINX Ingress, yang memerlukan anotasi dalam semua kasus.
Contoh 1: Teruskan permintaan ke backend HTTPS
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /
pathType: Exact
Kluster menjalankan versi Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Teruskan permintaan ke backend gRPC
Dua metode: anotasi (eksplisit) atau nama port Layanan (konvensi daripada konfigurasi).
Metode 1 — anotasi:
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan versi Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Metode 2 — nama port Layanan (grpc):
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
ports:
- name: grpc # APIG Ingress detects this and automatically uses gRPC
port: 80
protocol: TCP
selector:
app: demo-service
Kluster menjalankan versi Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
ports:
- name: grpc
port: 80
protocol: TCP
selector:
app: demo-service
Algoritma penyeimbangan beban untuk layanan backend
Algoritma penyeimbangan beban menentukan bagaimana gateway memilih node backend saat meneruskan permintaan.
Algoritma penyeimbangan beban umum
Gunakan nginx.ingress.kubernetes.io/load-balance untuk mengatur algoritma.
| Nilai | Deskripsi |
|---|---|
round_robin |
Mendistribusikan permintaan ke node backend secara bergiliran. Ini adalah bawaan. |
least_conn |
Mengarahkan setiap permintaan ke node dengan koneksi aktif paling sedikit. |
random |
Memilih node backend secara acak. |
APIG Ingress tidak mendukung algoritma exponentially weighted moving average (EWMA). Jika EWMA dikonfigurasi, sistem akan kembali ke round_robin.
Contoh: Gunakan least connections untuk backend demo-service
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Algoritma penyeimbangan beban berbasis penghashan konsisten
Penghashan konsisten memastikan bahwa permintaan dengan kunci yang sama selalu diarahkan ke node backend yang sama — berguna untuk aplikasi yang sadar sesi atau lokalitas cache. Atur kunci hash menggunakan nginx.ingress.kubernetes.io/upstream-hash-by.
Jenis kunci hash yang didukung:
| Kunci hash | Konfigurasi | Deskripsi |
|---|---|---|
| URI permintaan | $request_uri |
Termasuk parameter path. |
| Host | $host |
Header host permintaan. |
| IP klien | $remote_addr |
Alamat IP klien. |
| Header permintaan | $http_<header-name> |
Nilai header permintaan tertentu. |
| Parameter kueri | $arg_<param-name> |
Nilai parameter kueri URL tertentu. |
Contoh 1: Arahkan semua permintaan dari IP klien yang sama ke node backend yang sama
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Arahkan permintaan dengan nilai header `X-Stage` yang sama ke node backend yang sama
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 3: Arahkan permintaan dengan nilai parameter kueri `X-Stage` yang sama ke node backend yang sama
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Warmup (mulai mulus)
Warmup secara bertahap meningkatkan trafik ke node backend yang baru dimulai selama jendela waktu tertentu, memberinya waktu untuk menginisialisasi cache dan mengompilasi kode JIT sebelum menangani trafik puncak.
Gunakan higress.ingress.kubernetes.io/warmup untuk mengatur jendela warmup dalam detik. Warmup dinonaktifkan secara bawaan.
Warmup hanya didukung dengan algoritma penyeimbangan bebanround_robindanleast_conn.
Contoh: Lakukan warmup demo-service selama jendela 30 detik
Kluster menjalankan Kubernetes 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Afinitas cookie (persistensi sesi)
Afinitas cookie mengarahkan semua permintaan dari klien yang sama ke node backend yang sama. APIG Ingress menghasilkan cookie afinitas pada permintaan pertama; permintaan berikutnya membawa cookie tersebut dan diarahkan ke node yang sama.
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
nginx.ingress.kubernetes.io/affinity |
Jenis afinitas. Satu-satunya nilai yang valid adalah cookie. |
— |
nginx.ingress.kubernetes.io/affinity-mode |
Mode afinitas: balanced mendistribusikan sesi baru secara merata di backend; persistent selalu mengarahkan ke backend yang sama sepanjang masa cookie. |
balanced |
nginx.ingress.kubernetes.io/session-cookie-name |
Nama cookie yang digunakan sebagai kunci hash. | INGRESSCOOKIE |
nginx.ingress.kubernetes.io/session-cookie-path |
Path cookie yang dihasilkan. Harus sesuai dengan path Ingress. | / |
nginx.ingress.kubernetes.io/session-cookie-max-age |
Waktu kedaluwarsa cookie yang dihasilkan, dalam detik. Memiliki prioritas lebih tinggi daripada session-cookie-expires. |
Tingkat sesi |
nginx.ingress.kubernetes.io/session-cookie-expires |
Waktu kedaluwarsa cookie yang dihasilkan, dalam detik. | Tingkat sesi |
Contoh 1: Aktifkan afinitas cookie dengan pengaturan bawaan (nama cookie `INGRESSCOOKIE`, path `/`, masa berlaku tingkat sesi)
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Contoh 2: Aktifkan afinitas cookie dengan nama cookie kustom `test`, path `/`, dan kedaluwarsa 10 detik
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "test"
nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "test"
nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pool koneksi
Pool koneksi membatasi jumlah koneksi yang dibuka instans gateway ke layanan backend, mencegah kelebihan beban di bawah trafik tinggi.
| Anotasi | Deskripsi |
|---|---|
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection |
Koneksi TCP maksimum total antara instans gateway dan layanan backend. |
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint |
Koneksi TCP maksimum antara instans gateway dan satu Pod backend. |
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection |
Permintaan HTTP maksimum per koneksi TCP antara instans gateway dan layanan backend. |
Contoh: Batasi gateway hingga 10 koneksi total dan 2 koneksi per Pod untuk demo-service
Kluster Versi 1.19 dan Lebih Baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster Sebelum Versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Versi TLS dan paket sandi
Secara bawaan, APIG Ingress menerima koneksi TLS dari TLS 1.0 hingga TLS 1.3, menggunakan paket sandi berikut:
-
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
Gunakan anotasi berikut untuk membatasi rentang versi TLS atau paket sandi untuk domain tertentu:
| Anotasi | Deskripsi | Bawaan |
|---|---|---|
higress.ingress.kubernetes.io/tls-min-protocol-version |
Versi TLS minimum. Nilai valid: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. |
TLSv1.0 |
higress.ingress.kubernetes.io/tls-max-protocol-version |
Versi TLS maksimum. Nilai valid: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. |
TLSv1.3 |
nginx.ingress.kubernetes.io/ssl-cipher |
Paket sandi yang diizinkan, dipisahkan koma. Hanya berlaku untuk proses jabat tangan TLS 1.0–1.2. | — |
Contoh: Batasi `example.com` hanya ke TLS 1.2
Kluster versi 1.19 dan lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster sebelum versi 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Otentikasi mTLS dengan layanan backend
TLS satu arah (melalui nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", dijelaskan di Protokol layanan backend) hanya memverifikasi sertifikat backend. Untuk verifikasi timbal balik, konfigurasikan mTLS — backend juga memverifikasi sertifikat klien yang disajikan oleh gateway.
Gunakan anotasi berikut untuk mengonfigurasi sertifikat klien yang disajikan gateway:
| Anotasi | Deskripsi |
|---|---|
nginx.ingress.kubernetes.io/proxy-ssl-secret |
Sertifikat klien yang digunakan gateway untuk mengotentikasi dirinya ke layanan backend. Format: secretNamespace/secretName. |
nginx.ingress.kubernetes.io/proxy-ssl-name |
Nilai Indikasi Nama Server (SNI) yang digunakan selama proses jabat tangan TLS. |
nginx.ingress.kubernetes.io/proxy-ssl-server-name |
Aktifkan atau nonaktifkan SNI selama proses jabat tangan TLS. |
Contoh: Konfigurasikan mTLS antara gateway dan demo-service menggunakan sertifikat `default/gateway-cert`
Kluster menjalankan Kubernetes 1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kluster menjalankan Kubernetes sebelum 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: apig
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80