Todos os produtos
Search
Central de documentação

Microservices Engine:Advanced usage of MSE Ingress

Última atualização: Oct 09, 2026

O MSE Ingress fornece balanceamento de carga na camada 7 para gerenciar o acesso externo aos services em um cluster Kubernetes. Configure os recursos baseados em annotations nos recursos de Ingress — desde canary releases e limitação de taxa até TLS e espelhamento de tráfego.

Todos os exemplos incluem configurações para Kubernetes v1.19+ (networking.k8s.io/v1) e versões anteriores (networking.k8s.io/v1beta1).

Referência rápida de annotations

Todas as annotations neste documento usam o prefixo nginx.ingress.kubernetes.io/ ou mse.ingress.kubernetes.io/. A tabela abaixo lista cada annotation com seus valores aceitos, padrão e escopo.

Annotation

Valores aceitos

Padrão

Escopo

nginx.ingress.kubernetes.io/canary

"true"

—

Rota

nginx.ingress.kubernetes.io/canary-by-header

string

—

Rota

nginx.ingress.kubernetes.io/canary-by-header-value

string

—

Rota

nginx.ingress.kubernetes.io/canary-by-cookie

string

—

Rota

nginx.ingress.kubernetes.io/canary-weight

inteiro (0–100 ou 0–total)

—

Rota

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

inteiro

100

Rota

mse.ingress.kubernetes.io/canary-by-query

string

—

Rota

mse.ingress.kubernetes.io/canary-by-query-value

string

—

Rota

mse.ingress.kubernetes.io/service-subset

string

—

Rota

mse.ingress.kubernetes.io/subset-labels

key value

—

Rota

nginx.ingress.kubernetes.io/enable-cors

"true" / "false"

false

Rota

nginx.ingress.kubernetes.io/cors-allow-origin

origens separadas por vírgula ou *

*

Rota

nginx.ingress.kubernetes.io/cors-allow-methods

métodos HTTP separados por vírgula ou *

GET,PUT,POST,DELETE,PATCH,OPTIONS

Rota

nginx.ingress.kubernetes.io/cors-allow-headers

headers separados por vírgula ou *

DNT,X-CustomHeader,...

Rota

nginx.ingress.kubernetes.io/cors-expose-headers

headers separados por vírgula

—

Rota

nginx.ingress.kubernetes.io/cors-allow-credentials

"true" / "false"

true

Rota

nginx.ingress.kubernetes.io/cors-max-age

inteiro (segundos)

1728000

Rota

nginx.ingress.kubernetes.io/use-regex

"true" / "false"

—

Rota

nginx.ingress.kubernetes.io/rewrite-target

string de caminho

—

Rota

nginx.ingress.kubernetes.io/upstream-vhost

hostname

—

Rota

nginx.ingress.kubernetes.io/ssl-redirect

"true" / "false"

false

Rota

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

"true" / "false"

false

Rota

nginx.ingress.kubernetes.io/permanent-redirect

URL (com scheme)

—

Rota

nginx.ingress.kubernetes.io/permanent-redirect-code

código de status HTTP

301

Rota

nginx.ingress.kubernetes.io/temporal-redirect

URL (com scheme)

—

Rota

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

key value ou bloco YAML

—

Rota

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

key value ou bloco YAML

—

Rota

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

nomes de headers separados por vírgula

—

Rota

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

key value ou bloco YAML

—

Rota

mse.ingress.kubernetes.io/response-header-control-update

key value ou bloco YAML

—

Rota

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

nomes de headers separados por vírgula

—

Rota

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

inteiro

3

Rota

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

inteiro (segundos)

sem timeout

Rota

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

condições separadas por vírgula

error,timeout

Rota

nginx.ingress.kubernetes.io/whitelist-source-range

IPs ou CIDRs separados por vírgula

—

Rota

mse.ingress.kubernetes.io/blacklist-source-range

IPs ou CIDRs separados por vírgula

—

Rota

mse.ingress.kubernetes.io/domain-whitelist-source-range

IPs ou CIDRs separados por vírgula

—

Domínio

mse.ingress.kubernetes.io/domain-blacklist-source-range

IPs ou CIDRs separados por vírgula

—

Domínio

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

inteiro

—

Rota

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

inteiro

—

Rota

mse.ingress.kubernetes.io/route-limit-burst-multiplier

inteiro

5

Rota

mse.ingress.kubernetes.io/rate-limit

inteiro (RPS)

—

Rota

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code

código de status HTTP

429

Rota

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type

text / json

text

Rota

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body

string

sentinel rate limited

Rota

mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url

URL

—

Rota

mse.ingress.kubernetes.io/concurrency-limit

inteiro

—

Rota

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code

código de status HTTP

429

Rota

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type

text / json

text

Rota

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body

string

sentinel rate limited

Rota

mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url

URL

—

Rota

mse.ingress.kubernetes.io/mirror-target-service

namespace/name:port

—

Rota

mse.ingress.kubernetes.io/mirror-percentage

inteiro (0–100)

100

Rota

nginx.ingress.kubernetes.io/backend-protocol

HTTPS / GRPC

—

Rota

nginx.ingress.kubernetes.io/load-balance

round_robin / least_conn / random

round_robin

Rota

nginx.ingress.kubernetes.io/upstream-hash-by

variável ou expressão NGINX

—

Rota

mse.ingress.kubernetes.io/warmup

inteiro (segundos)

desativado

Rota

nginx.ingress.kubernetes.io/affinity

cookie

—

Rota

nginx.ingress.kubernetes.io/affinity-mode

balanced

balanced

Rota

nginx.ingress.kubernetes.io/session-cookie-name

string

INGRESSCOOKIE

Rota

nginx.ingress.kubernetes.io/session-cookie-path

string de caminho

/

Rota

nginx.ingress.kubernetes.io/session-cookie-max-age

inteiro (segundos)

escopo de sessão

Rota

nginx.ingress.kubernetes.io/session-cookie-expires

inteiro (segundos)

escopo de sessão

Rota

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection

inteiro

—

Rota

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint

inteiro

—

Rota

mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection

inteiro

—

Rota

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

TLSv1.0 / TLSv1.1 / TLSv1.2 / TLSv1.3

TLSv1.0

Domínio

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

TLSv1.0 / TLSv1.1 / TLSv1.2 / TLSv1.3

TLSv1.3

Domínio

nginx.ingress.kubernetes.io/ssl-cipher

suítes de criptografia separadas por vírgula

ver padrões

Domínio

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

namespace/secretName

—

Rota

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

hostname

—

Rota

nginx.ingress.kubernetes.io/proxy-ssl-server-name

"on" / "off"

—

Rota

Canary release

O MSE Ingress suporta quatro estratégias de canary release. Ative o canary em qualquer recurso de Ingress adicionando a annotation nginx.ingress.kubernetes.io/canary: "true". Em seguida, aplique uma ou mais das annotations específicas de estratégia abaixo.

O MSE Ingress suporta mais de duas versões de service em um único canary release, sem limite superior. O NGINX Ingress e o ALB Ingress suportam no máximo duas versões.

Quando várias estratégias são configuradas simultaneamente, o MSE Ingress as aplica nesta ordem de precedência:

  1. Baseada em header ou parâmetro de query (maior prioridade)

  2. Baseada em cookie

  3. Baseada em peso (menor prioridade)

Canary release baseado em header

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/canary-by-header

Roteia requisições para a versão canary quando o header especificado está presente e definido como always.

—

Sim (para canary baseado em header)

nginx.ingress.kubernetes.io/canary-by-header-value

Roteia requisições para a versão canary apenas quando o header corresponde tanto à chave (de canary-by-header) quanto a este valor.

—

Não

Exemplo 1: Roteamento por presença de header

Quando o header da requisição mse é definido como always, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Exemplo 2: Roteamento de várias versões canary por valor exato de header

Quando o header mse: v1 está presente, as requisições vão para demo-service-canary-v1. Quando mse: v2 está presente, elas vão para demo-service-canary-v2. Todas as outras requisições vão para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Canary release baseado em parâmetro de query

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/canary-by-query

Roteia requisições para a versão canary quando o parâmetro de query especificado está presente e definido como always.

—

Sim (para canary baseado em query)

mse.ingress.kubernetes.io/canary-by-query-value

Roteia requisições para a versão canary apenas quando o parâmetro de query corresponde tanto à chave quanto a este valor.

—

Não

As condições baseadas em header e parâmetro de query podem ser combinadas. As requisições vão para a versão canary apenas quando ambas as condições correspondem simultaneamente.

Exemplo 1: Roteamento por valor de parâmetro de query

Quando a URL contém canary=gray, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Exemplo 2: Combinar parâmetro de query com condições de header

Quando a URL contém canary=gray E o header da requisição contém x-user-id: test, as requisições vão para demo-service-canary. Ambas as condições devem corresponder.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Canary release baseado em cookie

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/canary-by-cookie

Roteia requisições para a versão canary quando o cookie especificado está definido como always. O MSE Ingress não suporta valores de cookie personalizados — o valor deve ser always.

—

Sim (para canary baseado em cookie)

Example: Quando o cookie da requisição demo=always está presente, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Canary release baseado em peso

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/canary-weight

Porcentagem de requisições encaminhadas à versão canary. Inteiro no intervalo de 0–100 (ou 0–canary-weight-total).

—

Sim (para canary baseado em peso)

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

Peso total usado como denominador no cálculo da distribuição de requisições.

100

Não

Example: Distribua o tráfego entre três versões — 30% para demo-service-canary-v1, 20% para demo-service-canary-v2 e 50% para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Subconjunto de service

Um subconjunto de service permite rotear requisições para um grupo específico de Pods dentro de um único Service do Kubernetes — útil quando um Service é suportado por vários Deployments com versões diferentes. O MSE Ingress oferece dois métodos para definir subconjuntos.

Usar rótulos de Pod no MseIngressConfig

Use a annotation mse.ingress.kubernetes.io/service-subset para selecionar Pods por seus rótulos de canary do OpenSergo:

  • "" ou base: roteia para Pods sem um prefixo de rótulo opensergo.io/canary, ou com opensergo.io/canary: "".

  • Qualquer outro valor (por exemplo, gray): roteia para Pods com o rótulo opensergo.io/canary-{value}: {value} — por exemplo, opensergo.io/canary-gray: gray.

Example: Um Service chamado go-httpbin é suportado por dois Deployments. Os Pods base não têm rótulo de canary do OpenSergo. Os Pods gray têm o rótulo opensergo.io/canary-gray: gray.

Manifests de Service e Deployment:

# go-httpbin 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 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/mse/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — has the OpenSergo canary label
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        opensergo.io/canary-gray: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Configuração do Ingress — requisições com x-user-id: test vão para go-httpbin-gray; todas as outras vão para go-httpbin-base:

Kubernetes v1.19+:

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 labeled opensergo.io/canary-gray: gray
    mse.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # Forward to Pods without the opensergo.io/canary label prefix
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Kubernetes anterior à v1.19:

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

Usar rótulos personalizados

Combine mse.ingress.kubernetes.io/service-subset com mse.ingress.kubernetes.io/subset-labels para definir o subconjunto por qualquer rótulo de Pod em vez do prefixo opensergo.io/canary.

Quando você define subset-labels , o subconjunto deixa de ser mapeado para rótulos com o prefixo opensergo.io/canary .

Example: O Deployment gray tem version: gray em vez de um rótulo do OpenSergo.

Manifests de Service e Deployment:

# go-httpbin 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/mse/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — uses a custom label instead of opensergo.io/canary
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        version: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Configuração do Ingress — requisições com x-user-id: test vão para go-httpbin-gray; todas as outras vão para go-httpbin-base:

Kubernetes v1.19+:

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 labeled version: gray
    mse.ingress.kubernetes.io/service-subset: gray
    mse.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Kubernetes anterior à v1.19:

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

CORS

O Cross-Origin Resource Sharing (CORS) permite que aplicações web acessem recursos em uma origem diferente. Para a especificação CORS, consulte Cross-Origin Resource Sharing (CORS).

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/enable-cors

Ativa o CORS neste Ingress.

false

Sim (para ativar o CORS)

nginx.ingress.kubernetes.io/cors-allow-origin

Origens de terceiros permitidas. Aceita valores separados por vírgula e curingas (*).

*

Não

nginx.ingress.kubernetes.io/cors-allow-methods

Métodos HTTP permitidos. Aceita valores separados por vírgula e curingas (*).

GET,PUT,POST,DELETE,PATCH,OPTIONS

Não

nginx.ingress.kubernetes.io/cors-allow-headers

Headers de requisição permitidos. Aceita valores separados por vírgula e curingas (*).

DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

Não

nginx.ingress.kubernetes.io/cors-expose-headers

Headers de resposta expostos ao navegador. Aceita valores separados por vírgula.

—

Não

nginx.ingress.kubernetes.io/cors-allow-credentials

Se as credenciais podem ser incluídas nas requisições CORS.

true

Não

nginx.ingress.kubernetes.io/cors-max-age

Duração do cache para resultados de preflight, em segundos.

1728000

Não

Example: Permita example.com como origem, restrinja os métodos a GET e POST, permita o header de requisição X-Foo-Bar e desative a passagem de credenciais.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Correspondência por expressão regular

Além da correspondência exata e por prefixo, o MSE Ingress suporta correspondência por expressão regular. Defina nginx.ingress.kubernetes.io/use-regex: "true" para tratar o caminho definido na especificação do Ingress como uma expressão regular.

Example: Encaminhe para o service demo as requisições destinadas a example.com cujos caminhos comecem com /app ou /test.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Reescrita de caminho e host

As operações de reescrita modificam o caminho ou o host de uma requisição antes de ela chegar ao service de backend.

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/rewrite-target

Caminho de destino. Suporta grupos de captura do padrão de caminho do Ingress.

—

Sim (para reescrita de caminho)

nginx.ingress.kubernetes.io/upstream-vhost

Host de destino.

—

Sim (para reescrita de host)

Reescrita de caminho

Example 1: Reescreva example.com/test para example.com/dev antes de encaminhar para o backend.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Remova o prefixo /v1 — reescreva example.com/v1/xxx para example.com/xxx.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 3: Substitua o prefixo /v1 por /v2 — reescreva example.com/v1/xxx para example.com/v2/xxx.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Reescrita de host

Example: Reescreva o host de example.com para test.com antes de encaminhar example.com/test para o backend.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Redirecionamento

Redirecionamento de HTTP para HTTPS

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/ssl-redirect

Força o redirecionamento de requisições HTTP para HTTPS.

false

Sim (para ativar o redirecionamento)

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

Força o redirecionamento de requisições HTTP para HTTPS.

false

Sim (alternativa a ssl-redirect)

O MSE Ingress trata tanto ssl-redirect quanto force-ssl-redirect de forma idêntica — ambos forçam o redirecionamento de HTTP para HTTPS.

Example: Redirecione http://example.com/test para https://example.com/test.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Redirecionamento permanente

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/permanent-redirect

URL de destino para o redirecionamento permanente. Deve incluir o scheme (http:// ou https://).

—

Sim (para redirecionamento permanente)

nginx.ingress.kubernetes.io/permanent-redirect-code

Código de status HTTP para o redirecionamento.

301

Não

Example: Redirecione permanentemente http://example.com/test para http://example.com/app.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Redirecionamento temporário

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/temporal-redirect

URL de destino para o redirecionamento temporário. Deve incluir o scheme (http:// ou https://).

—

Sim (para redirecionamento temporário)

Example: Redirecione temporariamente http://example.com/test para http://example.com/app.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Controle de headers

O controle de headers permite adicionar, modificar ou remover headers de requisição antes de o MSE Ingress encaminhar a requisição para um service de backend. Também permite alterar headers de resposta antes de o sistema retorná-los ao cliente.

Controle de headers de requisição

Annotation

Descrição

Padrão

Obrigatório

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

Adiciona um header à requisição. Se o header já existir, o sistema anexa o novo valor ao original. Para um único header, use um par chave-valor. Para múltiplos headers, use o bloco escalar YAML (`

`) com um par chave-valor por linha.

—

Não

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

Modifica um header existente na requisição. Se o header já existir, o novo valor sobrescreve o original. A sintaxe é a mesma de request-header-control-add.

—

Não

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

Remove um header da requisição. Para múltiplos headers, separe-os com vírgulas (,).

—

Não

Example 1: Adicione foo: bar e test: true a todas as requisições para example.com/test.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Combine o controle de headers com canary releases. Quando o header da requisição for mse: v1, a requisição vai para demo-service-canary-v1 com stage: gray adicionado. Todas as outras requisições vão para demo-service com stage: production adicionado.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Controle de headers de resposta

Annotation

Descrição

Padrão

Obrigatório

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

Adiciona um header à resposta do backend antes de encaminhá-la ao cliente. Se o header já existir, o sistema anexa o novo valor. A sintaxe é a mesma do controle de headers de requisição.

—

Não

mse.ingress.kubernetes.io/response-header-control-update

Modifica um header de resposta existente. Se o header já existir, o novo valor sobrescreve o original. A sintaxe é a mesma do controle de headers de requisição.

—

Não

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

Remove um header de resposta antes de encaminhá-la ao cliente. Para múltiplos headers, separe-os com vírgulas (,).

—

Não

Example: Remova o header req-cost-time das respostas para example.com/test.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Retry

O MSE Ingress fornece retry automático no nível de rota para requisições com falha. Configure as condições, limites e timeouts de retry com as seguintes annotations.

Annotation

Descrição

Padrão

Obrigatório

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

Número máximo de retries.

3

Não

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

Timeout para todas as tentativas de retry combinadas, em segundos.

Sem timeout

Não

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

Condições de retry, separadas por vírgula. Valores válidos: error (falha de conexão ou 5xx), timeout (timeout de conexão ou 5xx), invalid_header (erro de requisição ou 5xx), http_xxx (código de status específico, ex: http_502), non_idempotent (ativa retries para POST e PATCH), off (desativa retries).

error,timeout

Não

Por padrão, o MSE Ingress não tenta novamente requisições não idempotentes (POST, PATCH) mesmo quando outras condições de retry são atendidas. Adicione non_idempotent a proxy-next-upstream para ativar retries para esses métodos.

Example: Para example.com/test, defina um máximo de 2 retries com timeout de 5 segundos, acione retries apenas em HTTP 502 e ative retries para requisições não idempotentes.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Listas de permissões e listas de bloqueios de endereços IP

O MSE Ingress suporta listas de permissões (whitelists) e listas de bloqueios (blacklists) de endereços IP tanto no nível de rota quanto no nível de domínio. As regras no nível de rota têm precedência sobre as regras no nível de domínio.

Controle de IP no nível de rota

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/whitelist-source-range

Endereços IP ou blocos CIDR permitidos para esta rota. Separe-os por vírgula.

—

Não

mse.ingress.kubernetes.io/blacklist-source-range

Endereços IP ou blocos CIDR bloqueados para esta rota. Separe-os por vírgula.

—

Não

Example 1: Permita acesso a example.com/test apenas a partir de 1.1.X.X.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Bloqueie o acesso a example.com/test a partir de 2.2.2.2.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Controle de IP no nível de domínio

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/domain-whitelist-source-range

Endereços IP ou blocos CIDR permitidos para todas as rotas de um domínio. As listas de permissões no nível de rota têm precedência. Separe-os por vírgula.

—

Não

mse.ingress.kubernetes.io/domain-blacklist-source-range

Endereços IP ou blocos CIDR bloqueados para todas as rotas de um domínio. As listas de bloqueios no nível de rota têm precedência. Separe-os por vírgula.

—

Não

Example 1: Permita acesso a todas as rotas de example.com a partir de 1.1.X.X e 2.2.2.2.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Permita todas as rotas de example.com a partir de 1.1.X.X e 2.2.2.2, mas restrinja /order apenas a 3.3.X.X. A lista de permissões no nível de rota em /order sobrescreve a lista de permissões no nível de domínio para essa rota.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Limitação de taxa por instância de gateway

A limitação de taxa por instância de gateway restringe a taxa de requisições em uma rota por réplica de gateway. Use este recurso para o controle de taxa por instância. Para o controle de taxa em todo o cluster, consulte Controle global de limitação de taxa.

O MSE Ingress usa um modelo de token bucket para controle de pico. A annotation route-limit-rpm ou route-limit-rps define a taxa sustentada, ou seja, a velocidade com que o token bucket é recarregado. A annotation route-limit-burst-multiplier define a capacidade de pico como um múltiplo dessa taxa: limite de pico = taxa × multiplicador. O sistema rejeita as requisições que excedem a capacidade de pico e retorna local_rate_limited no corpo da resposta.

Annotation

Descrição

Padrão

Obrigatório

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

Máximo de requisições por minuto (RPM) por réplica de gateway. Limite de pico = RPM × route-limit-burst-multiplier. Código de resposta na limitação: 503 (gateway < v1.2.23) ou 429 (gateway >= v1.2.23).

—

Não

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

Máximo de requisições por segundo (RPS) por réplica de gateway. Limite de pico = RPS × route-limit-burst-multiplier. Mesmos códigos de resposta do RPM.

—

Não

mse.ingress.kubernetes.io/route-limit-burst-multiplier

Multiplicador de capacidade de pico aplicado ao limite de RPM ou RPS configurado.

5

Não

Example 1: Limite example.com/test a 100 RPM com um limite de pico de 200 (multiplicador = 2).

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Limite example.com/test a 10 RPS com o limite de pico padrão de 50 (multiplicador = 5).

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Controle global de limitação de taxa

O MSE Ingress integra-se ao Sentinel para aplicar um limite global de RPS em todas as réplicas de um cluster de gateway no nível de rota. Quando a limitação é acionada, o código de resposta padrão é 429 e o corpo da resposta é sentinel rate limited.

Importante

O controle global de limitação de taxa requer a versão 1.2.25 ou posterior do gateway MSE Ingress.

Configure o limite de taxa em todo o cluster com mse.ingress.kubernetes.io/rate-limit. Para personalizar a resposta de limitação, escolha uma das duas abordagens: resposta personalizada ou redirecionamento. Apenas uma abordagem pode estar ativa por vez.

Resposta personalizada

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/rate-limit

RPS máximo para esta rota em todo o cluster de gateway.

—

Sim

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code

Código de resposta HTTP retornado quando a limitação é acionada.

429

Não

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type

Tipo de conteúdo do corpo da resposta. text define Content-Type: text/plain; charset=UTF-8. json define Content-Type: application/json; charset=UTF-8.

text

Não

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body

Conteúdo do corpo da resposta quando a limitação é acionada.

sentinel rate limited

Não

Example 1: Limite example.com/test a 100 RPS em todo o cluster com a resposta padrão (HTTP 429, sentinel rate limited).

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Limite example.com/test a 100 RPS em todo o cluster. Quando limitado, retorne HTTP 503 com o corpo server is overloaded.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Redirecionamento

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url

URL para redirecionar o cliente quando a limitação é acionada.

—

Não

Example: Limite example.com/test a 100 RPS em todo o cluster. Quando limitado, redirecione para example.com/fallback.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Controle global de concorrência

O MSE Ingress integra-se ao Sentinel para limitar o número de requisições em andamento (in-flight) em uma rota em todo o cluster de gateway. Quando o limite é excedido, o código de resposta padrão é 429 e o corpo da resposta é sentinel rate limited.

Importante

O controle global de concorrência requer a versão 1.2.25 ou posterior do gateway MSE Ingress.

Configure o limite de concorrência em todo o cluster com mse.ingress.kubernetes.io/concurrency-limit. Para personalizar a resposta quando o limite é excedido, use resposta personalizada ou redirecionamento. Apenas uma abordagem pode estar ativa por vez.

Resposta personalizada

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/concurrency-limit

Número máximo de requisições em andamento para esta rota em todo o cluster de gateway.

—

Sim

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code

Código de resposta HTTP quando o controle de concorrência é acionado.

429

Não

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type

Tipo de conteúdo do corpo da resposta. text define Content-Type: text/plain; charset=UTF-8. json define Content-Type: application/json; charset=UTF-8.

text

Não

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body

Conteúdo do corpo da resposta quando o controle de concorrência é acionado.

sentinel rate limited

Não

Example 1: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster e mantenha a resposta padrão.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster. Quando o limite for excedido, retorne HTTP 503 com o corpo server is overloaded.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Redirecionamento

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url

URL para redirecionar o cliente quando o controle de concorrência é acionado.

—

Não

Example: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster. Quando o limite for excedido, redirecione para example.com/fallback.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Espelhamento de tráfego

O espelhamento de tráfego copia requisições ao vivo para um service secundário sem afetar a resposta original. Use-o para auditoria, testes ou depuração de tráfego em um ambiente espelhado (shadow).

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/mirror-target-service

Service de destino para o tráfego espelhado. Formato: namespace/name:port. Se omitido, o namespace assume como padrão o namespace do gateway. Se omitida, a port assume como padrão a primeira porta do Service.

—

Sim (para ativar o espelhamento)

mse.ingress.kubernetes.io/mirror-percentage

Porcentagem de tráfego a ser espelhada. Intervalo válido: 0–100.

100

Não

Quando o tráfego espelhado é encaminhado para o service de destino, o sistema anexa automaticamente o sufixo -shadow ao header Host . Por exemplo, example.com torna-se example.com-shadow .

Example 1: Espelhe 100% das requisições para example.com/test para test/app:8080.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Espelhe 10% das requisições para example.com/test para test/app:8080.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Protocolos de service de backend: HTTPS e gRPC

Por padrão, o MSE Ingress usa HTTP para encaminhar requisições para contêineres de backend. Use nginx.ingress.kubernetes.io/backend-protocol para mudar para HTTPS ou gRPC.

Se o recurso Service do Kubernetes para o seu backend tiver uma porta chamada grpc ou http2 , o MSE Ingress usa automaticamente o protocolo correspondente sem exigir a annotation backend-protocol . Isso difere do comportamento padrão do NGINX Ingress.

Example 1: Encaminhe requisições para um backend por HTTPS.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Encaminhe requisições para um backend gRPC. Há dois métodos disponíveis.

Método 1 — use a annotation backend-protocol:

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Método 2 — nomeie a porta do Service como grpc para que o MSE Ingress detecte automaticamente o protocolo:

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Algoritmos de balanceamento de carga

O MSE Ingress suporta vários algoritmos de balanceamento de carga para distribuir requisições aos Pods de backend. Escolha o algoritmo com base na sua distribuição de tráfego e nos requisitos de sessão:

Algoritmo

Valor da annotation

Descrição

Use quando

Round robin

round_robin

Distribui requisições uniformemente entre os Pods em rotação.

Padrão; adequado para backends stateless e com desempenho uniforme.

Least connections

least_conn

Roteia cada requisição para o Pod com o menor número de conexões ativas.

Backends com durações de requisição variáveis.

Random

random

Roteia requisições para um Pod selecionado aleatoriamente.

Distribuição uniforme simples e sem estado.

Hashing consistente

Veja abaixo

Roteia requisições com a mesma chave de hash para o mesmo Pod.

Afinidade de sessão por IP, header ou parâmetro de query.

Importante

O MSE Ingress não suporta o algoritmo de média móvel ponderada exponencialmente (EWMA). Se configurado, o sistema retorna ao round robin.

Algoritmos comuns de balanceamento de carga

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/load-balance

Algoritmo de balanceamento de carga. Valores válidos: round_robin, least_conn, random.

round_robin

Não

Example: Use least connections para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Hashing consistente

O hashing consistente roteia requisições com a mesma chave de hash para o mesmo Pod de backend. O MSE Ingress suporta hashing por variáveis do NGINX, headers de requisição ou parâmetros de query.

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/upstream-hash-by

Expressão da chave de hash. Valores suportados: variáveis do NGINX (ex: $remote_addr, $host, $request_uri), headers de requisição ($http_<header-name>), parâmetros de query ($arg_<param-name>).

—

Sim (para hashing consistente)

Example 1: Faça o hash por IP do cliente: as requisições do mesmo IP sempre chegam ao mesmo Pod.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Faça o hash pelo header de requisição X-Stage: as requisições com o mesmo valor de X-Stage sempre chegam ao mesmo Pod.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 3: Faça o hash pelo parâmetro de query x-stage: as requisições com o mesmo valor de x-stage sempre chegam ao mesmo Pod.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Warm-up (inicialização gradual)

O recurso de warm-up aumenta gradualmente o tráfego para um Pod recém-iniciado durante uma janela de tempo especificada, evitando que um Pod frio receba carga total imediatamente. Apenas os algoritmos round robin e least connections suportam warm-up.

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/warmup

Duração da janela de warm-up em segundos. Quando um novo Pod é iniciado, o tráfego aumenta gradualmente ao longo desse período.

Warm-up desativado

Não

Example: Ative uma janela de warm-up de 30 segundos para demo-service.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Afinidade de cookie (persistência de sessão)

A afinidade de cookie fixa um cliente ao mesmo Pod de backend entre requisições por meio de um cookie gerado pelo gateway. Na primeira requisição, o MSE Ingress define um cookie na resposta. As requisições subsequentes do mesmo cliente incluem esse cookie e o sistema as roteia para o mesmo Pod.

Annotation

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/affinity

Ativa a afinidade de cookie. O único valor válido é cookie.

—

Sim (para ativar afinidade de cookie)

nginx.ingress.kubernetes.io/affinity-mode

Modo de afinidade. O único valor válido é balanced.

balanced

Não

nginx.ingress.kubernetes.io/session-cookie-name

Nome do cookie usado como chave de hash.

INGRESSCOOKIE

Não

nginx.ingress.kubernetes.io/session-cookie-path

Atributo de caminho do cookie gerado.

/

Não

nginx.ingress.kubernetes.io/session-cookie-max-age

Tempo de expiração do cookie gerado, em segundos.

Escopo de sessão

Não

nginx.ingress.kubernetes.io/session-cookie-expires

Tempo de expiração do cookie gerado, em segundos.

Escopo de sessão

Não

Example 1: Ative a afinidade de cookie com os padrões — nome do cookie INGRESSCOOKIE, caminho /, tempo de vida com escopo de sessão.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Example 2: Ative a afinidade de cookie com um cookie personalizado chamado test, caminho / e expiração de 10 segundos.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Pool de conexões entre um gateway e um service de backend

Configure um pool de conexões para controlar o número de conexões entre o gateway e um service de backend. Essa configuração evita a sobrecarga do backend durante picos de tráfego.

Annotation

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection

Máximo total de conexões TCP entre o gateway e o service de backend.

—

Não

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint

Máximo de conexões TCP entre o gateway e um único Pod do service de backend.

—

Não

mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection

Máximo de requisições HTTP por conexão entre o gateway e o service de backend.

—

Não

Example: Para demo-service, defina um máximo de 10 conexões totais e 2 conexões por Pod.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Versões de TLS e suítes de criptografia

O intervalo padrão de versões de TLS para o MSE Ingress é de TLSv1.0 (mais antiga) a TLSv1.3 (mais recente). As suítes de criptografia padrão são:

  • 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

Use as seguintes annotations para configurar as definições de TLS por nome de domínio.

Annotation

Descrição

Padrão

Obrigatório

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

Versão TLS mais antiga aceita. Valores válidos: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3.

TLSv1.0

Não

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

Versão TLS mais recente aceita.

TLSv1.3

Não

nginx.ingress.kubernetes.io/ssl-cipher

Suítes de criptografia TLS, separadas por vírgula. Entra em vigor apenas para versões TLS 1.0–1.2.

Ver lista padrão acima

Não

Example: Restrinja example.com apenas ao TLSv1.2.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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

Mutual TLS (mTLS) entre um gateway e um service de backend

Por padrão, o MSE Ingress usa HTTP para encaminhar requisições para contêineres de backend. Quando você define nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", o MSE Ingress usa TLS unidirecional: ele autentica o certificado do backend, que deve ser emitido por uma autoridade certificadora (CA) reconhecida.

Para Mutual TLS (mTLS), tanto o gateway quanto o service de backend autenticam os certificados um do outro.

Annotation

Descrição

Padrão

Obrigatório

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

Certificado de cliente usado pelo gateway para se autenticar no backend. Formato: secretNamespace/secretName.

—

Sim (para mTLS)

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

Server Name Indication (SNI) usado durante o handshake TLS.

—

Não

nginx.ingress.kubernetes.io/proxy-ssl-server-name

Ativa ou desativa o SNI durante o handshake TLS.

—

Não

Example: Configure mTLS entre o gateway e demo-service usando gateway-cert no namespace default.

Kubernetes v1.19+:

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

Kubernetes anterior à v1.19:

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