All Products
Search
Document Center

API Gateway:Penggunaan Ingress APIG Tingkat Lanjut

Last Updated:Sep 10, 2026

APIG Ingress mengelola akses eksternal ke layanan kluster dengan load balancing lapisan 7. Tambahkan anotasi pada resource Ingress Anda untuk mengonfigurasi perutean trafik tingkat lanjut, pembatasan laju, dan fitur keamanan.

Contoh dalam topik ini menggunakan awalan anotasi nginx.ingress.kubernetes.io dan higress.ingress.kubernetes.io. Awalan yang berlaku untuk setiap anotasi ditampilkan dalam indeks anotasi di bawah.

Indeks anotasi

Klik nama anotasi untuk melompat ke deskripsinya.

Anotasi Tipe Lingkup Fitur
nginx.ingress.kubernetes.io/canary string ("true") Route Rilis canary
nginx.ingress.kubernetes.io/canary-by-header string Route Rilis canary berbasis header
nginx.ingress.kubernetes.io/canary-by-header-value string Route Rilis canary berbasis header
higress.ingress.kubernetes.io/canary-by-query string Route Rilis canary berbasis parameter kueri
higress.ingress.kubernetes.io/canary-by-query-value string Route Rilis canary berbasis parameter kueri
nginx.ingress.kubernetes.io/canary-by-cookie string Route Rilis canary berbasis cookie
nginx.ingress.kubernetes.io/canary-weight integer (0–100) Route Rilis canary berbasis bobot
nginx.ingress.kubernetes.io/canary-weight-total integer Route Rilis canary berbasis bobot
higress.ingress.kubernetes.io/service-subset string Route Subset layanan
higress.ingress.kubernetes.io/subset-labels string Route Subset layanan dengan label kustom
nginx.ingress.kubernetes.io/enable-cors boolean Route CORS
nginx.ingress.kubernetes.io/cors-allow-origin string Route CORS
nginx.ingress.kubernetes.io/cors-allow-methods string Route CORS
nginx.ingress.kubernetes.io/cors-allow-headers string Route CORS
nginx.ingress.kubernetes.io/cors-expose-headers string Route CORS
nginx.ingress.kubernetes.io/cors-allow-credentials boolean Route CORS
nginx.ingress.kubernetes.io/cors-max-age integer (seconds) Route CORS
nginx.ingress.kubernetes.io/use-regex boolean Route Pencocokan ekspresi reguler
nginx.ingress.kubernetes.io/rewrite-target string Route Penulisan ulang path
nginx.ingress.kubernetes.io/upstream-vhost string Domain Penulisan ulang host
nginx.ingress.kubernetes.io/ssl-redirect boolean Route Pengalihan HTTP ke HTTPS
nginx.ingress.kubernetes.io/force-ssl-redirect boolean Route Pengalihan HTTP ke HTTPS
nginx.ingress.kubernetes.io/permanent-redirect URL Route Pengalihan permanen
nginx.ingress.kubernetes.io/permanent-redirect-code integer Route Pengalihan permanen
nginx.ingress.kubernetes.io/temporal-redirect URL Route Pengalihan sementara
higress.ingress.kubernetes.io/request-header-control-add string Route Kontrol header permintaan
higress.ingress.kubernetes.io/request-header-control-update string Route Kontrol header permintaan
higress.ingress.kubernetes.io/request-header-control-remove string Route Kontrol header permintaan
higress.ingress.kubernetes.io/response-header-control-add string Route Kontrol header respons
higress.ingress.kubernetes.io/response-header-control-update string Route Kontrol header respons
higress.ingress.kubernetes.io/response-header-control-remove string Route Kontrol header respons
nginx.ingress.kubernetes.io/proxy-next-upstream-tries integer Route Retry
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout integer (seconds) Route Retry
nginx.ingress.kubernetes.io/proxy-next-upstream string Route Retry
nginx.ingress.kubernetes.io/whitelist-source-range CIDR/IP Route Kontrol akses IP
higress.ingress.kubernetes.io/blacklist-source-range CIDR/IP Route Kontrol akses IP
higress.ingress.kubernetes.io/domain-whitelist-source-range CIDR/IP Domain Kontrol akses IP
higress.ingress.kubernetes.io/domain-blacklist-source-range CIDR/IP Domain Kontrol akses IP
higress.ingress.kubernetes.io/route-limit-rpm integer Route Pembatasan kecepatan gateway tunggal
higress.ingress.kubernetes.io/route-limit-rps integer Route Pembatasan kecepatan gateway tunggal
higress.ingress.kubernetes.io/route-limit-burst-multiplier integer Route Pembatasan kecepatan gateway tunggal
higress.ingress.kubernetes.io/rate-limit integer (RPS) Route Kontrol pembatasan laju global
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code integer Route Kontrol pembatasan laju global
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type string Route Kontrol pembatasan laju global
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body string Route Kontrol pembatasan laju global
higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url URL Route Kontrol pembatasan laju global
higress.ingress.kubernetes.io/concurrency-limit integer Route Kontrol konkurensi global
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code integer Route Kontrol konkurensi global
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type string Route Kontrol konkurensi global
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body string Route Kontrol konkurensi global
higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url URL Route Kontrol konkurensi global
higress.ingress.kubernetes.io/mirror-target-service string (namespace/name:port) Route Pencerminan lalu lintas
higress.ingress.kubernetes.io/mirror-percentage integer (0–100) Route Pencerminan lalu lintas
nginx.ingress.kubernetes.io/backend-protocol string (HTTPS, GRPC) Route Protokol layanan backend
nginx.ingress.kubernetes.io/load-balance string Route Algoritma penyeimbangan beban
nginx.ingress.kubernetes.io/upstream-hash-by string Route Penghashan konsisten
higress.ingress.kubernetes.io/warmup integer (seconds) Route Warmup (mulai mulus)
nginx.ingress.kubernetes.io/affinity string ("cookie") Route Afinitas cookie
nginx.ingress.kubernetes.io/affinity-mode string ("balanced" or "persistent") Route Afinitas cookie
nginx.ingress.kubernetes.io/session-cookie-name string Route Afinitas cookie
nginx.ingress.kubernetes.io/session-cookie-path string Route Afinitas cookie
nginx.ingress.kubernetes.io/session-cookie-max-age integer (seconds) Route Afinitas cookie
nginx.ingress.kubernetes.io/session-cookie-expires integer (seconds) Route Afinitas cookie
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection integer Route Pool koneksi
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint integer Route Pool koneksi
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection integer Route Pool koneksi
higress.ingress.kubernetes.io/tls-min-protocol-version string Domain Versi TLS dan paket sandi
higress.ingress.kubernetes.io/tls-max-protocol-version string Domain Versi TLS dan paket sandi
nginx.ingress.kubernetes.io/ssl-cipher string Domain Versi TLS dan paket sandi
nginx.ingress.kubernetes.io/proxy-ssl-secret string (namespace/name) Route mTLS dengan layanan backend
nginx.ingress.kubernetes.io/proxy-ssl-name string Route mTLS dengan layanan backend
nginx.ingress.kubernetes.io/proxy-ssl-server-name boolean Route mTLS dengan layanan backend

Rilis canary

Rilis canary memungkinkan Anda mengalihkan sebagian trafik ke versi layanan baru tanpa menghentikan versi produksi saat ini. Aktifkan fitur ini dengan nginx.ingress.kubernetes.io/canary: "true", lalu tambahkan satu atau beberapa anotasi penargetan untuk mengontrol distribusi trafik.

Jika beberapa metode penargetan dikonfigurasi pada Ingress yang sama, aturan dievaluasi dalam urutan prioritas berikut:

Cookie > Header > Parameter kueri > Bobot

Rilis canary berbasis header

Anotasi Deskripsi
nginx.ingress.kubernetes.io/canary-by-header Mengarahkan trafik berdasarkan nama header permintaan. Atur nilai header ke always untuk selalu mengarahkan ke canary. Nilai lainnya mengarahkan ke produksi kecuali canary-by-header-value juga cocok.
nginx.ingress.kubernetes.io/canary-by-header-value Saat digabungkan dengan canary-by-header, mengarahkan ke layanan canary hanya jika nama dan nilai header cocok.

Contoh 1: Arahkan permintaan dengan header `apig: always` ke layanan canary

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Contoh 2: Arahkan ke beberapa versi canary berdasarkan nilai header (`apig: v1` → v1, `apig: v2` → v2)

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Rilis canary berbasis parameter kueri

Anotasi Deskripsi
higress.ingress.kubernetes.io/canary-by-query Mengarahkan trafik berdasarkan nama parameter kueri URL. Atur nilai parameter ke always untuk mengarahkan ke layanan canary.
higress.ingress.kubernetes.io/canary-by-query-value Saat digabungkan dengan canary-by-query, mengarahkan ke layanan canary hanya jika nama dan nilai parameter kueri cocok.

Aturan berbasis header dan parameter kueri dapat digabungkan. Jika keduanya dikonfigurasi, permintaan diarahkan ke layanan canary hanya jika kedua kondisi terpenuhi.

Contoh 1: Arahkan permintaan dengan parameter kueri URL `canary=gray` ke layanan canary

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Contoh 2: Arahkan ke canary hanya ketika `canary=gray` ada di URL dan `x-user-id: test` ada di header

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Rilis canary berbasis cookie

Gunakan nginx.ingress.kubernetes.io/canary-by-cookie untuk membagi trafik berdasarkan cookie. Atur nilai cookie ke always untuk mengarahkan permintaan ke layanan canary; semua permintaan lainnya dialihkan ke layanan produksi.

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

Contoh: Arahkan permintaan dengan cookie `demo=always` ke layanan canary

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Rilis canary berbasis bobot

Anotasi Deskripsi Bawaan
nginx.ingress.kubernetes.io/canary-weight Persentase permintaan yang diarahkan ke versi canary. Integer dari 0 hingga 100. —
nginx.ingress.kubernetes.io/canary-weight-total Bobot total di semua versi. 100

Contoh: Bagi trafik ke tiga versi — canary v1 30%, canary v2 20%, produksi 50%

Kluster dengan versi 1.19 dan lebih baru

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

Kluster dengan versi sebelum 1.19

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

Subset layanan

Subset layanan memungkinkan Anda mengarahkan trafik ke Pod tertentu dalam suatu Layanan — berguna ketika satu Layanan didukung oleh beberapa Deployment yang menjalankan versi kode berbeda.

Gunakan konvensi label pod untuk APIG Ingress

Atur higress.ingress.kubernetes.io/service-subset untuk menentukan grup Pod yang menerima permintaan. Secara bawaan, APIG Ingress memetakan nilai subset ke label Pod dengan awalan opensergo.io/canary:

  • Nilai "" atau base: mengarahkan ke Pod dengan label opensergo.io/canary: "" atau Pod yang tidak memiliki label berawalan opensergo.io/canary.

  • String apa pun (misalnya, gray): mengarahkan ke Pod dengan label opensergo.io/canary-gray: gray.

Contoh: Arahkan permintaan `x-user-id: test` ke Deployment gray go-httpbin

Pertama, terapkan Layanan dan Deployment:

# Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment — no opensergo.io/canary label
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — has label opensergo.io/canary-gray: gray
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        opensergo.io/canary-gray: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Kemudian konfigurasi resource Ingress:

Kluster dengan versi 1.19 dan lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods with label opensergo.io/canary-gray: gray
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # Forward to Pods with no opensergo.io/canary-prefixed label
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Kluster dengan versi sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods with label opensergo.io/canary-gray: gray
    higress.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    # Forward to Pods with no opensergo.io/canary-prefixed label
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

Gunakan label kustom

Untuk menargetkan Pod berdasarkan label apa pun — bukan konvensi opensergo.io/canary — atur higress.ingress.kubernetes.io/service-subset dan higress.ingress.kubernetes.io/subset-labels.

Saat subset-labels dikonfigurasi, subset tidak lagi dipetakan ke label berawalan opensergo.io/canary.

Contoh: Arahkan permintaan `x-user-id: test` ke Pod dengan label `version: gray`

Pertama, terapkan Deployment (label version: gray ditambahkan ke templat Pod Deployment gray):

# go-httpbin Kubernetes Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — uses the custom label version: gray
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        version: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/apig/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Kemudian konfigurasi resource Ingress:

Kluster dengan versi 1.19 dan lebih baru

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods with label version: gray
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Kluster dengan versi sebelum 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods with label version: gray
    higress.ingress.kubernetes.io/service-subset: gray
    higress.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    higress.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

CORS

Cross-origin resource sharing (CORS) mengontrol domain eksternal mana yang dapat membuat permintaan ke layanan Anda.

Anotasi Deskripsi Bawaan
nginx.ingress.kubernetes.io/enable-cors Aktifkan atau nonaktifkan CORS. —
nginx.ingress.kubernetes.io/cors-allow-origin Origin pihak ketiga yang diizinkan. Dipisahkan koma; mendukung wildcard *. * (semua asal)
nginx.ingress.kubernetes.io/cors-allow-methods Metode HTTP yang diizinkan. Dipisahkan koma; mendukung wildcard *. GET,PUT,POST,DELETE,PATCH,OPTIONS
nginx.ingress.kubernetes.io/cors-allow-headers Header permintaan yang diizinkan. Dipisahkan koma; mendukung wildcard *. DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
nginx.ingress.kubernetes.io/cors-expose-headers Header respons yang boleh diakses browser. Dipisahkan koma. —
nginx.ingress.kubernetes.io/cors-allow-credentials Apakah kredensial diperbolehkan dalam permintaan CORS. true
nginx.ingress.kubernetes.io/cors-max-age Berapa lama respons preflight dapat di-cache, dalam detik. 1728000

Contoh: Izinkan `example.com`, izinkan hanya `GET` dan `POST`, batasi ke header `X-Foo-Bar`, dan larang kredensial

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Pencocokan ekspresi reguler

Ingress Kubernetes standar hanya mendukung pencocokan path Exact dan Prefix. APIG Ingress juga mendukung pencocokan ekspresi reguler. Aktifkan dengan nginx.ingress.kubernetes.io/use-regex: "true", lalu gunakan pola regex sebagai nilai path.

Contoh: Teruskan permintaan apa pun yang cocok `/app/...` atau `/test/...` ke layanan demo

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Penulisan ulang path dan host

Penulisan ulang memodifikasi path atau host dalam permintaan sebelum APIG Ingress meneruskannya ke layanan backend.

Anotasi Deskripsi
nginx.ingress.kubernetes.io/rewrite-target Path target setelah penulisan ulang. Mendukung grup tangkapan.
nginx.ingress.kubernetes.io/upstream-vhost Nilai header Host yang dikirim ke layanan backend.

Penulisan ulang path

Semua contoh di bawah menggunakan nginx.ingress.kubernetes.io/rewrite-target untuk memodifikasi path permintaan.

Contoh 1: Tulis ulang `example.com/test` menjadi `example.com/dev` sebelum meneruskan

Kluster pada Kubernetes 1.19 dan Lebih Baru

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

Kluster Sebelum Kubernetes 1.19

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/dev"
  name: demo
spec:
  ingressClassName: apig
  rules:
    - http:
        paths:
          - path: /test
            pathType: Exact
            backend:
              serviceName: demo-service
              servicePort: 80

Contoh 2: Hapus awalan `/v1` — tulis ulang `example.com/v1/xxx` menjadi `example.com/xxx`

Kluster pada Kubernetes 1.19 dan Lebih Baru

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

Kluster Sebelum Kubernetes 1.19

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

Contoh 3: Ganti awalan `/v1` dengan `/v2` — tulis ulang `example.com/v1/xxx` menjadi `example.com/v2/xxx`

Kluster pada Kubernetes 1.19 dan Lebih Baru

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

Kluster Sebelum Kubernetes 1.19

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

Penulisan ulang host

Contoh: Tulis ulang host dari `example.com` menjadi `test.com` sebelum meneruskan

Kluster pada Kubernetes 1.19 dan Lebih Baru

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

Kluster Sebelum Kubernetes 1.19

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

Pengalihan

Pengalihan HTTP ke HTTPS

Anotasi Deskripsi
nginx.ingress.kubernetes.io/ssl-redirect Alihkan permintaan HTTP ke HTTPS.
nginx.ingress.kubernetes.io/force-ssl-redirect Alihkan permintaan HTTP ke HTTPS.

APIG Ingress memperlakukan ssl-redirect dan force-ssl-redirect secara identik — keduanya memaksa pengalihan HTTP ke HTTPS.

Contoh: Alihkan `http://example.com/test` ke `https://example.com/test`

Kluster pada Versi 1.19 dan Lebih Baru

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

Kluster Sebelum Versi 1.19

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

Pengalihan permanen

Anotasi Deskripsi Bawaan
nginx.ingress.kubernetes.io/permanent-redirect URL tujuan untuk pengalihan permanen. Harus menyertakan skema (http:// atau https://). —
nginx.ingress.kubernetes.io/permanent-redirect-code Kode status HTTP untuk pengalihan. 301

Contoh: Alihkan permanen `http://example.com/test` ke `http://example.com/app`

Kluster pada Versi 1.19 dan Lebih Baru

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

Kluster Sebelum Versi 1.19

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

Pengalihan sementara

Gunakan nginx.ingress.kubernetes.io/temporal-redirect untuk menentukan URL tujuan pengalihan sementara. URL harus menyertakan skema (http:// atau https://).

Contoh: Alihkan sementara `http://example.com/test` ke `http://example.com/app`

Kluster pada Versi 1.19 dan Lebih Baru

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

Kluster Sebelum Versi 1.19

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

Kontrol header

Kontrol header memungkinkan Anda menambah, memperbarui, atau menghapus header HTTP saat APIG Ingress meneruskan permintaan ke layanan backend dan respons kembali ke klien.

Kontrol header permintaan

Ketiga anotasi ini memiliki sintaks multi-header yang sama: satu header menggunakan pasangan kunci-nilai; beberapa header menggunakan skalar blok YAML | dengan satu pasangan kunci-nilai per baris.

Anotasi Deskripsi
higress.ingress.kubernetes.io/request-header-control-add Menambahkan header ke permintaan yang diteruskan. Jika header sudah ada, nilainya ditambahkan.
higress.ingress.kubernetes.io/request-header-control-update Memperbarui header dalam permintaan yang diteruskan. Jika header sudah ada, nilainya ditimpa.
higress.ingress.kubernetes.io/request-header-control-remove Menghapus header dari permintaan yang diteruskan. Pisahkan beberapa nama header dengan koma.

Contoh 1: Tambahkan header `foo: bar` dan `test: true` ke semua permintaan ke `example.com/test`

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 2: Gunakan kontrol header bersama rilis canary untuk memberi tag trafik berdasarkan tahap deployment

Jika header permintaan berisi apig: v1, APIG Ingress mengarahkan ke canary dan menambahkan stage: gray. Semua permintaan lainnya dialihkan ke versi dasar dan menerima stage: production.

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Kontrol header respons

Anotasi Deskripsi
higress.ingress.kubernetes.io/response-header-control-add Menambahkan header ke respons sebelum diteruskan ke klien. Jika header sudah ada, nilainya ditambahkan.
higress.ingress.kubernetes.io/response-header-control-update Memperbarui header dalam respons sebelum diteruskan ke klien. Jika header sudah ada, nilainya ditimpa.
higress.ingress.kubernetes.io/response-header-control-remove Menghapus header dari respons sebelum diteruskan ke klien. Pisahkan beberapa nama header dengan koma.

Contoh: Hapus header `req-cost-time` dari respons ke `example.com/test`

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Retry

APIG Ingress secara otomatis mencoba ulang permintaan yang gagal di tingkat route. Konfigurasikan jumlah maksimum percobaan ulang, timeout, dan kondisi yang memicu retry.

Anotasi Deskripsi Bawaan
nginx.ingress.kubernetes.io/proxy-next-upstream-tries Jumlah maksimum percobaan ulang. 3
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout Timeout untuk retry, dalam detik. Tidak ada timeout
nginx.ingress.kubernetes.io/proxy-next-upstream Daftar kondisi retry yang dipisahkan koma. error,timeout

Kondisi retry yang valid:

Kondisi Deskripsi
error Koneksi gagal dibuat atau kode status 5xx dikembalikan.
timeout Waktu koneksi habis atau kode status 5xx dikembalikan.
invalid_header Terjadi kesalahan permintaan atau kode status 5xx dikembalikan.
http_xxx Retry pada kode status HTTP tertentu (misalnya, http_502, http_403).
non_idempotent Aktifkan retry untuk permintaan non-idempoten (POST, PATCH). Secara bawaan, permintaan ini tidak di-retry.
off Nonaktifkan retry sepenuhnya.

Contoh: Coba ulang hingga 2 kali dalam 5 detik, hanya pada HTTP 502, dan juga coba ulang permintaan non-idempoten

Kluster untuk Kubernetes 1.19 dan Lebih Baru

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

Kluster untuk Kubernetes Sebelum 1.19

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

Kontrol akses IP

APIG Ingress mendukung daftar putih dan daftar hitam alamat IP di tingkat route maupun tingkat domain. Aturan tingkat route memiliki prioritas lebih tinggi daripada aturan tingkat domain.

Kontrol akses IP tingkat route

Anotasi Deskripsi
nginx.ingress.kubernetes.io/whitelist-source-range Daftar putih untuk route tertentu. Menerima alamat IP dan blok CIDR, dipisahkan koma.
higress.ingress.kubernetes.io/blacklist-source-range Daftar hitam untuk route tertentu. Menerima alamat IP dan blok CIDR, dipisahkan koma.

Contoh 1: Izinkan akses ke `example.com/test` hanya dari `1.1.X.X`

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Contoh 2: Blokir akses ke `example.com/test` dari `2.2.2.2`

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Kontrol akses IP tingkat domain

Anotasi Deskripsi
higress.ingress.kubernetes.io/domain-whitelist-source-range Daftar putih yang diterapkan ke semua route di bawah domain. Daftar putih tingkat route memiliki prioritas lebih tinggi. Menerima alamat IP dan blok CIDR, dipisahkan koma.
higress.ingress.kubernetes.io/domain-blacklist-source-range Daftar hitam yang diterapkan ke semua route di bawah domain. Daftar hitam tingkat route memiliki prioritas lebih tinggi. Menerima alamat IP dan blok CIDR, dipisahkan koma.

Contoh 1: Izinkan akses ke semua route di bawah `example.com` dari `1.1.X.X` dan `2.2.2.2`

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Contoh 2: Gabungkan daftar putih tingkat domain dan tingkat route — batasi `/order` ke `3.3.X.X` sementara mengizinkan `1.1.X.X` dan `2.2.2.2` pada route lainnya

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Pembatasan kecepatan gateway tunggal

Pembatasan kecepatan gateway tunggal membatasi laju permintaan untuk route tertentu pada setiap instans Cloud-native API Gateway. Batasan ini berlaku per replika gateway, bukan di seluruh kluster.

Penting

Batas laju berlaku per replika gateway. Jika Anda menjalankan beberapa replika atau menggunakan Horizontal Pod Autoscaler (HPA), batas efektif di seluruh kluster adalah nilai yang dikonfigurasi dikalikan jumlah replika. Untuk batas di seluruh kluster yang tidak terpengaruh jumlah replika, gunakan kontrol pembatasan laju global sebagai gantinya.

Anotasi Deskripsi Bawaan
higress.ingress.kubernetes.io/route-limit-rpm Permintaan maksimum per menit (RPM) per instans gateway. Saat batas terlampaui, badan respons adalah local_rate_limited. —
higress.ingress.kubernetes.io/route-limit-rps Permintaan maksimum per detik (RPS) per instans gateway. Saat batas terlampaui, badan respons adalah local_rate_limited. —
higress.ingress.kubernetes.io/route-limit-burst-multiplier Pengali batas burst. Batas burst sama dengan nilai RPM atau RPS dikalikan angka ini. 5

Kode status respons saat pembatasan kecepatan dipicu tergantung pada versi gateway Anda:

  • Versi gateway sebelum 1.2.23: HTTP 503

  • Versi gateway 1.2.23 atau lebih baru: HTTP 429

Contoh 1: Batasi `example.com/test` hingga 100 RPM dengan batas burst 200 (pengali 2)

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 2: Batasi `example.com/test` hingga 10 RPS dengan batas burst bawaan (pengali 5, burst = 50)

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Kontrol pembatasan laju global

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

Kontrol pembatasan laju global terintegrasi dengan Sentinel untuk memberlakukan batas RPS di seluruh kluster pada route tertentu. Saat batas terlampaui, respons bawaan adalah HTTP 429 dengan badan sentinel rate limited. Timpa perilaku ini dengan respons kustom atau pengalihan — tetapi tidak keduanya.

Respons kustom

Anotasi Deskripsi Bawaan
higress.ingress.kubernetes.io/rate-limit RPS maksimum untuk route di seluruh kluster gateway. —
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-code Kode status HTTP saat pembatasan laju dipicu. 429
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type Format badan respons: text (text/plain; charset=UTF-8) atau json (application/json; charset=UTF-8). text
higress.ingress.kubernetes.io/rate-limit-fallback-custom-response-body Isi badan respons saat pembatasan laju dipicu. sentinel rate limited

Contoh 1: Batasi `example.com/test` hingga 100 RPS dengan respons pembatasan laju bawaan

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Contoh 2: Batasi `example.com/test` hingga 100 RPS; kembalikan HTTP 503 dengan badan `server is overload` saat dibatasi

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Pengalihan

Gunakan higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url untuk mengalihkan klien ke URL fallback saat pembatasan laju dipicu.

Contoh: Batasi `example.com/test` hingga 100 RPS; alihkan ke `example.com/fallback` saat dibatasi

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Kontrol konkurensi global

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

Kontrol konkurensi global terintegrasi dengan Sentinel untuk memberlakukan batas permintaan konkuren di seluruh kluster untuk route tertentu. Saat batas terlampaui, respons bawaan adalah HTTP 429 dengan badan sentinel rate limited. Timpa ini dengan respons kustom atau pengalihan — tetapi tidak keduanya.

Respons kustom

Anotasi Deskripsi Bawaan
higress.ingress.kubernetes.io/concurrency-limit Permintaan konkuren maksimum untuk route di seluruh kluster gateway. —
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code Kode status HTTP saat kontrol konkurensi dipicu. 429
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type Format badan respons: text (text/plain; charset=UTF-8) atau json (application/json; charset=UTF-8). text
higress.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body Isi badan respons saat kontrol konkurensi dipicu. sentinel rate limited

Contoh 1: Batasi permintaan konkuren ke `example.com/test` hingga 1.000 dengan respons bawaan

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 2: Batasi permintaan konkuren hingga 1.000; kembalikan HTTP 503 dengan badan `server is overloaded` saat batas tercapai

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Pengalihan

Gunakan higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url untuk mengalihkan klien ke URL fallback saat kontrol konkurensi dipicu.

Contoh: Batasi permintaan konkuren hingga 1.000; alihkan ke `example.com/fallback` saat batas tercapai

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Pencerminan lalu lintas

Pencerminan lalu lintas menyalin trafik permintaan langsung ke layanan bayangan tanpa memengaruhi alur permintaan asli. Gunakan untuk audit operasional, pengujian trafik, atau validasi versi layanan baru dalam mode bayangan.

Anotasi Deskripsi Bawaan
higress.ingress.kubernetes.io/mirror-target-service Layanan tujuan untuk trafik yang dicerminkan. Format: namespace/name:port. Kolom namespace dan port bersifat opsional — namespace bawaan adalah namespace gateway Ingress, dan port bawaan adalah port pertama layanan. —
higress.ingress.kubernetes.io/mirror-percentage Persentase trafik yang dicerminkan. Nilai valid: 0–100. 100
Penting

Saat trafik yang dicerminkan diteruskan ke layanan tujuan, APIG Ingress secara otomatis menambahkan -shadow ke header Host. Misalnya, example.com menjadi example.com-shadow. Jika layanan tujuan menggunakan header Host untuk perutean atau pencatatan log, pertimbangkan penulisan ulang ini dalam konfigurasi layanan Anda.

Contoh 1: Cermin semua trafik dari `example.com/test` ke `test/app:8080`

Kluster Menjalankan Versi 1.19 dan Lebih Baru

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

Kluster Menjalankan Versi Sebelum 1.19

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

Contoh 2: Cermin 10% trafik dari `example.com/test` ke `test/app:8080`

Kluster Menjalankan Versi 1.19 dan Lebih Baru

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

Kluster Menjalankan Versi Sebelum 1.19

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

Protokol layanan backend

Secara bawaan, APIG Ingress meneruskan permintaan ke layanan backend melalui HTTP. Gunakan anotasi nginx.ingress.kubernetes.io/backend-protocol untuk beralih ke HTTPS atau gRPC.

Jika nama port dalam resource Layanan Kubernetes diatur ke grpc atau http2, APIG Ingress secara otomatis menggunakan gRPC atau HTTP/2 untuk backend tersebut — tanpa anotasi. Ini berbeda dari NGINX Ingress, yang memerlukan anotasi dalam semua kasus.

Contoh 1: Teruskan permintaan ke backend HTTPS

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan versi Kubernetes sebelum 1.19

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

Contoh 2: Teruskan permintaan ke backend gRPC

Dua metode: anotasi (eksplisit) atau nama port Layanan (konvensi daripada konfigurasi).

Metode 1 — anotasi:

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan versi Kubernetes sebelum 1.19

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

Metode 2 — nama port Layanan (grpc):

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan versi Kubernetes sebelum 1.19

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

Algoritma penyeimbangan beban untuk layanan backend

Algoritma penyeimbangan beban menentukan bagaimana gateway memilih node backend saat meneruskan permintaan.

Algoritma penyeimbangan beban umum

Gunakan nginx.ingress.kubernetes.io/load-balance untuk mengatur algoritma.

Nilai Deskripsi
round_robin Mendistribusikan permintaan ke node backend secara bergiliran. Ini adalah bawaan.
least_conn Mengarahkan setiap permintaan ke node dengan koneksi aktif paling sedikit.
random Memilih node backend secara acak.
Penting

APIG Ingress tidak mendukung algoritma exponentially weighted moving average (EWMA). Jika EWMA dikonfigurasi, sistem akan kembali ke round_robin.

Contoh: Gunakan least connections untuk backend demo-service

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Algoritma penyeimbangan beban berbasis penghashan konsisten

Penghashan konsisten memastikan bahwa permintaan dengan kunci yang sama selalu diarahkan ke node backend yang sama — berguna untuk aplikasi yang sadar sesi atau lokalitas cache. Atur kunci hash menggunakan nginx.ingress.kubernetes.io/upstream-hash-by.

Jenis kunci hash yang didukung:

Kunci hash Konfigurasi Deskripsi
URI permintaan $request_uri Termasuk parameter path.
Host $host Header host permintaan.
IP klien $remote_addr Alamat IP klien.
Header permintaan $http_<header-name> Nilai header permintaan tertentu.
Parameter kueri $arg_<param-name> Nilai parameter kueri URL tertentu.

Contoh 1: Arahkan semua permintaan dari IP klien yang sama ke node backend yang sama

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 2: Arahkan permintaan dengan nilai header `X-Stage` yang sama ke node backend yang sama

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 3: Arahkan permintaan dengan nilai parameter kueri `X-Stage` yang sama ke node backend yang sama

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Warmup (mulai mulus)

Warmup secara bertahap meningkatkan trafik ke node backend yang baru dimulai selama jendela waktu tertentu, memberinya waktu untuk menginisialisasi cache dan mengompilasi kode JIT sebelum menangani trafik puncak.

Gunakan higress.ingress.kubernetes.io/warmup untuk mengatur jendela warmup dalam detik. Warmup dinonaktifkan secara bawaan.

Warmup hanya didukung dengan algoritma penyeimbangan beban round_robin dan least_conn.

Contoh: Lakukan warmup demo-service selama jendela 30 detik

Kluster menjalankan Kubernetes 1.19 dan lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Afinitas cookie (persistensi sesi)

Afinitas cookie mengarahkan semua permintaan dari klien yang sama ke node backend yang sama. APIG Ingress menghasilkan cookie afinitas pada permintaan pertama; permintaan berikutnya membawa cookie tersebut dan diarahkan ke node yang sama.

Anotasi Deskripsi Bawaan
nginx.ingress.kubernetes.io/affinity Jenis afinitas. Satu-satunya nilai yang valid adalah cookie. —
nginx.ingress.kubernetes.io/affinity-mode Mode afinitas: balanced mendistribusikan sesi baru secara merata di backend; persistent selalu mengarahkan ke backend yang sama sepanjang masa cookie. balanced
nginx.ingress.kubernetes.io/session-cookie-name Nama cookie yang digunakan sebagai kunci hash. INGRESSCOOKIE
nginx.ingress.kubernetes.io/session-cookie-path Path cookie yang dihasilkan. Harus sesuai dengan path Ingress. /
nginx.ingress.kubernetes.io/session-cookie-max-age Waktu kedaluwarsa cookie yang dihasilkan, dalam detik. Memiliki prioritas lebih tinggi daripada session-cookie-expires. Tingkat sesi
nginx.ingress.kubernetes.io/session-cookie-expires Waktu kedaluwarsa cookie yang dihasilkan, dalam detik. Tingkat sesi

Contoh 1: Aktifkan afinitas cookie dengan pengaturan bawaan (nama cookie `INGRESSCOOKIE`, path `/`, masa berlaku tingkat sesi)

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Contoh 2: Aktifkan afinitas cookie dengan nama cookie kustom `test`, path `/`, dan kedaluwarsa 10 detik

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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

Pool koneksi

Pool koneksi membatasi jumlah koneksi yang dibuka instans gateway ke layanan backend, mencegah kelebihan beban di bawah trafik tinggi.

Anotasi Deskripsi
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection Koneksi TCP maksimum total antara instans gateway dan layanan backend.
higress.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint Koneksi TCP maksimum antara instans gateway dan satu Pod backend.
higress.ingress.kubernetes.io/connection-policy-http-max-request-per-connection Permintaan HTTP maksimum per koneksi TCP antara instans gateway dan layanan backend.

Contoh: Batasi gateway hingga 10 koneksi total dan 2 koneksi per Pod untuk demo-service

Kluster Versi 1.19 dan Lebih Baru

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

Kluster Sebelum Versi 1.19

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

Versi TLS dan paket sandi

Secara bawaan, APIG Ingress menerima koneksi TLS dari TLS 1.0 hingga TLS 1.3, menggunakan paket sandi berikut:

  • ECDHE-ECDSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-ECDSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA

  • AES128-GCM-SHA256

  • AES128-SHA

  • ECDHE-ECDSA-AES256-GCM-SHA384

  • ECDHE-RSA-AES256-GCM-SHA384

  • ECDHE-ECDSA-AES256-SHA

  • ECDHE-RSA-AES256-SHA

  • AES256-GCM-SHA384

  • AES256-SHA

Gunakan anotasi berikut untuk membatasi rentang versi TLS atau paket sandi untuk domain tertentu:

Anotasi Deskripsi Bawaan
higress.ingress.kubernetes.io/tls-min-protocol-version Versi TLS minimum. Nilai valid: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. TLSv1.0
higress.ingress.kubernetes.io/tls-max-protocol-version Versi TLS maksimum. Nilai valid: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3. TLSv1.3
nginx.ingress.kubernetes.io/ssl-cipher Paket sandi yang diizinkan, dipisahkan koma. Hanya berlaku untuk proses jabat tangan TLS 1.0–1.2. —

Contoh: Batasi `example.com` hanya ke TLS 1.2

Kluster versi 1.19 dan lebih baru

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

Kluster sebelum versi 1.19

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

Otentikasi mTLS dengan layanan backend

TLS satu arah (melalui nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", dijelaskan di Protokol layanan backend) hanya memverifikasi sertifikat backend. Untuk verifikasi timbal balik, konfigurasikan mTLS — backend juga memverifikasi sertifikat klien yang disajikan oleh gateway.

Gunakan anotasi berikut untuk mengonfigurasi sertifikat klien yang disajikan gateway:

Anotasi Deskripsi
nginx.ingress.kubernetes.io/proxy-ssl-secret Sertifikat klien yang digunakan gateway untuk mengotentikasi dirinya ke layanan backend. Format: secretNamespace/secretName.
nginx.ingress.kubernetes.io/proxy-ssl-name Nilai Indikasi Nama Server (SNI) yang digunakan selama proses jabat tangan TLS.
nginx.ingress.kubernetes.io/proxy-ssl-server-name Aktifkan atau nonaktifkan SNI selama proses jabat tangan TLS.

Contoh: Konfigurasikan mTLS antara gateway dan demo-service menggunakan sertifikat `default/gateway-cert`

Kluster menjalankan Kubernetes 1.19 atau lebih baru

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

Kluster menjalankan Kubernetes sebelum 1.19

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