全部产品
Search
文档中心

API Gateway:Fitur Lanjutan dari APIG Ingress

更新时间:Dec 04, 2025

Dalam klaster Kubernetes, APIG Ingress adalah objek API yang menyediakan penyeimbangan beban lapisan 7 untuk mengelola akses eksternal ke layanan. Topik ini menjelaskan fitur lanjutan dari APIG Ingress yang dapat digunakan untuk mengelola lalu lintas masuk ke klaster Anda.

Rilis Canary

APIG Ingress menyediakan kemampuan pengarahan, termasuk dukungan untuk rilis canary berdasarkan header, parameter kueri, cookie, dan bobot. Fitur ini dapat dikonfigurasi dengan menambahkan anotasi ke sumber daya Ingress Anda. Untuk mengaktifkan rilis canary, tambahkan anotasi nginx.ingress.kubernetes.io/canary: "true". Anda juga dapat menggunakan anotasi spesifik lainnya untuk mengimplementasikan berbagai jenis rilis canary.

Catatan

Ketika beberapa metode dikonfigurasikan, urutan prioritas untuk pemilihan rilis canary adalah: Berdasarkan header | Berdasarkan parameter kueri > Berdasarkan cookie > Berdasarkan bobot (dari tinggi ke rendah).

Rilis canary berbasis header

  • Jika hanya mengonfigurasi nginx.ingress.kubernetes.io/canary-by-header, lalu lintas diarahkan berdasarkan header permintaan. Jika nilai header yang dikonfigurasi adalah always, lalu lintas diarahkan ke titik akhir layanan canary. Sebaliknya, lalu lintas tidak diarahkan ke layanan canary.

  • Jika mengonfigurasi kedua nginx.ingress.kubernetes.io/canary-by-header-value dan nginx.ingress.kubernetes.io/canary-by-header, lalu lintas hanya diarahkan ke layanan canary jika header dan nilai header dalam permintaan sesuai dengan nilai yang dikonfigurasi. Sebaliknya, lalu lintas tidak diarahkan ke layanan canary.

Catatan

NGINX Ingress dan ALB Ingress mendukung maksimal dua versi layanan selama rilis canary. APIG Ingress mendukung jumlah versi layanan tak terbatas selama rilis canary.

Contoh:

  • Jika header permintaan adalah apig: always, permintaan diarahkan ke layanan canary demo-service-canary. Jika tidak, permintaan diarahkan ke layanan produksi demo-service. Kode contoh berikut menunjukkan konfigurasinya:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: Exact          

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Jika header permintaan adalah apig: v1, permintaan diarahkan ke layanan canary demo-service-canary-v1. Jika header permintaan adalah apig: v2, permintaan diarahkan ke layanan canary demo-service-canary-v2. Jika tidak, permintaan diarahkan ke layanan produksi demo-service. Kode contoh berikut menunjukkan konfigurasinya:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
      name: demo-canary-v1
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary-v1
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
      name: demo-canary-v2
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary-v2
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
      name: demo-canary-v1
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary-v1
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
      name: demo-canary-v2
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary-v2
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service
                  servicePort: 80

Rilis canary berbasis parameter query

  • Konfigurasikan hanya higress.ingress.kubernetes.io/canary-by-query

    Permintaan dikirim berdasarkan parameter query di URL. Di URL permintaan, 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 baik higress.ingress.kubernetes.io/canary-by-query-value maupun higress.ingress.kubernetes.io/canary-by-query

    Jika kunci parameter kueri dan nilai parameter kueri dalam permintaan cocok dengan nilai yang dikonfigurasi, lalu lintas diarahkan ke layanan canary. Sebaliknya, lalu lintas tidak diarahkan ke layanan 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 kueri dalam URL permintaan adalah canary: gray, permintaan diarahkan ke layanan canary demo-service-canary. Sebaliknya, permintaan diarahkan ke layanan produksi demo-service. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion:networking.k8s.io/v1 
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        higress.ingress.kubernetes.io/canary-by-query: "canary"
        higress.ingress.kubernetes.io/canary-by-query-value: "gray"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: Exact 

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        higress.ingress.kubernetes.io/canary-by-query: "canary"
        higress.ingress.kubernetes.io/canary-by-query-value: "gray"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Jika parameter kueri dalam URL permintaan adalah canary: gray dan header permintaan berisi x-user-id: test, permintaan diarahkan ke layanan canary demo-service-canary. Sebaliknya, permintaan diarahkan ke layanan produksi demo-service. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion:networking.k8s.io/v1 
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        higress.ingress.kubernetes.io/canary-by-query: "canary"
        higress.ingress.kubernetes.io/canary-by-query-value: "gray"
        nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
        nginx.ingress.kubernetes.io/canary-by-header-value: "test"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: Exact 

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        higress.ingress.kubernetes.io/canary-by-query: "canary"
        higress.ingress.kubernetes.io/canary-by-query-value: "gray"
        nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
        nginx.ingress.kubernetes.io/canary-by-header-value: "test"
      name: demo-canary
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service
                  servicePort: 80

Rilis canary berbasis cookie

nginx.ingress.kubernetes.io/canary-by-cookie: Anotasi ini membagi lalu lintas berdasarkan cookie. Jika nilai cookie yang dikonfigurasi adalah always, lalu lintas diarahkan ke layanan canary. Sebaliknya, lalu lintas tidak diarahkan ke layanan canary.

Catatan

Rilis canary berbasis cookie tidak mendukung nilai kustom. Nilai cookie yang dikonfigurasi harus always.

Sebagai contoh, jika cookie permintaan adalah demo=always, permintaan diarahkan ke layanan canary demo-service-canary. Sebaliknya, permintaan diarahkan ke layanan produksi demo-service. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port: 
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /hello
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Rilis canary berbasis bobot

Anotasi

Deskripsi

nginx.ingress.kubernetes.io/canary-weight

Menentukan persentase permintaan yang dikirim ke versi canary. Nilainya adalah bilangan bulat yang berkisar antara 0 hingga 100.

nginx.ingress.kubernetes.io/canary-weight-total

Menentukan total bobot. Nilai default: 100.

Sebagai contoh, Anda dapat menyetel bobot versi canary demo-service-canary-v1 menjadi 30%, bobot versi canary demo-service-canary-v2 menjadi 20%, dan bobot versi dasar demo-service menjadi 50%. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port: 
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v2
                port: 
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /hello
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v2
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Subset layanan

Subset layanan cocok untuk skenario di mana Layanan terkait dengan beberapa Deployment. Anda dapat menggunakan Ingress untuk meneruskan permintaan ke subset pod dari sebuah Layanan. Pada sebagian besar kasus, permintaan diteruskan ke pod Layanan yang memiliki label tertentu. Anda dapat mengonfigurasi subset layanan menggunakan salah satu metode berikut:

Gunakan konvensi label pod untuk APIG Ingress

Anda dapat menggunakan anotasi higress.ingress.kubernetes.io/service-subset untuk mengatur versi layanan. Secara default, APIG Ingress memetakan versi layanan yang dikonfigurasi ke label pod yang diawali dengan `opensergo.io/canary`. Anotasi ini bekerja sebagai berikut:

  • Jika nilainya adalah "" atau base, permintaan diteruskan ke pod yang memiliki label opensergo.io/canary: "" atau tidak memiliki kunci label dengan awalan opensergo.io/canary. Pod ini dianggap memiliki label kosong atau tanpa label.

  • Jika nilainya diatur ke string lain, permintaan diteruskan ke pod yang memiliki label `opensergo.io/canary-{value}: {value}`. Sebagai contoh, jika nilainya adalah gray, permintaan diteruskan ke pod dengan label opensergo.io/canary-gray: gray.

Sebagai contoh, Layanan Kubernetes bernama go-httpbin dikaitkan 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/apig/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/apig/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:

Cluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion:networking.k8s.io/v1 
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "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.
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port: 
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port: 
                  number: 8080
            path: /test
            pathType: Exact 

Cluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Teruskan permintaan ke pod yang memiliki label canary opensergo.io/canary-gray: gray.
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              # 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.
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              # Konfigurasikan layanan go-httpbin dan tentukan versi dalam anotasi.
              serviceName: go-httpbin
              servicePort: 8080

Gunakan label kustom

Anda dapat mengonfigurasi label kustom untuk mendefinisikan koleksi pod untuk subset dengan menyetel anotasi higress.ingress.kubernetes.io/service-subset dan higress.ingress.kubernetes.io/subset-labels.

Catatan

Dalam hal ini, subset tidak lagi dipetakan ke label yang awalannya adalah opensergo.io/canary.

Sebagai contoh, Layanan Kubernetes bernama go-httpbin dikaitkan 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 version: 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/apig/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# go-httpbin base gray
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        version: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

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.

Cluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion:networking.k8s.io/v1 
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Teruskan permintaan ke pod yang memiliki label canary version: gray.
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port: 
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # Teruskan permintaan ke pod yang labelnya tidak diawali dengan opensergo.io/canary.
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port: 
                  number: 8080
            path: /test
            pathType: Exact 

Cluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Teruskan permintaan ke pod yang memiliki label canary version: gray.
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              # 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.
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  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 (,). Anda dapat menggunakan tanda bintang (*) sebagai karakter wildcard. Nilai default: *. Nilai 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 (,). Anda dapat menggunakan tanda bintang (*) sebagai karakter wildcard. 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 (,). Anda dapat menggunakan tanda bintang (*) sebagai karakter wildcard. 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 diizinkan dibawa 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 disimpan dalam 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 1.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: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /hello
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Pencocokan ekspresi reguler

Ingress Kubernetes standar hanya mendukung pencocokan tepat dan awalan, tetapi APIG Ingress juga mendukung pencocokan ekspresi reguler. Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/use-regex: true untuk mengaktifkan pencocokan ekspresi reguler untuk jalur yang didefinisikan dalam spesifikasi Ingress.

Jika nama domain yang diharapkan adalah example.com, permintaan yang jalurnya dimulai dengan /app atau /test diteruskan ke layanan demo. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
  name: regex-match
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo
                port: 
                  number: 8080
            path: /(app|test)/(.*)
            pathType: Prefix

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
  name: regex-match
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /(app|test)/(.*)
            backend:
              serviceName: demo
              servicePort: 8080

Pengubahan jalur dan host

Anda dapat melakukan operasi rewrite untuk 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

Tulis ulang Host

Pengubahan jalur

  1. Sebelum permintaan example.com/test diteruskan ke layanan backend, ubah example.com/test menjadi example.com/dev. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: "/dev"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: "/dev"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /test
                pathType: Exact
                backend:
                  serviceName: demo-service
                  servicePort: 80
  2. Sebelum permintaan example.com/v1/xxx diteruskan ke layanan backend, hapus awalan /v1 dan ubah permintaan menjadi example.com/xxx. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: "/$1"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /v1/(.*)
                pathType: Prefix

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: "/$1"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /v1/(.*) 
              	pathType: Prefix
                backend:
                  serviceName: demo-service
                  servicePort: 80
  3. Sebelum permintaan example.com/v1/xxx diteruskan ke layanan backend, ubah awalan /v1 menjadi /v2 dan ubah permintaan menjadi example.com/v2/xxx. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.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: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /v1/(.*)
                pathType: Prefix

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /v1/(.*)
                pathType: Prefix
                backend:
                  serviceName: demo-service
                  servicePort: 80

Pengubahan host

Sebagai contoh, sebelum permintaan example.com/test diteruskan ke layanan backend, ubah example.com/test menjadi test.com/test. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.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: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirect

Redirect digunakan untuk mengubah permintaan klien asli menjadi permintaan tujuan.

Redirect HTTP ke HTTPS

Anotasi

Deskripsi

nginx.ingress.kubernetes.io/ssl-redirect

Mengalihkan HTTP ke HTTPS

nginx.ingress.kubernetes.io/force-ssl-redirect

Menentukan apakah akan mengarahkan ulang permintaan HTTP ke permintaan HTTPS.

Catatan

APIG Ingress memperlakukan kedua anotasi tersebut sama dan secara paksa mengarahkan ulang permintaan HTTP ke HTTPS.

Sebagai contoh, arahkan ulang permintaan http://example.com/test ke https://example.com/test. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

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 1.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: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirect sementara

nginx.ingress.kubernetes.io/temporal-redirect: menentukan URL tujuan untuk redirect sementara. URL tujuan harus berisi skema, yaitu HTTP atau HTTPS.

Sebagai contoh, lakukan redirect sementara dari http://example.com/test ke http://example.com/app. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.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: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Kontrol header

Kontrol header memungkinkan Anda menambah, menghapus, atau memodifikasi header permintaan sebelum Higress Ingress meneruskan permintaan ke layanan backend. Kontrol header juga memungkinkan Anda menambah, menghapus, atau memodifikasi header respons sebelum Higress Ingress meneruskan respons yang diterima ke klien.

Kontrol header permintaan

Anotasi

Deskripsi

higress.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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Gunakan karakter khusus YAML |, dengan setiap pasangan kunci-nilai pada baris terpisah.

higress.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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Gunakan karakter khusus YAML |, dengan setiap pasangan kunci-nilai pada baris terpisah.

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

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

  • 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/request-header-control-add: |
          foo bar
          test true
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/request-header-control-add: |
          foo bar
          test true
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com 
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Anda dapat menggabungkan kontrol header dengan rilis bertahap untuk memberi tag trafik canary. Jika header permintaan adalah apig: v1, permintaan diarahkan ke layanan canary demo-service-canary-v1 dan header stage: gray ditambahkan. Jika tidak, permintaan diarahkan ke layanan produksi demo-service dan header stage: production ditambahkan. Kode contoh berikut menunjukkan konfigurasinya:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
        higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
      name: demo-canary-v1
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-canary-v1
                    port: 
                      number: 80
                path: /hello
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/request-header-control-add: "stage production"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "apig"
        nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
        higress.ingress.kubernetes.io/request-header-control-add: "stage gray"
      name: demo-canary-v1
    spec:
      ingressClassName: apig
      rules:
        - http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service-canary-v1
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/request-header-control-add: |
          foo bar
          test true
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com 
          http:
            paths:
              - path: /hello
                backend:
                  serviceName: demo-service
                  servicePort: 80

Kontrol header respons

Anotasi

Deskripsi

higress.ingress.kubernetes.io/response-header-control-add

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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Gunakan karakter khusus YAML |, dengan setiap pasangan kunci-nilai pada baris terpisah.

higress.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:

  • Header tunggal: Digunakan pasangan kunci-nilai.

  • Beberapa header: Gunakan karakter khusus YAML |, dengan setiap pasangan kunci-nilai pada baris terpisah.

higress.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:

  • Header tunggal: Digunakan kunci.

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

Sebagai contoh, hapus header req-cost-time dari respons terhadap permintaan example.com/test. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Percobaan ulang

APIG Ingress menyediakan pengaturan percobaan ulang tingkat rute untuk secara otomatis mencoba ulang permintaan yang gagal. Anda dapat mengatur kondisi percobaan ulang sesuai kebutuhan. Sebagai contoh, Anda dapat mencoba ulang permintaan ketika 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 percobaan ulang permintaan. Nilai default: 3.

nginx.ingress.kubernetes.io/proxy-next-upstream-timeout

Menentukan periode waktu habis untuk percobaan ulang permintaan. Unit: detik. Secara default, tidak ada periode waktu habis yang dikonfigurasi.

nginx.ingress.kubernetes.io/proxy-next-upstream

Kondisi untuk mencoba ulang permintaan. Pisahkan beberapa kondisi dengan koma (,). Nilai default adalah error,timeout. Nilai valid adalah:

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

  • timeout: Pembuatan koneksi habis waktu dan kode status 5xx dikembalikan.

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

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

  • non_idempotent: Percobaan ulang dipicu untuk permintaan non-idempoten yang gagal. Secara default, APIG Ingress tidak mencoba ulang permintaan non-idempoten yang gagal, seperti permintaan POST dan PATCH. Jika Anda mengonfigurasi `non_idempotent`, Anda dapat mengaktifkan percobaan ulang untuk permintaan ini.

  • off: Percobaan ulang dinonaktifkan.

Sebagai contoh, permintaan example/test tersedia. Untuk permintaan tersebut, atur jumlah maksimum percobaan ulang permintaan menjadi 2, atur periode waktu habis percobaan ulang menjadi 5 detik, picu percobaan ulang hanya saat kode status 502 dikembalikan, dan aktifkan percobaan ulang untuk permintaan non-idempoten. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.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: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com 
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Kontrol akses berdasarkan daftar putih dan daftar hitam alamat IP

APIG Ingress menyediakan kontrol akses daftar hitam dan daftar putih alamat IP pada tingkat domain dan rute. Aturan tingkat rute memiliki prioritas lebih tinggi daripada aturan tingkat 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 (,).

higress.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:

  • Mengizinkan akses ke example.com/test dari alamat IP klien 1.1.xx.xx. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.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: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com 
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Tolak akses ke example.com/test dari alamat IP klien 2.2.xx.xx. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80

Daftar putih dan daftar hitam alamat IP pada tingkat nama domain

Anotasi

Deskripsi

higress.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 (,).

higress.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:

  • Mengizinkan 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact
             - backend:
                  service:
                    name: app-service
                    port: 
                      number: 80
                path: /app
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
              - path: /app
                backend:
                  serviceName: app-service
                  servicePort: 80
  • 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
      name: demo-domain
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact
             - backend:
                  service:
                    name: app-service
                    port: 
                      number: 80
                path: /app
                pathType: Exact
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
      name: demo-route
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /order
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
      name: demo-domain
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
              - path: /app
                backend:
                  serviceName: app-service
                  servicePort: 80
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
      name: demo-route
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /order
                backend:
                  serviceName: demo-service
                  servicePort: 80

Throttling gateway tunggal

APIG Ingress mendukung kebijakan pembatasan kecepatan tingkat rute untuk instance gateway tunggal. Kebijakan ini membatasi jumlah permintaan untuk rute tertentu pada setiap replika gateway ke ambang batas yang ditentukan dalam periode tertentu.

Catatan

Sistem melakukan throttling untuk instance Cloud-native API Gateway tunggal berdasarkan ambang batas yang dikonfigurasi. Jika Anda ingin melakukan throttling terhadap lalu lintas rute untuk kluster Cloud-native API Gateway, Anda dapat menggunakan kebijakan kontrol throttling global sebagai gantinya.

Anotasi

Deskripsi

higress.ingress.kubernetes.io/route-limit-rpm

Menentukan jumlah maksimum permintaan per menit (RPM) yang dirutekan pada instance Cloud-native API Gateway. Batas burst untuk jumlah maksimum RPM sama dengan nilai yang ditentukan dikalikan dengan higress.ingress.kubernetes.io/route-limit-burst-multiplier.

Ketika pembatasan kecepatan dipicu, badan respons adalah local_rate_limited. Kode status respons adalah sebagai berikut:

  • Jika versi Cloud-native API Gateway lebih awal dari 1.2.23, kode status 503 dikembalikan.

  • Jika versi Cloud-native API Gateway adalah 1.2.23 atau lebih baru, kode status 429 dikembalikan.

higress.ingress.kubernetes.io/route-limit-rps

Menentukan jumlah maksimum permintaan per detik (RPS) yang dirutekan pada instance Cloud-native API Gateway. Batas burst untuk jumlah maksimum RPS sama dengan nilai yang ditentukan dikalikan dengan higress.ingress.kubernetes.io/route-limit-burst-multiplier.

Ketika pembatasan kecepatan dipicu, badan respons adalah local_rate_limited. Kode status respons adalah sebagai berikut:

  • Jika versi Cloud-native API Gateway lebih awal dari 1.2.23, kode status 503 dikembalikan.

  • Jika versi Cloud-native API Gateway adalah 1.2.23 atau lebih baru, kode status 429 dikembalikan.

higress.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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/route-limit-rpm: "100"
        higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/route-limit-rpm: "100"
        higress.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/route-limit-rps: "10"
        # Nilai default adalah 5.
        # higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        higress.ingress.kubernetes.io/route-limit-rps: "10"
        # Nilai default adalah 5.
        # higress.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80

Kontrol throttling global

APIG Ingress terintegrasi dengan Sentinel untuk menyediakan pembatasan kecepatan tingkat rute secara global untuk klaster gateway. Ini membatasi jumlah maksimum permintaan per detik (RPS) untuk rute tertentu di seluruh klaster.

Catatan

Fitur ini memerlukan versi APIG Ingress gateway 1.2.25 atau lebih baru.

Gunakan anotasi higress.ingress.kubernetes.io/rate-limit untuk mengatur jumlah maksimum RPS untuk rute di seluruh klaster gateway. Saat pembatasan kecepatan dipicu, perilaku default adalah mengembalikan kode status 429 dengan badan respons `sentinel rate limited`. APIG Ingress menyediakan dua cara untuk menyesuaikan perilaku ini: respons kustom atau pengalihan. Anda hanya dapat menggunakan salah satu dari metode ini.

Respons kustom

  • higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: Kode status respons saat pembatasan kecepatan dipicu. Defaultnya adalah 429.

  • higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type: Format badan respons saat pembatasan kecepatan dipicu. Defaultnya adalah text.

    • Jika disetel ke text, Content-Type dari respons adalah text/plain; charset=UTF-8.

    • Jika disetel ke json, Content-Type dari respons adalah application/json; charset=UTF-8.

  • higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: Badan respons saat pembatasan kecepatan dipicu. Defaultnya adalah sentinel rate limited.

Contoh 1: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster Cloud-native API Gateway menjadi 100 dan pertahankan perilaku throttling default. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Contoh 2: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster Cloud-native API Gateway menjadi 100 dan atur kode respons menjadi 503 serta badan respons menjadi server is overload saat throttling dipicu.

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Pengalihan

  • higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: URL untuk dialihkan ketika Pembatasan kecepatan dipicu.

Contoh 1: Atur jumlah maksimum RPS permintaan example.com/test dalam kluster Cloud-native API Gateway menjadi 100 dan URL redirect menjadi example.com/fallback saat throttling dipicu.

Cluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Cluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/rate-limit: "100"
    higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Kontrol konkurensi global

Ingress APIG terintegrasi dengan Sentinel untuk menyediakan kontrol konkurensi tingkat rute secara global untuk klaster gateway. Ini membatasi jumlah maksimum permintaan bersamaan yang diproses untuk rute tertentu di seluruh klaster.

Catatan

Fitur ini memerlukan versi gateway Ingress APIG 1.2.25 atau lebih baru.

Gunakan anotasi higress.ingress.kubernetes.io/concurrency-limit untuk menetapkan jumlah maksimum permintaan bersamaan untuk sebuah rute di seluruh klaster gateway. Ketika kontrol konkurensi dipicu, tanggapan default memiliki kode status 429 dan badan respons sentinel rate limited. Ingress APIG menyediakan dua cara untuk menyesuaikan perilaku ini: tanggapan kustom atau pengalihan. Anda hanya dapat menggunakan salah satu dari metode ini.

Respons kustom

  • higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: Kode status tanggapan ketika kontrol konkurensi dipicu. Defaultnya adalah 429.

  • higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type: Format badan respons ketika kontrol konkurensi dipicu. Defaultnya adalah text.

    • Jika disetel ke text, Content-Type dari tanggapan adalah text/plain; charset=UTF-8.

    • Jika disetel ke json, Content-Type dari tanggapan adalah application/json; charset=UTF-8.

  • higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: Badan respons ketika kontrol konkurensi dipicu. Defaultnya adalah sentinel rate limited.

Contoh 1: Atur jumlah maksimum permintaan example.com/test yang diproses pada kluster gateway menjadi 1.000 dan pertahankan perilaku kontrol konkurensi default. Contoh konfigurasi:

Klaster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Klaster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Contoh 2: Batasi jumlah maksimum permintaan bersamaan untuk `example.com/test` pada kluster gateway menjadi 1.000. Ketika kontrol konkurensi dipicu, kembalikan kode status 503 dan badan respons server is overloaded.

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: "503"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overload"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirection

  • higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: URL untuk dialihkan ketika kontrol konkurensi dipicu.

Atur jumlah maksimum permintaan example.com/test yang diproses oleh kluster API Gateway berbasis cloud menjadi 1.000 dan URL pengalihan ke example.com/fallback saat kontrol konkurensi dipicu.

Klaster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Klaster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/concurrency-limit: "1000"
    higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Traffic mirroring

Anda dapat mengonfigurasi pemantulan trafik untuk menyalin trafik ke layanan tertentu. Pemantulan trafik cocok untuk skenario seperti audit operasional dan pengujian trafik.

  • higress.ingress.kubernetes.io/mirror-target-service: layanan tujuan ke mana trafik yang disalin diteruskan. Format layanan adalah namespace/nama:port.

    • namespace: namespace tempat Kubernetes Service berada. Parameter ini opsional. Namespace default adalah namespace tempat Ingress gateway berada.

    • name: nama dari Kubernetes Service. Parameter ini wajib.

    • port: port Kubernetes Service ke mana trafik yang dipantulkan diteruskan. Parameter ini opsional. Secara default, port pertama digunakan.

  • higress.ingress.kubernetes.io/mirror-percentage: persentase trafik yang dipantulkan. Nilai valid: 0 hingga 100. Nilai default: 100.

Catatan

Saat 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 saat trafik yang disalin diteruskan ke layanan tujuan.

Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

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 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
    higress.ingress.kubernetes.io/mirror-percentage: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/mirror-target-service: test/app:8080
    higress.ingress.kubernetes.io/mirror-percentage: "10"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Protokol layanan backend: HTTPS dan gRPC

Secara default, APIG Ingress menggunakan HTTP untuk meneruskan permintaan ke kontainer aplikasi backend. Jika kontainer aplikasi Anda menggunakan HTTPS, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi APIG Ingress agar mengakses layanan backend melalui HTTPS. Jika kontainer aplikasi Anda adalah layanan gRPC, Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "GRPC" untuk meneruskan permintaan melalui gRPC.

Catatan

Berbeda dengan NGINX Ingress, jika nama port dalam sumber daya layanan Kubernetes untuk layanan backend Anda didefinisikan sebagai `gRPC` atau `HTTP2`, Anda tidak perlu mengonfigurasi anotasi nginx.ingress.kubernetes.io/backend-protocol: "GRPC". APIG Ingress secara otomatis menggunakan gRPC atau HTTP/2.

Contoh:

  • Gunakan HTTPS untuk meneruskan permintaan example/test ke layanan backend. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Gunakan gRPC untuk meneruskan permintaan example/test ke layanan backend. Metode berikut dapat digunakan:

    • Metode 1: Gunakan anotasi. Contoh konfigurasi:

      Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
        name: demo
      spec:
        ingressClassName: apig
        rules:
          - host: example.com
            http:
              paths:
                - backend:
                    service:
                      name: demo-service
                      port: 
                        number: 80
                  path: /test
                  pathType: Exact

      Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        annotations:
          nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
        name: demo
      spec:
        ingressClassName: apig
        rules:
          - host: example.com
            http:
              paths:
                - path: /test
                  backend:
                    serviceName: demo-service
                    servicePort: 80
    • Metode 2: Konfigurasikan layanan menggunakan Nama Port Layanan sebagai berikut:

      Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo
      spec:
        ingressClassName: apig
        rules:
          - host: example.com
            http:
              paths:
                - backend:
                    service:
                      name: demo-service
                      port: 
                        number: 80
                  path: /order
                  pathType: Exact
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: demo-service
      spec:
        ports:
          - name: grpc
            port: 80
            protocol: TCP
        selector:
          app: demo-service

      Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: demo
      spec:
        ingressClassName: apig
        rules:
          - host: example.com
            http:
              paths:
                - path: /test
                  backend:
                    serviceName: demo-service
                    servicePort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: demo-service
      spec:
        ports:
          - name: grpc
            port: 80
            protocol: TCP
        selector:
          app: demo-service

Algoritma penyeimbangan beban untuk layanan backend

Algoritma penyeimbangan beban menentukan bagaimana node dipilih ketika instance API Gateway berbasis cloud-native 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

API 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 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /order
            pathType: Exact

Kluster yang menjalankan versi Kubernetes sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Algoritma penyeimbangan beban berdasarkan penghashan konsisten

Algoritma penyeimbangan beban berbasis hashing konsisten memberikan afinitas permintaan, yang memastikan bahwa permintaan dengan karakteristik yang sama selalu dirutekan ke node yang sama. APIG Ingress mendukung penggunaan 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:

  • Cloud-native gateway mendukung konfigurasi variabel Nginx tertentu:

    • $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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • 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 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes sebelum 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80

Pra-pemuatan layanan (mulai dengan lancar)

Fitur pra-pemuatan layanan memungkinkan lalu lintas meningkat secara bertahap dalam jendela pra-pemuatan layanan yang ditentukan ketika node baru dirilis. Ini memastikan bahwa node sepenuhnya dipra-pemuat.

higress.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 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Afinitas Cookie (persistensi sesi)

Gateway selalu merutekan permintaan dengan cookie yang sama ke node yang sama. Jika permintaan pertama klien tidak memiliki cookie afinitas, APIG Ingress menghasilkannya dalam respons. Ini memastikan bahwa permintaan berikutnya dari klien tersebut selalu dirutekan ke node yang sama.

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:

  • Untuk mengaktifkan afiniasi cookie dengan konfigurasi APIG Ingress default, gunakan kode sampel berikut. Nama cookie default adalah `INGRESSCOOKIE`, jalurnya adalah `/`, dan siklus hidup cookie berada pada tingkat sesi.

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/affinity: "cookie"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/affinity: "cookie"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80
  • Aktifkan afinitas cookie dan atur nama cookie menjadi test, jalur menjadi /, dan waktu kedaluwarsa cookie menjadi 10 detik. Contoh konfigurasi:

    Kluster yang menjalankan Kubernetes 1.19 atau lebih baru

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/affinity: "cookie"
        nginx.ingress.kubernetes.io/session-cookie-name: "test"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /test
                pathType: Exact

    Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/affinity: "cookie"
        nginx.ingress.kubernetes.io/session-cookie-name: "test"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
      name: demo
    spec:
      ingressClassName: apig
      rules:
        - host: example.com
          http:
            paths:
              - path: /test
                backend:
                  serviceName: demo-service
                  servicePort: 80

Konfigurasi kumpulan koneksi antara instance Cloud-native API Gateway dan layanan backend

Setelah Anda mengonfigurasi kumpulan koneksi untuk layanan backend tertentu pada instance Cloud-native API Gateway, Anda dapat mengontrol jumlah koneksi antara instance Cloud-native API Gateway dan layanan backend. Hal ini membantu mencegah layanan backend kelebihan beban dan memastikan stabilitas serta ketersediaan tinggi layanan backend.

  • higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: jumlah maksimum koneksi yang dapat dibentuk antara instance Cloud-native API Gateway dan layanan backend.

  • higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: jumlah maksimum koneksi yang dapat dibentuk antara instance Cloud-native API Gateway dan satu node dari layanan backend.

  • higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection: jumlah maksimum permintaan pada satu koneksi antara instance Cloud-native API Gateway dan layanan backend.

Sebagai contoh, untuk layanan backend demo-service, Anda dapat menetapkan jumlah maksimum koneksi yang dapat dibentuk antara instance Cloud-native API Gateway dan layanan backend menjadi 10, dan menetapkan jumlah maksimum koneksi yang dapat dibentuk antara instance Cloud-native API Gateway dan satu node dari layanan backend menjadi 2.

Cluster yang menjalankan Kubernetes 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Cluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection: "10"
    higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: "2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Versi TLS dan cipher suite untuk komunikasi antara klien dan instance Cloud-native API Gateway

Secara default, APIG Ingress mendukung versi TLS dari 1.0 hingga 1.3. Paket sandi default adalah:

  • 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 suite untuk nama domain tertentu.

Anotasi

Deskripsi

higress.ingress.kubernetes.io/tls-min-protocol-version

Menentukan versi minimum TLS. Nilai default: TLSv1.0. Nilai valid:

  • TLSv1.0

  • TLSv1.1

  • TLSv1.2

  • TLSv1.3

higress.ingress.kubernetes.io/tls-max-protocol-version

Menentukan versi terbaru TLS. Nilai default: TLSv1.3.

nginx.ingress.kubernetes.io/ssl-cipher

Menentukan cipher suite TLS. Anda dapat menentukan beberapa cipher suite TLS, yang dipisahkan dengan koma (,). Anotasi ini hanya berlaku jika versi TLS dari v1.0 hingga v1.2 digunakan untuk 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 1.19 atau lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    higress.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Autentikasi mTLS antara instance Cloud-native API Gateway dan layanan backend

Secara default, APIG Ingress menggunakan HTTP untuk meneruskan permintaan ke kontainer aplikasi backend. Anda dapat menggunakan anotasi nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" untuk mengonfigurasi APIG Ingress agar mengakses layanan backend melalui HTTPS. Ini adalah TLS satu arah, di mana hanya APIG Ingress yang memverifikasi sertifikat yang diberikan oleh layanan backend. Sertifikat layanan backend harus diterbitkan oleh Otoritas Sertifikat (CA) tepercaya. Untuk model zero-trust yang lebih aman, Anda dapat menggunakan mutual TLS (mTLS). Dengan mTLS, gateway dan layanan backend melakukan otentikasi timbal balik. Gateway memverifikasi sertifikat layanan backend, dan layanan backend memverifikasi sertifikat gateway.

Anotasi

Deskripsi

nginx.ingress.kubernetes.io/proxy-ssl-secret

Menentukan sertifikat klien yang digunakan oleh instance Cloud-native API Gateway. Sertifikat klien digunakan agar layanan backend dapat mengautentikasi instance Cloud-native API 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 instance Cloud-native API Gateway dan layanan backend, atur secretName menjadi gateway-cert, dan atur secretNamespace menjadi default. Contoh konfigurasi:

Kluster yang menjalankan Kubernetes 1.19 dan yang lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port: 
                  number: 80
            path: /test
            pathType: Exact

Kluster yang menjalankan versi Kubernetes lebih lama dari 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80