Todos os produtos
Search
Central de documentação

Microservices Engine:Uso avançado do MSE Ingress

Última atualização: Jul 05, 2026

O MSE Ingress oferece balanceamento de carga na camada 7 para gerenciar o acesso externo aos serviços em um cluster Kubernetes. Configure recursos baseados em anotações 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 tanto para Kubernetes v1.19+ (networking.k8s.io/v1) quanto para versões anteriores (networking.k8s.io/v1beta1).

Referência rápida de anotações

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

Anotação

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

cabeçalhos separados por vírgula ou *

DNT,X-CustomHeader,...

Rota

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

cabeçalhos 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 esquema)

Rota

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

código de status HTTP

301

Rota

nginx.ingress.kubernetes.io/temporal-redirect

URL (com esquema)

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 cabeçalhos 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 cabeçalhos 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 anotação nginx.ingress.kubernetes.io/canary: "true". Em seguida, aplique uma ou mais das anotações específicas de estratégia abaixo.

O MSE Ingress suporta mais de duas versões de serviço 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 cabeçalho ou parâmetro de consulta (maior prioridade)

  2. Baseada em cookie

  3. Baseada em peso (menor prioridade)

Canary release baseado em cabeçalho

Anotação

Descrição

Padrão

Obrigatório

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

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

Sim (para canary baseado em cabeçalho)

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

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

Não

Exemplo 1: Roteamento pela presença de cabeçalho

Quando o cabeçalho da requisição mse está 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 múltiplas versões canary por valor exato de cabeçalho

Quando o cabeçalho 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 consulta

Anotação

Descrição

Padrão

Obrigatório

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

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

Sim (para canary baseado em consulta)

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

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

Não

É possível combinar condições baseadas em cabeçalho e em parâmetro de consulta. As requisições são enviadas para a versão canary apenas quando ambas as condições correspondem simultaneamente.

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

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: Combinação de parâmetro de consulta com condições de cabeçalho

Quando a URL contém canary=gray E o cabeçalho 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

Anotação

Descrição

Padrão

Obrigatório

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

Encaminha requisições para a versão canary quando o cookie especificado está definido como always. Valores personalizados de cookie não são suportados — 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

Anotação

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/canary-weight

Porcentagem de requisições enviadas para a 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 ao calcular a 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 serviço

Um subconjunto de serviço permite rotear requisições para um grupo específico de Pods dentro de um único Serviço Kubernetes — útil quando um Serviço é sustentado por múltiplos Deployments executando versões diferentes. O MSE Ingress fornece dois métodos para definir subconjuntos.

Uso de rótulos de pod no MseIngressConfig

Utilize a anotação mse.ingress.kubernetes.io/service-subset para selecionar Pods pelos seus rótulos 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 rotulados com opensergo.io/canary-{value}: {value} — por exemplo, opensergo.io/canary-gray: gray.

Example: Um Serviço chamado go-httpbin é sustentado por dois Deployments. Os Pods base não possuem rótulo canary do OpenSergo. Os Pods gray possuem o rótulo opensergo.io/canary-gray: gray.

Manifests do Serviço e do 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

Uso de 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 subset-labels está definido, o subconjunto não é mais mapeado para rótulos com o prefixo opensergo.io/canary.

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

Manifests do Serviço e do 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).

Anotação

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/enable-cors

Habilita o CORS neste Ingress.

false

Sim (para habilitar 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

Cabeçalhos 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

Cabeçalhos de resposta expostos ao navegador. Aceita valores separados por vírgula.

Não

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

Se 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 métodos a GET e POST, permita o cabeçalho de requisição X-Foo-Bar e desabilite 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 requisições para example.com cujos caminhos começam com /app ou /test para o serviço demo.

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 em uma requisição antes que ela chegue ao serviço de backend.

Anotação

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

Anotação

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

Anotação

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/permanent-redirect

URL de destino para o redirecionamento permanente. Deve incluir o esquema (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

Anotação

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/temporal-redirect

URL de destino para o redirecionamento temporário. Deve incluir o esquema (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 cabeçalhos

O controle de cabeçalhos permite adicionar, modificar ou remover cabeçalhos de requisição antes que o MSE Ingress encaminhe uma requisição para um serviço de backend, e cabeçalhos de resposta antes que a resposta seja retornada ao cliente.

Controle de cabeçalhos de requisição

Anotação

Descrição

Padrão

Obrigatório

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

Adiciona um cabeçalho à requisição. Se o cabeçalho já existir, o valor é anexado ao valor original. Para um único cabeçalho, use um par chave-valor. Para múltiplos cabeçalhos, use bloco escalar YAML (`

`) com um par chave-valor por linha.

Não

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

Modifica um cabeçalho existente na requisição. Se o cabeçalho já existir, o valor sobrescreve o original. Mesma sintaxe de request-header-control-add.

Não

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

Remove um cabeçalho da requisição. Para múltiplos cabeçalhos, 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 controle de cabeçalhos com canary releases. Quando o cabeçalho 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 cabeçalhos de resposta

Anotação

Descrição

Padrão

Obrigatório

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

Adiciona um cabeçalho à resposta do backend antes de encaminhar para o cliente. Se o cabeçalho já existir, o valor é anexado. Mesma sintaxe do controle de cabeçalhos de requisição.

Não

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

Modifica um cabeçalho de resposta existente. Se o cabeçalho já existir, o valor sobrescreve o original. Mesma sintaxe do controle de cabeçalhos de requisição.

Não

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

Remove um cabeçalho de resposta antes de encaminhar para o cliente. Para múltiplos cabeçalhos, separe-os com vírgulas (,).

Não

Example: Remova o cabeçalho 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 condições de retry, limites e timeouts com as seguintes anotações.

Anotação

Descrição

Padrão

Obrigatório

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

Número máximo de tentativas de retry.

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 (habilita retries para POST e PATCH), off (desabilita retries).

error,timeout

Não

Por padrão, o MSE Ingress não realiza retry de 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 habilitar 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 habilite 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

Anotação

Descrição

Padrão

Obrigatório

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

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

Não

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

Endereços IP ou blocos CIDR bloqueados para esta rota. Separados 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 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

Anotação

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. Listas de permissões no nível de rota têm precedência. Separados 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. Listas de bloqueios no nível de rota têm precedência. Separados 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 substitui 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 gateway único

A limitação de taxa por gateway único restringe a taxa de requisições em uma rota por réplica de gateway. Use este recurso para controle de taxa por instância. Para 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 burst. A anotação route-limit-rpm ou route-limit-rps define a taxa sustentada — a velocidade com que o token bucket é reabastecido. A anotação route-limit-burst-multiplier define a capacidade de burst como um múltiplo dessa taxa: limite de burst = taxa x multiplicador. Requisições que excedem a capacidade de burst são rejeitadas com local_rate_limited no corpo da resposta.

Anotação

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 burst = RPM x 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 burst = RPS x route-limit-burst-multiplier. Mesmos códigos de resposta que RPM.

Não

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

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

5

Não

Example 1: Limite example.com/test a 100 RPM com um limite de burst 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 burst 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 impor 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

Anotação

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

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 overload"
  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 overload"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirecionamento

Anotação

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

Anotação

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 requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster, com 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 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 overload.

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 overload"
  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 overload"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirecionamento

Anotação

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 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 ativas para um serviço secundário sem afetar a resposta original. Utilize este recurso para auditoria, testes ou depuração de tráfego em um ambiente sombra.

Anotação

Descrição

Padrão

Obrigatório

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

Serviço de destino para o tráfego espelhado. Formato: namespace/name:port. namespace assume o namespace do gateway se omitido. port assume a primeira porta do Serviço se omitido.

Sim (para habilitar 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 serviço de destino, o sufixo -shadow é automaticamente anexado ao cabeçalho 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 serviço de backend: HTTPS e gRPC

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

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

Example 1: Encaminhe requisições para um backend via 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. Dois métodos estão disponíveis.

Método 1 — use a anotação 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 Serviço 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 com base na distribuição de tráfego e nos requisitos de sessão:

Algoritmo

Valor da anotação

Descrição

Use quando

Round robin

round_robin

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

Padrão; adequado para backends stateless 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 sem estado.

Consistent hashing

Veja abaixo

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

Afinidade de sessão por IP, cabeçalho ou parâmetro de consulta.

Importante

O algoritmo de média móvel ponderada exponencialmente (EWMA) não é suportado. Se configurado, ele reverte para round robin.

Algoritmos comuns de balanceamento de carga

Anotação

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

Consistent hashing

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

Anotação

Descrição

Padrão

Obrigatório

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

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

Sim (para consistent hashing)

Example 1: Hash por IP do cliente — 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: Hash pelo cabeçalho de requisição X-Stage — 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: Hash pelo parâmetro de consulta x-stage — 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.

Anotação

Descrição

Padrão

Obrigatório

mse.ingress.kubernetes.io/warmup

Duração da janela de warm-up em segundos. Quando um novo Pod inicia, o tráfego aumenta gradualmente durante este período.

Warm-up desativado

Não

Example: Habilite 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 usando um cookie gerado pelo gateway. Na primeira requisição, o MSE Ingress define um cookie na resposta. Requisições subsequentes do mesmo cliente incluem esse cookie e são roteadas para o mesmo Pod.

Anotação

Descrição

Padrão

Obrigatório

nginx.ingress.kubernetes.io/affinity

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

Sim (para habilitar 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: Habilite afinidade de cookie com 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: Habilite 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 gateway e serviço de backend

Configure um pool de conexões para controlar o número de conexões entre o gateway e um serviço de backend. Isso evita que o backend seja sobrecarregado durante picos de tráfego.

Anotação

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 serviço 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 serviço 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 serviço 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 TLS e suítes de criptografia

O intervalo padrão de versões 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 anotações para configurar definições TLS por nome de domínio.

Anotação

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. Tem efeito apenas para versões TLS 1.0–1.2.

Ver lista padrão acima

Não

Example: Restrinja example.com apenas a 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 gateway e serviço de backend

Por padrão, o MSE Ingress usa HTTP para encaminhar requisições aos containers de backend. Quando nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" está definido, 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 serviço de backend autenticam os certificados um do outro.

Anotação

Descrição

Padrão

Obrigatório

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

Certificado de cliente usado pelo gateway para autenticação 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

Habilita ou desabilita 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