全部产品
Search
文档中心

Microservices Engine:Penggunaan Lanjutan MSE Ingress

更新时间:Jul 02, 2025

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.

Catatan

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 nilai header adalah always, 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.

Catatan

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: 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: "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: 80
  • Jika header permintaan adalah mse:v1, permintaan dikirim ke versi canary demo-service-canary-v1. Jika header permintaan adalah mse: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: 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: "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 query dan nilai parameter query sesuai dengan yang ditentukan oleh anotasi, permintaan dikirim ke versi canary. Dalam kasus lain, permintaan tidak dikirim ke versi canary.

    Catatan

    Rilis 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: Exact 

    Kluster 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: 80
  • Jika parameter query dalam URL permintaan diatur ke canary:gray dan x-user-id: test termasuk 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: Exact 

    Kluster 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.

Catatan

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: Exact

Klaster 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: 80

Rilis 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: Exact

Kluster 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: 80

Subset 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 "" atau base, permintaan diteruskan ke pod yang labelnya berisi opensergo.io/canary: "" atau pod yang kunci labelnya tidak diawali dengan opensergo.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 berisi opensergo.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-httpbin

Jika 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: 8080

Gunakan 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.

Catatan

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-httpbin

Jika 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: 8080

CORS

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: Exact

Kluster 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: 80

Pencocokan 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: Prefix

Kluster 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: 8080

Rewrite 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

  1. 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: Exact

    Kluster 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: 80
  2. Sebelum 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: Prefix

    Kluster 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: 80
  3. Sebelum 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: Prefix

    Kluster 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: Exact

Kluster 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: 80

Redirect

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.

Catatan

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: Exact

Kluster 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: 80

Redirect 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: Exact

Kluster 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: 80

Redirect 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: Exact

Kluster 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: 80

Kontrol 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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Digunakan tanda vertikal (|) dalam file YAML. Setiap pasangan kunci-nilai menempati baris terpisah.

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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Digunakan tanda vertikal (|) dalam file YAML. Setiap pasangan kunci-nilai menempati baris terpisah.

mse.ingress.kubernetes.io/request-header-control-remove

Menentukan header yang dihapus dari permintaan saat permintaan diteruskan ke layanan backend. Sintaks berikut digunakan:

  • Header tunggal: Digunakan kunci.

  • Beberapa header: Pisahkan beberapa header dengan koma (,).

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: Exact

    Kluster 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: 80
  • Kontrol 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: 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: "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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Digunakan tanda vertikal (|) dalam file YAML. Setiap pasangan kunci-nilai menempati baris terpisah.

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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Digunakan tanda vertikal (|) dalam file YAML. Setiap pasangan kunci-nilai menempati baris terpisah.

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:

  • Header tunggal: Digunakan kunci.

  • Beberapa header: Pisahkan beberapa header dengan koma (,).

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: Exact

Kluster 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: 80

Pengulangan 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: error,timeout. Nilai valid:

  • error: Pembuatan koneksi gagal dan kode status 5xx dikembalikan.

  • timeout: Waktu habis saat pembuatan koneksi dan kode status 5xx dikembalikan.

  • invalid_header: Terjadi kesalahan permintaan dan kode status 5xx dikembalikan.

  • http_xxx: Pengulangan dipicu berdasarkan kode status yang dikembalikan. Contoh: http_502 dan http_403.

  • non_idempotent: Pengulangan dipicu ketika kesalahan dikembalikan untuk permintaan seperti permintaan non-idempoten. Secara default, MSE Ingress tidak mengulangi permintaan non-idempoten seperti POST dan PATCH jika kesalahan dikembalikan untuk permintaan tersebut. Jika Anda mengatur nginx.ingress.kubernetes.io/proxy-next-upstream ke non_idempotent, pengulangan dapat diaktifkan untuk permintaan non-idempoten.

  • off: Pengulangan dinonaktifkan.

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: Exact

Kluster 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: 80

Kontrol 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: Exact

    Kluster 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: 80
  • Tolak 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: Exact

    Kluster 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: Exact

    Kluster 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: 80
  • Gunakan 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: Exact

    Kluster 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.

Catatan

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 local_rate_limited. Kode status respons:

  • Jika versi gateway lebih awal dari V1.2.23, kode status 503 dikembalikan.

  • Jika versi gateway adalah V1.2.23 atau lebih baru, kode status 429 dikembalikan.

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 local_rate_limited. Kode status respons:

  • Jika versi gateway lebih awal dari V1.2.23, kode status 503 dikembalikan.

  • Jika versi gateway adalah V1.2.23 atau lebih baru, kode status 429 dikembalikan.

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: Exact

    Kluster 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: 80
  • Untuk 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: Exact

    Kluster 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.

Catatan

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 adalah text.

    • Jika diatur ke text, nilai Content-Type dalam respons adalah text/plain; charset=UTF-8.

    • Jika diatur ke json, nilai Content-Type dalam respons adalah application/json; charset=UTF-8.

  • mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: badan respons ketika throttling dipicu. Nilai default adalah sentinel 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: Exact

Kluster 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: 80

Contoh 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: Exact

Kluster 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: 80

Redirect

  • 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: Exact

Kluster 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: 80

Kontrol 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.

Catatan

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 adalah text.

    • Jika diatur ke text, nilai Content-Type dalam respons adalah text/plain; charset=UTF-8.

    • Jika diatur ke json, nilai Content-Type dalam respons adalah application/json; charset=UTF-8.

  • mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: badan respons ketika kontrol konkurensi dipicu. Nilai default adalah sentinel 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: Exact

Klaster 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: 80

Contoh 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: Exact

Klaster 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: 80

Redirect

  • 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: Exact

Klaster 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: 80

Traffic 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.

Catatan

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.

Catatan

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: Exact

Kluster 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: 80

Sebagai contoh, permintaan dari example.com/test disalin dan diteruskan ke layanan tujuan test/app:8080 dan persentase trafik yang dipantulkan adalah 10%.

Catatan

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: Exact

Kluster 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: 80

Protokol 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.

Catatan

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: Exact

    Kluster 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: 80
  • Gunakan 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: Exact

      Kluster 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: 80
    • Metode 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-service

      Kluster 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.

Penting

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: Exact

Kluster 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: 80

Algoritma 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: Exact

    Kluster 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: 80
  • Gunakan 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: Exact

    Kluster 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: 80
  • Gunakan 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: Exact

    Kluster 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.

Catatan

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: Exact

Kluster 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: 80

Afinitas 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: Exact

    Kluster 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: 80
  • Aktifkan 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: Exact

    Kluster 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: Exact

Kluster 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: 80

Versi 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:

  • TLSv1.0

  • TLSv1.1

  • TLSv1.2

  • TLSv1.3

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: Exact

Kluster 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: 80

mTLS 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: Exact

Kluster 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