Microservices Engine (MSE) Ingress adalah objek API yang menyediakan load balancing Layer-7 untuk mengelola akses eksternal ke layanan dalam kluster Kubernetes. Topik ini menjelaskan penggunaan lanjutan MSE Ingress untuk membantu Anda mengelola lalu lintas masuk ke kluster.
Rilis Canary
MSE Ingress memungkinkan Anda mengonfigurasi rilis canary berdasarkan header, parameter query, cookie, atau bobot untuk menangani routing lalu lintas yang kompleks. Fitur ini diaktifkan dengan menambahkan anotasi nginx.ingress.kubernetes.io/canary: "true". Bagian ini menjelaskan cara menggunakan anotasi berbeda untuk mengonfigurasi metode rilis canary.
Jika keempat jenis metode rilis canary dikonfigurasi, MSE Ingress memilih metode berdasarkan urutan prioritas berikut: Rilis canary berbasis header atau parameter query > Rilis canary berbasis cookie > Rilis canary berbasis bobot.
Rilis canary berbasis header
Ketika hanya mengonfigurasi anotasi
nginx.ingress.kubernetes.io/canary-by-header, permintaan dikirim berdasarkan nilai header. Jika nilaiheaderadalahalways, permintaan dikirim ke versi canary. Dalam kasus lain, permintaan tidak dikirim ke versi canary.Ketika mengonfigurasi kedua anotasi
nginx.ingress.kubernetes.io/canary-by-header-value dan nginx.ingress.kubernetes.io/canary-by-header, permintaan hanya dikirim ke versi canary jika kunci dan nilai header sesuai dengan yang ditentukan dalam anotasi. Dalam kasus lain, permintaan tidak dikirim ke versi canary.
NGINX Ingress dan ALB Ingress mendukung hingga dua versi layanan selama rilis canary. MSE Ingress mendukung lebih dari dua versi layanan tanpa batasan jumlah.
Contoh:
Jika header permintaan adalah
mse:always, permintaan dikirim ke versi canary demo-service-canary. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service. Contoh konfigurasi:Kluster yang menjalankan Kubernetes V1.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: "mse" name: demo-canary spec: ingressClassName: mse 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: mse rules: - http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" name: demo-canary spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service servicePort: 80Jika header permintaan adalah
mse:v1, permintaan dikirim ke versi canary demo-service-canary-v1. Jika header permintaan adalahmse:v2, permintaan dikirim ke versi canary demo-service-canary-v2. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service. Contoh konfigurasi:Kluster yang menjalankan Kubernetes V1.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: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" name: demo-canary-v1 spec: ingressClassName: mse 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: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v2" name: demo-canary-v2 spec: ingressClassName: mse 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: mse rules: - http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" name: demo-canary-v1 spec: ingressClassName: mse 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: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v2" name: demo-canary-v2 spec: ingressClassName: mse 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: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service servicePort: 80
Rilis canary berbasis parameter query
Konfigurasikan mse.ingress.kubernetes.io/canary-by-query
Permintaan dikirim berdasarkan parameter query dalam URL. Jika kunci parameter query sama dengan yang ditentukan oleh anotasi dan nilai parameter query adalah always, permintaan dikirim ke versi canary. Dalam kasus lain, permintaan tidak dikirim ke versi canary.
Konfigurasikan mse.ingress.kubernetes.io/canary-by-query-value dan mse.ingress.kubernetes.io/canary-by-query
Jika
kunci parameter querydannilai parameter querysesuai dengan yang ditentukan oleh anotasi, permintaan dikirim ke versi canary. Dalam kasus lain, permintaan tidak dikirim ke versi canary.CatatanRilis canary berbasis header dapat digunakan bersama dengan rilis canary berbasis parameter query. Permintaan hanya dikirim ke versi canary jika kondisi pencocokan untuk kedua metode terpenuhi.
Contoh:
Jika parameter query dalam URL permintaan diatur ke
canary:gray, permintaan dikirim ke versi canary demo-service-canary. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service. Contoh konfigurasi:Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.ingress.kubernetes.io/canary-by-query-value: "gray" name: demo-canary spec: ingressClassName: mse 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: mse rules: - http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.ingress.kubernetes.io/canary-by-query-value: "gray" name: demo-canary spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service servicePort: 80Jika parameter query dalam URL permintaan diatur ke
canary:graydanx-user-id: testtermasuk dalam header permintaan, permintaan dikirim ke versi canary demo-service-canary. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service. Contoh konfigurasi:Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.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: mse 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: mse rules: - http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" mse.ingress.kubernetes.io/canary-by-query: "canary" mse.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: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service-canary servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service servicePort: 80
Rilis canary berbasis cookie
Jika mengonfigurasi anotasi nginx.ingress.kubernetes.io/canary-by-cookie, permintaan dikirim berdasarkan cookie. Jika cookie diatur ke always, permintaan dikirim ke versi canary. Dalam kasus lain, permintaan tidak dikirim ke versi canary.
Nilai cookie kustom tidak didukung. Nilai cookie harus diatur ke always.
Sebagai contoh, jika permintaan cookie adalah demo=always, permintaan dikirim ke versi canary demo-service-canary. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service. Contoh konfigurasi:
Klaster yang menjalankan Kubernetes V1.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-cookie: "demo"
name: demo-canary
spec:
ingressClassName: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: ExactKlaster yang menjalankan versi Kubernetes lebih lama dari V1.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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80Rilis canary berbasis bobot
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/canary-weight | Menentukan persentase permintaan yang dikirim ke versi canary. Nilainya adalah bilangan bulat yang berkisar dari 0 hingga 100. |
nginx.ingress.kubernetes.io/canary-weight-total | Menentukan bobot total. Nilai default: 100. |
Sebagai contoh, Anda dapat menetapkan bobot versi canary demo-service-canary-v1 menjadi 30%, versi canary demo-service-canary-v2 menjadi 20%, dan versi dasar demo-service menjadi 50%. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse
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: mse
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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.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: mse
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: mse
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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80Subset Layanan
Subset layanan cocok untuk skenario di mana layanan terkait dengan beberapa deployment. Anda dapat menggunakan Ingress untuk meneruskan permintaan ke subset pod dari layanan. Pada sebagian besar kasus, permintaan diteruskan ke pod layanan yang memiliki label tertentu. Subset layanan dapat dikonfigurasi dengan salah satu metode berikut:
Gunakan label pod dalam MseIngressConfig
Anotasi mse.ingress.kubernetes.io/service-subset digunakan untuk mengonfigurasi subset layanan. Secara default, subset layanan dipetakan ke label pod yang diawali dengan opensergo.io/canary. Anotasi ini memiliki arti sebagai berikut:
Jika diatur ke
""ataubase, permintaan diteruskan ke pod yang labelnya berisiopensergo.io/canary: ""atau pod yang kunci labelnya tidak diawali denganopensergo.io/canary. Dengan cara ini, permintaan diteruskan ke pod yang memiliki label kosong atau tidak memiliki label.Jika tidak diatur ke "" atau base, permintaan diteruskan ke pod yang labelnya berisi opensergo.io/canary-{Nilai yang Ditentukan}: {Nilai yang Ditentukan}. Sebagai contoh, jika diatur ke
gray, permintaan diteruskan ke pod yang labelnya berisiopensergo.io/canary-gray: gray.
Sebagai contoh, layanan Kubernetes bernama go-httpbin terkait dengan dua deployment. Pod yang dikelola oleh satu deployment tidak memiliki kunci label yang diawali dengan opensergo.io/canary. Pod yang dikelola oleh deployment lain memiliki label canary opensergo.io/canary-gray: gray. Contoh konfigurasi:
# go-httpbin k8s service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# 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/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# go-httpbin gray deployment
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/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbinJika header dari permintaan example.com/test berisi x-user-id: test, permintaan diteruskan ke go-httpbin-gray. Jika tidak, permintaan diteruskan ke httpbin-base. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Teruskan permintaan ke pod yang memiliki label canary opensergo.io/canary-gray: gray.
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact Kluster yang menjalankan versi Kubernetes sebelum V1.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"
# Teruskan permintaan ke pod yang memiliki label canary opensergo.io/canary-gray: gray.
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
# Konfigurasikan layanan go-httpbin dan tentukan versi dalam anotasi.
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
# Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
# Konfigurasikan layanan go-httpbin dan tentukan versi dalam anotasi.
serviceName: go-httpbin
servicePort: 8080Gunakan label kustom
Anotasi mse.ingress.kubernetes.io/service-subset dan mse.ingress.kubernetes.io/subset-labels digunakan untuk mengonfigurasi label kustom yang mendefinisikan pod tempat subset tersebut berada.
Dalam hal ini, subset tidak lagi dipetakan ke label yang awalannya adalah opensergo.io/canary.
Sebagai contoh, layanan Kubernetes bernama go-httpbin terkait dengan dua deployment. Pod yang dikelola oleh satu deployment tidak memiliki kunci label yang diawali dengan opensergo.io/canary. Pod yang dikelola oleh deployment lain memiliki label canary opensergo.io/canary-gray: gray. Contoh konfigurasi:
# go-httpbin k8s service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# 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/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# go-httpbin gray base
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/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbinJika header dari permintaan example.com/test berisi x-user-id: test, permintaan diteruskan ke go-httpbin-gray. Jika tidak, permintaan diteruskan ke httpbin-base.
Kluster yang menjalankan Kubernetes V1.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: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Teruskan permintaan ke pod yang memiliki label canary version: gray.
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact Kluster yang menjalankan versi Kubernetes sebelum V1.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"
# Teruskan permintaan ke pod yang memiliki label canary version: gray.
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
# Konfigurasikan layanan go-httpbin dan tentukan versi dalam anotasi.
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
# Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
# Konfigurasikan layanan go-httpbin dan tentukan versi dalam anotasi.
serviceName: go-httpbin
servicePort: 8080CORS
Berbagi sumber daya lintas asal (CORS) memungkinkan server aplikasi web untuk mengakses sumber daya lintas asal dan mengamankan transmisi data lintas asal. Untuk informasi lebih lanjut tentang CORS, lihat Berbagi Sumber Daya Lintas Asal (CORS).
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/enable-cors | Menentukan apakah akan mengaktifkan CORS. |
nginx.ingress.kubernetes.io/cors-allow-origin | Menentukan situs pihak ketiga yang diizinkan. Pisahkan situs pihak ketiga dengan koma (,). Wildcard (*) didukung. Nilai default: *. Ini menunjukkan bahwa semua situs pihak ketiga diizinkan untuk CORS. |
nginx.ingress.kubernetes.io/cors-allow-methods | Menentukan metode permintaan yang diizinkan seperti GET, POST, dan PUT. Pisahkan metode permintaan dengan koma (,). Wildcard (*) didukung. Nilai default: GET,PUT,POST,DELETE,PATCH,OPTIONS. |
nginx.ingress.kubernetes.io/cors-allow-headers | Menentukan header permintaan yang diizinkan. Pisahkan header permintaan dengan koma (,). Wildcard (*) didukung. Nilai default: 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 | Menentukan header respons yang dapat diekspos ke browser. Pisahkan header respons dengan koma (,). |
nginx.ingress.kubernetes.io/cors-allow-credentials | Menentukan apakah kredensial dapat disertakan dalam permintaan CORS. Secara default, kredensial dapat dilewatkan selama operasi CORS. |
nginx.ingress.kubernetes.io/cors-max-age | Menentukan periode maksimum waktu di mana hasil pra-pemeriksaan dapat di-cache. Unit: detik. Nilai default: 1728000. |
Sebagai contoh, konfigurasikan example.com sebagai situs pihak ketiga yang diizinkan, GET dan POST sebagai metode permintaan yang diizinkan, dan X-Foo-Bar sebagai header permintaan yang diizinkan, serta nonaktifkan pengiriman kredensial selama operasi CORS. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.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: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80Pencocokan ekspresi reguler
MSE Ingress mendukung pencocokan ekspresi reguler selain pencocokan tepat dan pencocokan awalan yang didukung oleh Kubernetes Ingress standar. Anotasi nginx.ingress.kubernetes.io/use-regex: true digunakan untuk mengubah pencocokan jalur menjadi pencocokan ekspresi reguler.
Sebagai contoh, jika nama domain yang diharapkan adalah example.com, permintaan dengan jalur permintaan yang dimulai dengan /app atau /test diteruskan ke layanan demo. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse
rules:
- http:
paths:
- backend:
service:
name: demo
port:
number: 8080
path: /(app|test)/(.*)
pathType: PrefixKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: 'true'
name: regex-match
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /(app|test)/(.*)
backend:
serviceName: demo
servicePort: 8080Rewrite Jalur dan Host
Operasi rewrite memodifikasi jalur dan host asli dalam permintaan sebelum permintaan tersebut diteruskan ke layanan backend tujuan.
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/rewrite-target | Menentukan jalur tujuan untuk operasi rewrite. Grup penangkapan didukung. |
nginx.ingress.kubernetes.io/upstream-vhost | Menentukan host tujuan untuk operasi rewrite. |
Rewrite Jalur
Sebelum permintaan example.com/test diteruskan ke layanan backend, rewrite example.com/test menjadi example.com/dev. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/dev" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/dev" name: demo spec: ingressClassName: mse rules: - http: paths: - path: /test pathType: Exact backend: serviceName: demo-service servicePort: 80Sebelum permintaan example.com/v1/xxx diteruskan ke layanan backend, hapus awalan /v1 dan rewrite permintaan menjadi example.com/xxx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/$1" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /v1/(.*) pathType: PrefixKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/$1" name: demo spec: ingressClassName: mse rules: - http: paths: - path: /v1/(.*) pathType: Prefix backend: serviceName: demo-service servicePort: 80Sebelum permintaan example.com/v1/xxx diteruskan ke layanan backend, ubah awalan /v1 menjadi /v2 dan rewrite permintaan menjadi example.com/v2/xxx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /v1/(.*) pathType: PrefixKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1" name: demo spec: ingressClassName: mse rules: - http: paths: - path: /v1/(.*) pathType: Prefix backend: serviceName: demo-service servicePort: 80
Rewrite Host
Sebagai contoh, sebelum permintaan example.com/test diteruskan ke layanan backend, rewrite example.com/test menjadi test.com/test. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Redirect
Redirect digunakan untuk mengubah permintaan klien asli menjadi permintaan tujuan.
Redirect HTTP ke HTTPS
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/ssl-redirect | Menentukan apakah akan mengarahkan ulang permintaan HTTP ke permintaan HTTPS. |
nginx.ingress.kubernetes.io/force-ssl-redirect | Menentukan apakah akan mengarahkan ulang permintaan HTTP ke permintaan HTTPS. |
MSE Ingress tidak membedakan kedua anotasi tersebut. Kedua anotasi tersebut digunakan untuk secara paksa mengarahkan ulang permintaan HTTP ke permintaan HTTPS.
Sebagai contoh, arahkan ulang permintaan http://example.com/test ke https://example.com/test. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Redirect permanen
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/permanent-redirect | Menentukan URL tujuan untuk redirect permanen. URL tujuan harus berisi skema, yaitu HTTP atau HTTPS. |
nginx.ingress.kubernetes.io/permanent-redirect-code | Menentukan kode status HTTP untuk redirect permanen. Nilai default: 301. |
Sebagai contoh, lakukan redirect permanen dari http://example.com/test ke http://example.com/app. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Redirect temporal
nginx.ingress.kubernetes.io/temporal-redirect: menentukan URL tujuan untuk redirect temporal. URL tujuan harus berisi skema, yaitu HTTP atau HTTPS.
Sebagai contoh, lakukan redirect temporal dari http://example.com/test ke http://example.com/app. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Kontrol Header
Kontrol header memungkinkan Anda menambah, menghapus, atau memodifikasi header permintaan sebelum MSE Ingress meneruskan permintaan ke layanan backend. Kontrol header juga memungkinkan Anda menambah, menghapus, atau memodifikasi header respons sebelum MSE Ingress meneruskan respons ke klien.
Kontrol Header Permintaan
Anotasi | Deskripsi |
mse.ingress.kubernetes.io/request-header-control-add | Menentukan header yang ditambahkan ke permintaan saat permintaan diteruskan ke layanan backend. Jika header sudah ada, nilainya digabungkan setelah nilai aslinya. Sintaks berikut digunakan:
|
mse.ingress.kubernetes.io/request-header-control-update | Menentukan header yang dimodifikasi dalam permintaan saat permintaan diteruskan ke layanan backend. Jika header sudah ada, nilainya menimpa nilai aslinya. Sintaks berikut digunakan:
|
mse.ingress.kubernetes.io/request-header-control-remove | Menentukan header yang dihapus dari permintaan saat permintaan diteruskan ke layanan backend. Sintaks berikut digunakan:
|
Contoh:
Tambahkan header foo: bar dan test: true ke permintaan example.com/test. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/request-header-control-add: | foo bar test true name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/request-header-control-add: | foo bar test true name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Kontrol header dapat digunakan bersama dengan rilis canary untuk mengidentifikasi permintaan yang dikirim ke versi canary. Jika header permintaan adalah mse: v1, permintaan dikirim ke versi canary demo-service-canary-v1 dan header stage: gray ditambahkan ke permintaan. Dalam kasus lain, permintaan dikirim ke versi dasar demo-service dan header stage: production ditambahkan ke permintaan. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" mse.ingress.kubernetes.io/request-header-control-add: "stage gray" name: demo-canary-v1 spec: ingressClassName: mse 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: mse.ingress.kubernetes.io/request-header-control-add: "stage production" name: demo spec: ingressClassName: mse rules: - http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "mse" nginx.ingress.kubernetes.io/canary-by-header-value: "v1" mse.ingress.kubernetes.io/request-header-control-add: "stage gray" name: demo-canary-v1 spec: ingressClassName: mse rules: - http: paths: - path: /hello backend: serviceName: demo-service-canary-v1 servicePort: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/request-header-control-add: | foo bar test true name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /hello backend: serviceName: demo-service servicePort: 80
Kontrol Header Respons
Anotasi | Deskripsi |
mse.ingress.kubernetes.io/response-header-control-add | Menentukan header yang ditambahkan ke respons yang diterima dari layanan backend sebelum respons tersebut diteruskan ke klien. Jika header sudah ada, nilainya digabungkan setelah nilai aslinya. Sintaks berikut digunakan:
|
mse.ingress.kubernetes.io/response-header-control-update | Menentukan header yang dimodifikasi dalam respons yang diterima dari layanan backend sebelum respons tersebut diteruskan ke klien. Jika header sudah ada, nilainya menimpa nilai aslinya. Sintaks berikut digunakan:
|
mse.ingress.kubernetes.io/response-header-control-remove | Menentukan header yang dihapus dari respons yang diterima dari layanan backend sebelum respons tersebut diteruskan ke klien. Sintaks berikut digunakan:
|
Sebagai contoh, hapus header req-cost-time dari respons permintaan example.com/test. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Pengulangan Permintaan
MSE Ingress menyediakan pengaturan ulang permintaan pada tingkat rute yang dapat digunakan untuk mengulangi permintaan secara otomatis jika terjadi kesalahan. Anda dapat menentukan kondisi pengulangan berdasarkan kebutuhan bisnis Anda. Sebagai contoh, Anda dapat mengonfigurasi pengaturan untuk mengulangi permintaan ketika pembuatan koneksi gagal, layanan backend tidak tersedia, atau kode status HTTP tertentu dikembalikan.
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/proxy-next-upstream-tries | Menentukan jumlah maksimum pengulangan permintaan. Nilai default: 3. |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout | Menentukan periode waktu habis untuk pengulangan permintaan. Unit: detik. Secara default, tidak ada batas waktu yang dikonfigurasi. |
nginx.ingress.kubernetes.io/proxy-next-upstream | Menentukan kondisi pengulangan. Pisahkan beberapa kondisi pengulangan dengan koma (,). Nilai default:
|
Sebagai contoh, permintaan example/test tersedia. Untuk permintaan ini, atur jumlah maksimum pengulangan permintaan menjadi 2, atur batas waktu pengulangan menjadi 5 detik, picu pengulangan hanya ketika kode status 502 dikembalikan, dan aktifkan pengulangan untuk permintaan non-idempoten. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.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: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Kontrol Akses Berdasarkan Daftar Putih dan Daftar Hitam Alamat IP
MSE Ingress menyediakan daftar putih dan daftar hitam alamat IP pada tingkat nama domain dan rute. Daftar putih dan daftar hitam alamat IP pada tingkat rute memiliki prioritas lebih tinggi daripada daftar putih dan daftar hitam alamat IP pada tingkat nama domain.
Daftar Putih dan Daftar Hitam Alamat IP pada Tingkat Rute
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/whitelist-source-range | Menentukan daftar putih alamat IP untuk rute tertentu. Alamat IP dan blok CIDR didukung. Pisahkan alamat IP atau blok CIDR dengan koma (,). |
mse.ingress.kubernetes.io/blacklist-source-range | Menentukan daftar hitam alamat IP untuk rute tertentu. Alamat IP dan blok CIDR didukung. Pisahkan alamat IP atau blok CIDR dengan koma (,). |
Contoh:
Izinkan akses ke example.com/test dari alamat IP klien 1.1.xx.xx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau 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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.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: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Tolak akses ke example.com/test dari alamat IP klien 2.2.xx.xx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2 name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2 name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80
Daftar Putih dan Daftar Hitam Alamat IP pada Tingkat Nama Domain
Anotasi | Deskripsi |
mse.ingress.kubernetes.io/domain-whitelist-source-range | Menentukan daftar putih alamat IP untuk nama domain tertentu. Daftar putih alamat IP pada tingkat rute memiliki prioritas lebih tinggi daripada daftar putih alamat IP pada tingkat nama domain. Alamat IP dan blok CIDR didukung. Pisahkan alamat IP atau blok CIDR dengan koma (,). |
mse.ingress.kubernetes.io/domain-blacklist-source-range | Menentukan daftar hitam alamat IP untuk nama domain tertentu. Daftar hitam alamat IP pada tingkat rute memiliki prioritas lebih tinggi daripada daftar hitam alamat IP pada tingkat nama domain. Alamat IP dan blok CIDR didukung. Pisahkan alamat IP atau blok CIDR dengan koma (,). |
Contoh:
Izinkan akses ke semua rute dari nama domain example.com dari alamat IP klien 1.1.xx.xx dan 2.2.xx.xx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 name: demo spec: ingressClassName: mse 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: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80 - path: /app backend: serviceName: app-service servicePort: 80Gunakan daftar putih dan daftar hitam alamat IP pada tingkat nama domain bersama dengan daftar putih dan daftar hitam alamat IP pada tingkat rute. Izinkan akses ke semua rute dari nama domain example.com dari alamat IP klien 1.1.xx.xx dan 2.2.xx.xx, dan izinkan akses ke rute example.com/order hanya dari alamat IP klien 3.3.xx.xx. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 name: demo-domain spec: ingressClassName: mse 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 --- 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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /order pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2 name: demo-domain spec: ingressClassName: mse 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: mse rules: - host: example.com http: paths: - path: /order backend: serviceName: demo-service servicePort: 80
Throttling Gateway Tunggal
MSE Ingress memungkinkan Anda mengonfigurasi kebijakan throttling untuk instance gateway tunggal pada tingkat rute. Kebijakan throttling memastikan bahwa jumlah permintaan yang cocok pada rute untuk replika gateway tidak melebihi ambang batas yang dikonfigurasi dalam periode waktu tertentu.
Sistem melakukan throttling untuk instance gateway tunggal berdasarkan ambang batas yang dikonfigurasi. Jika Anda ingin melakukan throttling terhadap lalu lintas rute untuk kluster gateway, Anda dapat menggunakan kebijakan kontrol throttling global sebagai gantinya.
Anotasi | Deskripsi |
mse.ingress.kubernetes.io/route-limit-rpm | Menentukan jumlah maksimum permintaan per menit (RPM) yang dirutekan pada gateway. Batas burst untuk jumlah maksimum RPM sama dengan nilai yang ditentukan dikalikan dengan mse.ingress.kubernetes.io/route-limit-burst-multiplier. Ketika throttling dipicu, isi badan respons adalah
|
mse.ingress.kubernetes.io/route-limit-rps | Menentukan jumlah maksimum permintaan per detik (RPS) yang dirutekan pada gateway. Batas burst untuk jumlah maksimum RPS sama dengan nilai yang ditentukan dikalikan dengan mse.ingress.kubernetes.io/route-limit-burst-multiplier. Ketika throttling dipicu, isi badan respons adalah
|
mse.ingress.kubernetes.io/route-limit-burst-multiplier | Menentukan pengali batas burst. Nilai default: 5. |
Contoh:
Untuk permintaan example.com/test, atur jumlah maksimum RPM menjadi 100 dan batas burst untuk jumlah maksimum RPM menjadi 200. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/route-limit-rpm: "100" mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/route-limit-rpm: "100" mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Untuk permintaan example.com/test, atur jumlah maksimum RPS menjadi 10 dan batas burst untuk jumlah maksimum RPS menjadi 50. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/route-limit-rps: "10" # Nilai default adalah 5. # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: mse.ingress.kubernetes.io/route-limit-rps: "10" # Nilai default adalah 5. # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80
Kontrol Throttling Global
MSE Ingress terintegrasi dengan Sentinel untuk menyediakan kontrol throttling global untuk kluster gateway pada tingkat rute. Untuk menerapkan kontrol throttling global, Anda harus menentukan jumlah maksimum RPS pada rute dalam kluster gateway.
Untuk menggunakan fitur ini, pastikan bahwa versi gateway MSE Ingress adalah 1.2.25 atau lebih baru.
Anotasi mse.ingress.kubernetes.io/rate-limit digunakan untuk menentukan jumlah maksimum RPS pada suatu rute di dalam kluster gateway. Secara default, kode respons adalah 429, dan badan respons adalah sentinel rate limited ketika pembatasan laju dipicu. MSE Ingress menyediakan dua metode untuk mengonfigurasi perilaku pembatasan laju kustom: respons kustom dan pengalihan. Anda hanya dapat memilih salah satu dari kedua metode tersebut.
Respons Kustom
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: kode respons ketika throttling dipicu. Kode respons default adalah 429.mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type: jenis badan respons ketika throttling dipicu. Jenis badan respons default adalahtext.Jika diatur ke
text, nilai Content-Type dalam respons adalahtext/plain; charset=UTF-8.Jika diatur ke
json, nilai Content-Type dalam respons adalahapplication/json; charset=UTF-8.
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: badan respons ketika throttling dipicu. Nilai default adalahsentinel rate limited.
Contoh 1: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster gateway menjadi 100 dan pertahankan perilaku throttling default. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Contoh 2: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster gateway menjadi 100 dan atur kode respons menjadi 503 serta badan respons menjadi server is overload ketika throttling dipicu.
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Redirect
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: URL redirect ketika throttling dipicu.
Contoh 1: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster gateway menjadi 100 dan URL redirect menjadi example.com/fallback ketika throttling dipicu.
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes sebelum V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Kontrol Konkurensi Global
MSE Ingress terintegrasi dengan Sentinel untuk menyediakan kontrol konkurensi global untuk kluster gateway pada tingkat rute. Untuk menerapkan kontrol konkurensi global, Anda harus menentukan jumlah maksimum permintaan yang sedang diproses pada rute dalam kluster gateway.
Untuk menggunakan fitur ini, pastikan bahwa versi gateway MSE Ingress adalah 1.2.25 atau lebih baru.
Anotasi mse.ingress.kubernetes.io/concurrency-limit digunakan untuk menentukan jumlah maksimum permintaan yang dapat diproses pada rute dalam kluster gateway. Ketika kontrol konkurensi global dipicu, kode respons adalah 429 dan badan respons adalah sentinel rate limited. MSE Ingress menyediakan dua metode untuk mengonfigurasi perilaku konkurensi kustom: respons kustom dan redirect. Anda hanya dapat memilih salah satu dari kedua metode tersebut.
Respons Kustom
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: kode respons ketika kontrol konkurensi dipicu. Kode respons default adalah 429.mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type: jenis badan respons ketika kontrol konkurensi dipicu. Jenis badan respons default adalahtext.Jika diatur ke
text, nilai Content-Type dalam respons adalahtext/plain; charset=UTF-8.Jika diatur ke
json, nilai Content-Type dalam respons adalahapplication/json; charset=UTF-8.
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: badan respons ketika kontrol konkurensi dipicu. Nilai default adalahsentinel rate limited.
Contoh 1: Atur jumlah maksimum permintaan example.com/test yang diproses pada kluster gateway menjadi 1000 dan pertahankan perilaku kontrol konkurensi default. Contoh konfigurasi:
Klaster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKlaster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Contoh 2: Atur jumlah maksimum permintaan dari example.com/test yang diproses pada kluster gateway menjadi 1.000 dan atur kode respons menjadi 503 serta badan respons menjadi server is overloaded ketika kontrol konkurensi dipicu.
Klaster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKlaster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Redirect
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: URL pengalihan saat kontrol konkurensi dipicu.
Atur jumlah maksimum permintaan example.com/test yang diproses pada kluster gateway menjadi 1000 dan URL pengalihan ke example.com/fallback saat kontrol konkurensi dipicu.
Klaster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKlaster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Traffic mirroring
Anda dapat mengonfigurasi pemantulan trafik untuk menyalin trafik ke layanan tertentu. Pemantulan trafik cocok untuk skenario seperti audit operasional dan pengujian trafik.
mse.ingress.kubernetes.io/mirror-target-service: layanan tujuan ke mana trafik yang disalin diteruskan. Format layanan adalah namespace/nama:port.
namespace: namespace tempat layanan Kubernetes berada. Parameter ini opsional. Namespace default adalah namespace tempat Ingress gateway berada.
name: nama layanan Kubernetes. Parameter ini wajib.
port: port layanan Kubernetes ke mana trafik yang dipantulkan diteruskan. Parameter ini opsional. Secara default, port pertama digunakan.
mse.ingress.kubernetes.io/mirror-percentage: persentase trafik yang dipantulkan. Nilai valid: 0-100. Nilai default: 100.
Ketika trafik yang disalin diteruskan ke layanan tujuan, akhiran -shadow secara otomatis ditambahkan ke header Host dalam permintaan asli.
Sebagai contoh, permintaan dari example.com/test disalin dan diteruskan ke layanan tujuan test/app:8080.
Dalam contoh ini, nilai header Host secara otomatis diubah menjadi example.com-shadow ketika trafik yang disalin diteruskan ke layanan tujuan.
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Sebagai contoh, permintaan dari example.com/test disalin dan diteruskan ke layanan tujuan test/app:8080 dan persentase trafik yang dipantulkan adalah 10%.
Dalam contoh ini, nilai header Host secara otomatis diubah menjadi example.com-shadow saat trafik yang disalin diteruskan ke layanan tujuan.
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Protokol layanan backend: HTTPS dan gRPC
Secara default, MSE Ingress menggunakan HTTP untuk meneruskan permintaan ke kontainer layanan backend. Jika kontainer layanan backend Anda menggunakan HTTPS, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk meneruskan permintaan ke kontainer layanan backend Anda. Jika kontainer layanan backend Anda menggunakan gRPC, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "GRPC" untuk meneruskan permintaan ke kontainer layanan backend Anda.
Jika gRPC atau HTTP/2 ditentukan untuk nama dalam port konfigurasi sumber daya untuk layanan Kubernetes tempat layanan backend Anda berada, MSE Ingress secara otomatis menggunakan protokol gRPC atau HTTP/2 untuk meneruskan permintaan ke kontainer layanan backend Anda. Anda tidak perlu mengonfigurasi anotasi nginx.ingress.kubernetes.io/backend-protocol: "GRPC". Implementasi ini berbeda dari yang ada di NGINX Ingress.
Contoh:
Gunakan HTTPS untuk meneruskan permintaan example/test ke layanan backend. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: / pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Gunakan gRPC untuk meneruskan permintaan example/test ke layanan backend. Metode berikut dapat digunakan:
Metode 1: Gunakan anotasi. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Metode 2: Gunakan spec > ports > name dalam konfigurasi sumber daya Ingress. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo spec: ingressClassName: mse 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 port: 80 protocol: TCP selector: app: demo-serviceKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo spec: ingressClassName: mse 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 cara memilih node ketika gateway meneruskan permintaan ke layanan backend.
Algoritma penyeimbangan beban umum
nginx.ingress.kubernetes.io/load-balance: menentukan algoritma penyeimbangan beban umum yang digunakan oleh layanan backend. Nilai default: round_robin. Nilai valid:
round_robin: penyeimbangan beban berdasarkan round robin.
least_conn: penyeimbangan beban berdasarkan koneksi paling sedikit.
random: penyeimbangan beban secara acak.
Gateway berbasis cloud-native tidak mendukung algoritma rata-rata bergerak tertimbang eksponensial (EWMA). Jika Anda mengonfigurasi algoritma EWMA, algoritma tersebut akan dikembalikan ke algoritma penyeimbangan beban round robin.
Sebagai contoh, konfigurasikan algoritma penyeimbangan beban koneksi paling sedikit untuk layanan backend demo-service. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Algoritma penyeimbangan beban berdasarkan penghashan konsisten
Algoritma penyeimbangan beban berdasarkan penghashan konsisten memiliki afinitas permintaan. Permintaan dengan karakteristik yang sama selalu didistribusikan ke node yang sama. MSE Ingress dapat menggunakan variabel NGINX, header permintaan, dan parameter jalur permintaan sebagai kunci hash.
nginx.ingress.kubernetes.io/upstream-hash-by: menentukan algoritma penyeimbangan beban berdasarkan penghashan konsisten. Gateway berbasis cloud-native mendukung jenis-jenis penghashan konsisten berikut:
Penghashan konsisten berdasarkan variabel NGINX:
$request_uri: jalur permintaan, yang digunakan sebagai kunci hash. Parameter jalur termasuk.
$host: host permintaan, yang digunakan sebagai kunci hash.
$remote_addr: alamat IP klien, yang digunakan sebagai kunci hash.
Penghashan konsisten berdasarkan header permintaan. Anda hanya perlu mengonfigurasi $http_headerName.
Penghashan konsisten berdasarkan parameter jalur permintaan. Anda hanya perlu mengonfigurasi $arg_varName.
Contoh:
Gunakan alamat IP klien untuk permintaan sebagai kunci hash. Permintaan dari alamat IP klien selalu didistribusikan ke node yang sama. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Gunakan header permintaan X-Stage sebagai kunci hash, dan distribusikan permintaan dengan nilai yang sama dari header permintaan X-Stage ke node yang sama. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Gunakan parameter jalur permintaan X-Stage sebagai kunci hash, dan distribusikan permintaan dengan nilai yang sama dari parameter jalur permintaan X-Stage ke node yang sama. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80
Pra-pemuatan layanan (mulai dengan lancar)
Fitur pra-pemuatan layanan memungkinkan lalu lintas meningkat secara bertahap dalam jendela pra-pemuatan layanan tertentu ketika sebuah node baru dirilis. Hal ini memastikan bahwa node tersebut sepenuhnya dipra-pemuat.
mse.ingress.kubernetes.io/warmup: menentukan periode waktu di mana layanan dipra-pemuat. Satuan: detik. Secara default, fitur pra-pemuatan layanan tidak diaktifkan.
Pra-pemuatan layanan bergantung pada algoritma penyeimbangan beban yang dipilih. Hanya algoritma penyeimbangan beban berbasis round robin dan koneksi paling sedikit yang didukung.
Sebagai contoh, aktifkan fitur pra-pemuatan layanan untuk layanan backend demo-service dan atur jendela waktu pra-pemuatan menjadi 30 detik. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Afinitas Cookie (persistensi sesi)
Permintaan dengan cookie yang sama selalu didistribusikan ke node yang sama pada gateway cloud-native. Jika klien mengirimkan permintaan pertama dengan cookie ke gateway, MSE Ingress akan mengembalikan respons yang berisi cookie yang dihasilkan untuk klien. Cookie yang dihasilkan digunakan untuk memastikan bahwa permintaan berikutnya selalu didistribusikan ke node yang sama dari gateway.
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/affinity | Menentukan tipe afinitas. Nilai default dan satu-satunya yang valid adalah cookie. |
nginx.ingress.kubernetes.io/affinity-mode | Menentukan mode afinitas. Nilai default dan satu-satunya yang valid adalah balanced. |
nginx.ingress.kubernetes.io/session-cookie-name | Menentukan nama cookie yang digunakan sebagai kunci hash. Nilai default: INGRESSCOOKIE. |
nginx.ingress.kubernetes.io/session-cookie-path | Menentukan jalur cookie yang dihasilkan jika cookie yang ditentukan tidak ada. Nilai default: /. |
nginx.ingress.kubernetes.io/session-cookie-max-age | Menentukan waktu kedaluwarsa cookie yang dihasilkan ketika cookie yang ditentukan tidak ada. Satuan: detik. Secara default, anotasi ini ditentukan pada tingkat sesi. |
nginx.ingress.kubernetes.io/session-cookie-expires | Menentukan waktu kedaluwarsa cookie yang dihasilkan ketika cookie yang ditentukan tidak ada. Satuan: detik. Secara default, anotasi ini ditentukan pada tingkat sesi. |
Contoh:
Aktifkan afinitas cookie dan gunakan konfigurasi default MSE Ingress. Atur nama cookie menjadi INGRESSCOOKIE, atur jalur menjadi /, dan konfigurasikan siklus hidup cookie pada tingkat sesi. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/affinity: "cookie" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/affinity: "cookie" name: demo spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80Aktifkan afinitas cookie dan atur nama cookie menjadi test, jalur menjadi /, dan waktu kedaluwarsa cookie menjadi 10 detik. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.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: mse rules: - host: example.com http: paths: - backend: service: name: demo-service port: number: 80 path: /test pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.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: mse rules: - host: example.com http: paths: - path: /test backend: serviceName: demo-service servicePort: 80
Konfigurasi kumpulan koneksi antara gateway dan layanan backend
Setelah Anda mengonfigurasi kumpulan koneksi untuk layanan backend tertentu di gateway, Anda dapat mengontrol jumlah koneksi antara gateway dan layanan backend. Hal ini membantu mencegah layanan backend kelebihan beban dan memastikan stabilitas serta ketersediaan tinggi dari layanan backend.
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: jumlah maksimum koneksi yang dapat dibuat antara gateway dan layanan backend.
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: jumlah maksimum koneksi yang dapat dibuat antara gateway dan satu node dari layanan backend.
mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection: jumlah maksimum permintaan pada satu koneksi antara gateway dan layanan backend.
Sebagai contoh, untuk layanan backend demo-service, Anda dapat menetapkan jumlah maksimum koneksi yang dapat dibuat antara gateway dan layanan backend menjadi 10, dan menetapkan jumlah maksimum koneksi yang dapat dibuat antara gateway dan satu node dari layanan backend menjadi 2.
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80Versi TLS dan cipher suites untuk komunikasi antara klien dan gateway cloud-native
Versi TLS paling awal yang didukung secara default oleh MSE Ingress adalah TLSv1.0. Versi TLS terbaru secara default adalah TLSv1.3. Secara default, cipher suites berikut digunakan:
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
Tabel berikut menjelaskan anotasi yang dapat digunakan untuk menentukan versi TLS paling awal atau terbaru dan cipher suites untuk nama domain tertentu.
Anotasi | Deskripsi |
mse.ingress.kubernetes.io/tls-min-protocol-version | Menentukan versi TLS paling awal. Nilai default: TLSv1.0. Nilai valid:
|
mse.ingress.kubernetes.io/tls-max-protocol-version | Menentukan versi TLS terbaru. Nilai default: TLSv1.3. |
nginx.ingress.kubernetes.io/ssl-cipher | Menentukan cipher suites TLS. Anda dapat menentukan beberapa cipher suites TLS, yang dipisahkan dengan koma (,). Anotasi ini hanya berlaku jika versi TLS dari v1.0 hingga v1.2 digunakan dalam proses jabat tangan TLS. |
Sebagai contoh, nama domain example.com tersedia. Untuk nama domain ini, atur versi TLS paling awal ke TLSv1.2 dan versi terbaru ke TLSv1.2. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes V1.19 atau lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80mTLS antara gateway dan layanan backend
Secara default, MSE Ingress menggunakan HTTP untuk meneruskan permintaan ke kontainer layanan backend. Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengizinkan MSE Ingress mengakses layanan backend melalui HTTPS. Dalam hal ini, TLS satu arah digunakan. MSE Ingress memverifikasi sertifikat yang diberikan oleh layanan backend dan sertifikat tersebut harus diterbitkan oleh otoritas sertifikat (CA) terpercaya. Mutual TLS (mTLS) juga diizinkan. Jika mTLS digunakan, gateway dan layanan backend melakukan autentikasi dua arah. Gateway memverifikasi apakah sertifikat yang diberikan oleh layanan backend valid dan layanan backend memverifikasi apakah sertifikat yang diberikan oleh gateway valid.
Anotasi | Deskripsi |
nginx.ingress.kubernetes.io/proxy-ssl-secret | Menentukan sertifikat klien yang digunakan oleh gateway. Sertifikat klien digunakan agar layanan backend dapat mengautentikasi gateway. Formatnya adalah secretNamespace/secretName. |
nginx.ingress.kubernetes.io/proxy-ssl-name | Menentukan Server Name Indication (SNI) yang digunakan selama proses jabat tangan TLS. |
nginx.ingress.kubernetes.io/proxy-ssl-server-name | Menentukan apakah akan mengaktifkan atau menonaktifkan SNI yang digunakan selama proses jabat tangan TLS. |
Sebagai contoh, lakukan mTLS antara gateway berbasis cloud-native dan layanan backend, atur secretName menjadi gateway-cert, dan atur secretNamespace menjadi default. Contoh konfigurasi:
Kluster yang menjalankan Kubernetes 1.19 dan versi lebih baru
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/ateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ExactKluster yang menjalankan versi Kubernetes lebih lama dari V1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/ateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80