O MSE Ingress fornece balanceamento de carga na camada 7 para gerenciar o acesso externo aos services em um cluster Kubernetes. Configure os recursos baseados em annotations nos recursos de Ingress — desde canary releases e limitação de taxa até TLS e espelhamento de tráfego.
Todos os exemplos incluem configurações para Kubernetes v1.19+ (networking.k8s.io/v1) e versões anteriores (networking.k8s.io/v1beta1).
Referência rápida de annotations
Todas as annotations neste documento usam o prefixo nginx.ingress.kubernetes.io/ ou mse.ingress.kubernetes.io/. A tabela abaixo lista cada annotation com seus valores aceitos, padrão e escopo.
|
Annotation |
Valores aceitos |
Padrão |
Escopo |
|
|
|
— |
Rota |
|
|
string |
— |
Rota |
|
|
string |
— |
Rota |
|
|
string |
— |
Rota |
|
|
inteiro (0–100 ou 0–total) |
— |
Rota |
|
|
inteiro |
|
Rota |
|
|
string |
— |
Rota |
|
|
string |
— |
Rota |
|
|
string |
— |
Rota |
|
|
|
— |
Rota |
|
|
|
|
Rota |
|
|
origens separadas por vírgula ou |
|
Rota |
|
|
métodos HTTP separados por vírgula ou |
|
Rota |
|
|
headers separados por vírgula ou |
|
Rota |
|
|
headers separados por vírgula |
— |
Rota |
|
|
|
|
Rota |
|
|
inteiro (segundos) |
|
Rota |
|
|
|
— |
Rota |
|
|
string de caminho |
— |
Rota |
|
|
hostname |
— |
Rota |
|
|
|
|
Rota |
|
|
|
|
Rota |
|
|
URL (com scheme) |
— |
Rota |
|
|
código de status HTTP |
|
Rota |
|
|
URL (com scheme) |
— |
Rota |
|
|
|
— |
Rota |
|
|
|
— |
Rota |
|
|
nomes de headers separados por vírgula |
— |
Rota |
|
|
|
— |
Rota |
|
|
|
— |
Rota |
|
|
nomes de headers separados por vírgula |
— |
Rota |
|
|
inteiro |
|
Rota |
|
|
inteiro (segundos) |
sem timeout |
Rota |
|
|
condições separadas por vírgula |
|
Rota |
|
|
IPs ou CIDRs separados por vírgula |
— |
Rota |
|
|
IPs ou CIDRs separados por vírgula |
— |
Rota |
|
|
IPs ou CIDRs separados por vírgula |
— |
Domínio |
|
|
IPs ou CIDRs separados por vírgula |
— |
Domínio |
|
|
inteiro |
— |
Rota |
|
|
inteiro |
— |
Rota |
|
|
inteiro |
|
Rota |
|
|
inteiro (RPS) |
— |
Rota |
|
|
código de status HTTP |
|
Rota |
|
|
|
|
Rota |
|
|
string |
|
Rota |
|
|
URL |
— |
Rota |
|
|
inteiro |
— |
Rota |
|
|
código de status HTTP |
|
Rota |
|
|
|
|
Rota |
|
|
string |
|
Rota |
|
|
URL |
— |
Rota |
|
|
|
— |
Rota |
|
|
inteiro (0–100) |
|
Rota |
|
|
|
— |
Rota |
|
|
|
|
Rota |
|
|
variável ou expressão NGINX |
— |
Rota |
|
|
inteiro (segundos) |
desativado |
Rota |
|
|
|
— |
Rota |
|
|
|
|
Rota |
|
|
string |
|
Rota |
|
|
string de caminho |
|
Rota |
|
|
inteiro (segundos) |
escopo de sessão |
Rota |
|
|
inteiro (segundos) |
escopo de sessão |
Rota |
|
|
inteiro |
— |
Rota |
|
|
inteiro |
— |
Rota |
|
|
inteiro |
— |
Rota |
|
|
|
|
Domínio |
|
|
|
|
Domínio |
|
|
suítes de criptografia separadas por vírgula |
ver padrões |
Domínio |
|
|
|
— |
Rota |
|
|
hostname |
— |
Rota |
|
|
|
— |
Rota |
Canary release
O MSE Ingress suporta quatro estratégias de canary release. Ative o canary em qualquer recurso de Ingress adicionando a annotation nginx.ingress.kubernetes.io/canary: "true". Em seguida, aplique uma ou mais das annotations específicas de estratégia abaixo.
O MSE Ingress suporta mais de duas versões de service em um único canary release, sem limite superior. O NGINX Ingress e o ALB Ingress suportam no máximo duas versões.
Quando várias estratégias são configuradas simultaneamente, o MSE Ingress as aplica nesta ordem de precedência:
Baseada em header ou parâmetro de query (maior prioridade)
Baseada em cookie
Baseada em peso (menor prioridade)
Canary release baseado em header
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Roteia requisições para a versão canary quando o header especificado está presente e definido como |
— |
Sim (para canary baseado em header) |
|
|
Roteia requisições para a versão canary apenas quando o header corresponde tanto à chave (de |
— |
Não |
Exemplo 1: Roteamento por presença de header
Quando o header da requisição mse é definido como always, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Exemplo 2: Roteamento de várias versões canary por valor exato de header
Quando o header mse: v1 está presente, as requisições vão para demo-service-canary-v1. Quando mse: v2 está presente, elas vão para demo-service-canary-v2. Todas as outras requisições vão para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v2
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
name: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v2
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Canary release baseado em parâmetro de query
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Roteia requisições para a versão canary quando o parâmetro de query especificado está presente e definido como |
— |
Sim (para canary baseado em query) |
|
|
Roteia requisições para a versão canary apenas quando o parâmetro de query corresponde tanto à chave quanto a este valor. |
— |
Não |
As condições baseadas em header e parâmetro de query podem ser combinadas. As requisições vão para a versão canary apenas quando ambas as condições correspondem simultaneamente.
Exemplo 1: Roteamento por valor de parâmetro de query
Quando a URL contém canary=gray, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Exemplo 2: Combinar parâmetro de query com condições de header
Quando a URL contém canary=gray E o header da requisição contém x-user-id: test, as requisições vão para demo-service-canary. Ambas as condições devem corresponder.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
mse.ingress.kubernetes.io/canary-by-query: "canary"
mse.ingress.kubernetes.io/canary-by-query-value: "gray"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Canary release baseado em cookie
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Roteia requisições para a versão canary quando o cookie especificado está definido como |
— |
Sim (para canary baseado em cookie) |
Example: Quando o cookie da requisição demo=always está presente, as requisições vão para demo-service-canary. Todas as outras requisições vão para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
name: demo-canary
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Canary release baseado em peso
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Porcentagem de requisições encaminhadas à versão canary. Inteiro no intervalo de 0–100 (ou 0– |
— |
Sim (para canary baseado em peso) |
|
|
Peso total usado como denominador no cálculo da distribuição de requisições. |
|
Não |
Example: Distribua o tráfego entre três versões — 30% para demo-service-canary-v1, 20% para demo-service-canary-v2 e 50% para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
name: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v2
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
name: demo-canary-v2
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v2
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Subconjunto de service
Um subconjunto de service permite rotear requisições para um grupo específico de Pods dentro de um único Service do Kubernetes — útil quando um Service é suportado por vários Deployments com versões diferentes. O MSE Ingress oferece dois métodos para definir subconjuntos.
Usar rótulos de Pod no MseIngressConfig
Use a annotation mse.ingress.kubernetes.io/service-subset para selecionar Pods por seus rótulos de canary do OpenSergo:
""oubase: roteia para Pods sem um prefixo de rótuloopensergo.io/canary, ou comopensergo.io/canary: "".Qualquer outro valor (por exemplo,
gray): roteia para Pods com o rótuloopensergo.io/canary-{value}: {value}— por exemplo,opensergo.io/canary-gray: gray.
Example: Um Service chamado go-httpbin é suportado por dois Deployments. Os Pods base não têm rótulo de canary do OpenSergo. Os Pods gray têm o rótulo opensergo.io/canary-gray: gray.
Manifests de Service e Deployment:
# go-httpbin Service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# Base Deployment — no OpenSergo canary label
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-base
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# Gray Deployment — has the OpenSergo canary label
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-gray
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
opensergo.io/canary-gray: gray
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin
Configuração do Ingress — requisições com x-user-id: test vão para go-httpbin-gray; todas as outras vão para go-httpbin-base:
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods labeled opensergo.io/canary-gray: gray
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# Forward to Pods without the opensergo.io/canary label prefix
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods labeled opensergo.io/canary-gray: gray
mse.ingress.kubernetes.io/service-subset: gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
# Forward to Pods without the opensergo.io/canary label prefix
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
Usar rótulos personalizados
Combine mse.ingress.kubernetes.io/service-subset com mse.ingress.kubernetes.io/subset-labels para definir o subconjunto por qualquer rótulo de Pod em vez do prefixo opensergo.io/canary.
Quando você definesubset-labels, o subconjunto deixa de ser mapeado para rótulos com o prefixoopensergo.io/canary.
Example: O Deployment gray tem version: gray em vez de um rótulo do OpenSergo.
Manifests de Service e Deployment:
# go-httpbin Service
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: go-httpbin
---
# Base Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-base
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
- "--version=base"
imagePullPolicy: Always
name: go-httpbin
---
# Gray Deployment — uses a custom label instead of opensergo.io/canary
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin-gray
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
version: gray
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
args:
- "--version=gray"
imagePullPolicy: Always
name: go-httpbin
Configuração do Ingress — requisições com x-user-id: test vão para go-httpbin-gray; todas as outras vão para go-httpbin-base:
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods labeled version: gray
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 8080
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
nginx.ingress.kubernetes.io/canary-by-header-value: "test"
# Forward to Pods labeled version: gray
mse.ingress.kubernetes.io/service-subset: gray
mse.ingress.kubernetes.io/subset-labels: version gray
name: demo-canary
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/service-subset: ""
name: demo
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
backend:
serviceName: go-httpbin
servicePort: 8080
CORS
O Cross-Origin Resource Sharing (CORS) permite que aplicações web acessem recursos em uma origem diferente. Para a especificação CORS, consulte Cross-Origin Resource Sharing (CORS).
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Ativa o CORS neste Ingress. |
|
Sim (para ativar o CORS) |
|
|
Origens de terceiros permitidas. Aceita valores separados por vírgula e curingas ( |
|
Não |
|
|
Métodos HTTP permitidos. Aceita valores separados por vírgula e curingas ( |
|
Não |
|
|
Headers de requisição permitidos. Aceita valores separados por vírgula e curingas ( |
|
Não |
|
|
Headers de resposta expostos ao navegador. Aceita valores separados por vírgula. |
— |
Não |
|
|
Se as credenciais podem ser incluídas nas requisições CORS. |
|
Não |
|
|
Duração do cache para resultados de preflight, em segundos. |
|
Não |
Example: Permita example.com como origem, restrinja os métodos a GET e POST, permita o header de requisição X-Foo-Bar e desative a passagem de credenciais.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Correspondência por expressão regular
Além da correspondência exata e por prefixo, o MSE Ingress suporta correspondência por expressão regular. Defina nginx.ingress.kubernetes.io/use-regex: "true" para tratar o caminho definido na especificação do Ingress como uma expressão regular.
Example: Encaminhe para o service demo as requisições destinadas a example.com cujos caminhos comecem com /app ou /test.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: 'true'
name: regex-match
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo
port:
number: 8080
path: /(app|test)/(.*)
pathType: Prefix
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: 'true'
name: regex-match
namespace: default
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /(app|test)/(.*)
backend:
serviceName: demo
servicePort: 8080
Reescrita de caminho e host
As operações de reescrita modificam o caminho ou o host de uma requisição antes de ela chegar ao service de backend.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Caminho de destino. Suporta grupos de captura do padrão de caminho do Ingress. |
— |
Sim (para reescrita de caminho) |
|
|
Host de destino. |
— |
Sim (para reescrita de host) |
Reescrita de caminho
Example 1: Reescreva example.com/test para example.com/dev antes de encaminhar para o backend.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/dev"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /test
pathType: Exact
backend:
serviceName: demo-service
servicePort: 80
Example 2: Remova o prefixo /v1 — reescreva example.com/v1/xxx para example.com/xxx.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80
Example 3: Substitua o prefixo /v1 por /v2 — reescreva example.com/v1/xxx para example.com/v2/xxx.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /v1/(.*)
pathType: Prefix
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /v1/(.*)
pathType: Prefix
backend:
serviceName: demo-service
servicePort: 80
Reescrita de host
Example: Reescreva o host de example.com para test.com antes de encaminhar example.com/test para o backend.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Redirecionamento
Redirecionamento de HTTP para HTTPS
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Força o redirecionamento de requisições HTTP para HTTPS. |
|
Sim (para ativar o redirecionamento) |
|
|
Força o redirecionamento de requisições HTTP para HTTPS. |
|
Sim (alternativa a |
O MSE Ingress trata tantossl-redirectquantoforce-ssl-redirectde forma idêntica — ambos forçam o redirecionamento de HTTP para HTTPS.
Example: Redirecione http://example.com/test para https://example.com/test.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Redirecionamento permanente
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
URL de destino para o redirecionamento permanente. Deve incluir o scheme ( |
— |
Sim (para redirecionamento permanente) |
|
|
Código de status HTTP para o redirecionamento. |
|
Não |
Example: Redirecione permanentemente http://example.com/test para http://example.com/app.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Redirecionamento temporário
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
URL de destino para o redirecionamento temporário. Deve incluir o scheme ( |
— |
Sim (para redirecionamento temporário) |
Example: Redirecione temporariamente http://example.com/test para http://example.com/app.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Controle de headers
O controle de headers permite adicionar, modificar ou remover headers de requisição antes de o MSE Ingress encaminhar a requisição para um service de backend. Também permite alterar headers de resposta antes de o sistema retorná-los ao cliente.
Controle de headers de requisição
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
|
Adiciona um header à requisição. Se o header já existir, o sistema anexa o novo valor ao original. Para um único header, use um par chave-valor. Para múltiplos headers, use o bloco escalar YAML ( |
`) com um par chave-valor por linha. |
— |
Não |
|
|
Modifica um header existente na requisição. Se o header já existir, o novo valor sobrescreve o original. A sintaxe é a mesma de |
— |
Não |
|
|
|
Remove um header da requisição. Para múltiplos headers, separe-os com vírgulas ( |
— |
Não |
Example 1: Adicione foo: bar e test: true a todas as requisições para example.com/test.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: |
foo bar
test true
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Combine o controle de headers com canary releases. Quando o header da requisição for mse: v1, a requisição vai para demo-service-canary-v1 com stage: gray adicionado. Todas as outras requisições vão para demo-service com stage: production adicionado.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service-canary-v1
port:
number: 80
path: /hello
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "mse"
nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
name: demo-canary-v1
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service-canary-v1
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-add: "stage production"
name: demo
spec:
ingressClassName: mse
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
Controle de headers de resposta
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Adiciona um header à resposta do backend antes de encaminhá-la ao cliente. Se o header já existir, o sistema anexa o novo valor. A sintaxe é a mesma do controle de headers de requisição. |
— |
Não |
|
|
Modifica um header de resposta existente. Se o header já existir, o novo valor sobrescreve o original. A sintaxe é a mesma do controle de headers de requisição. |
— |
Não |
|
|
Remove um header de resposta antes de encaminhá-la ao cliente. Para múltiplos headers, separe-os com vírgulas ( |
— |
Não |
Example: Remova o header req-cost-time das respostas para example.com/test.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Retry
O MSE Ingress fornece retry automático no nível de rota para requisições com falha. Configure as condições, limites e timeouts de retry com as seguintes annotations.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Número máximo de retries. |
|
Não |
|
|
Timeout para todas as tentativas de retry combinadas, em segundos. |
Sem timeout |
Não |
|
|
Condições de retry, separadas por vírgula. Valores válidos: |
|
Não |
Por padrão, o MSE Ingress não tenta novamente requisições não idempotentes (POST, PATCH) mesmo quando outras condições de retry são atendidas. Adicionenon_idempotentaproxy-next-upstreampara ativar retries para esses métodos.
Example: Para example.com/test, defina um máximo de 2 retries com timeout de 5 segundos, acione retries apenas em HTTP 502 e ative retries para requisições não idempotentes.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Listas de permissões e listas de bloqueios de endereços IP
O MSE Ingress suporta listas de permissões (whitelists) e listas de bloqueios (blacklists) de endereços IP tanto no nível de rota quanto no nível de domínio. As regras no nível de rota têm precedência sobre as regras no nível de domínio.
Controle de IP no nível de rota
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Endereços IP ou blocos CIDR permitidos para esta rota. Separe-os por vírgula. |
— |
Não |
|
|
Endereços IP ou blocos CIDR bloqueados para esta rota. Separe-os por vírgula. |
— |
Não |
Example 1: Permita acesso a example.com/test apenas a partir de 1.1.X.X.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Bloqueie o acesso a example.com/test a partir de 2.2.2.2.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Controle de IP no nível de domínio
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Endereços IP ou blocos CIDR permitidos para todas as rotas de um domínio. As listas de permissões no nível de rota têm precedência. Separe-os por vírgula. |
— |
Não |
|
|
Endereços IP ou blocos CIDR bloqueados para todas as rotas de um domínio. As listas de bloqueios no nível de rota têm precedência. Separe-os por vírgula. |
— |
Não |
Example 1: Permita acesso a todas as rotas de example.com a partir de 1.1.X.X e 2.2.2.2.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
- backend:
service:
name: app-service
port:
number: 80
path: /app
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
- path: /app
backend:
serviceName: app-service
servicePort: 80
Example 2: Permita todas as rotas de example.com a partir de 1.1.X.X e 2.2.2.2, mas restrinja /order apenas a 3.3.X.X. A lista de permissões no nível de rota em /order sobrescreve a lista de permissões no nível de domínio para essa rota.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
- backend:
service:
name: app-service
port:
number: 80
path: /app
pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
name: demo-route
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
name: demo-domain
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
- path: /app
backend:
serviceName: app-service
servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
name: demo-route
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /order
backend:
serviceName: demo-service
servicePort: 80
Limitação de taxa por instância de gateway
A limitação de taxa por instância de gateway restringe a taxa de requisições em uma rota por réplica de gateway. Use este recurso para o controle de taxa por instância. Para o controle de taxa em todo o cluster, consulte Controle global de limitação de taxa.
O MSE Ingress usa um modelo de token bucket para controle de pico. A annotation route-limit-rpm ou route-limit-rps define a taxa sustentada, ou seja, a velocidade com que o token bucket é recarregado. A annotation route-limit-burst-multiplier define a capacidade de pico como um múltiplo dessa taxa: limite de pico = taxa × multiplicador. O sistema rejeita as requisições que excedem a capacidade de pico e retorna local_rate_limited no corpo da resposta.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Máximo de requisições por minuto (RPM) por réplica de gateway. Limite de pico = RPM × |
— |
Não |
|
|
Máximo de requisições por segundo (RPS) por réplica de gateway. Limite de pico = RPS × |
— |
Não |
|
|
Multiplicador de capacidade de pico aplicado ao limite de RPM ou RPS configurado. |
|
Não |
Example 1: Limite example.com/test a 100 RPM com um limite de pico de 200 (multiplicador = 2).
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rpm: "100"
mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rpm: "100"
mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Limite example.com/test a 10 RPS com o limite de pico padrão de 50 (multiplicador = 5).
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rps: "10"
# Default burst multiplier is 5, giving a burst limit of 50 RPS
# mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/route-limit-rps: "10"
# Default burst multiplier is 5, giving a burst limit of 50 RPS
# mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Controle global de limitação de taxa
O MSE Ingress integra-se ao Sentinel para aplicar um limite global de RPS em todas as réplicas de um cluster de gateway no nível de rota. Quando a limitação é acionada, o código de resposta padrão é 429 e o corpo da resposta é sentinel rate limited.
O controle global de limitação de taxa requer a versão 1.2.25 ou posterior do gateway MSE Ingress.
Configure o limite de taxa em todo o cluster com mse.ingress.kubernetes.io/rate-limit. Para personalizar a resposta de limitação, escolha uma das duas abordagens: resposta personalizada ou redirecionamento. Apenas uma abordagem pode estar ativa por vez.
Resposta personalizada
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
RPS máximo para esta rota em todo o cluster de gateway. |
— |
Sim |
|
|
Código de resposta HTTP retornado quando a limitação é acionada. |
|
Não |
|
|
Tipo de conteúdo do corpo da resposta. |
|
Não |
|
|
Conteúdo do corpo da resposta quando a limitação é acionada. |
|
Não |
Example 1: Limite example.com/test a 100 RPS em todo o cluster com a resposta padrão (HTTP 429, sentinel rate limited).
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Limite example.com/test a 100 RPS em todo o cluster. Quando limitado, retorne HTTP 503 com o corpo server is overloaded.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overloaded"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overloaded"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Redirecionamento
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
URL para redirecionar o cliente quando a limitação é acionada. |
— |
Não |
Example: Limite example.com/test a 100 RPS em todo o cluster. Quando limitado, redirecione para example.com/fallback.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/rate-limit: "100"
mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Controle global de concorrência
O MSE Ingress integra-se ao Sentinel para limitar o número de requisições em andamento (in-flight) em uma rota em todo o cluster de gateway. Quando o limite é excedido, o código de resposta padrão é 429 e o corpo da resposta é sentinel rate limited.
O controle global de concorrência requer a versão 1.2.25 ou posterior do gateway MSE Ingress.
Configure o limite de concorrência em todo o cluster com mse.ingress.kubernetes.io/concurrency-limit. Para personalizar a resposta quando o limite é excedido, use resposta personalizada ou redirecionamento. Apenas uma abordagem pode estar ativa por vez.
Resposta personalizada
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Número máximo de requisições em andamento para esta rota em todo o cluster de gateway. |
— |
Sim |
|
|
Código de resposta HTTP quando o controle de concorrência é acionado. |
|
Não |
|
|
Tipo de conteúdo do corpo da resposta. |
|
Não |
|
|
Conteúdo do corpo da resposta quando o controle de concorrência é acionado. |
|
Não |
Example 1: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster e mantenha a resposta padrão.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster. Quando o limite for excedido, retorne HTTP 503 com o corpo server is overloaded.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overloaded"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overloaded"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Redirecionamento
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
URL para redirecionar o cliente quando o controle de concorrência é acionado. |
— |
Não |
Example: Limite as requisições simultâneas em andamento para example.com/test a 1.000 em todo o cluster. Quando o limite for excedido, redirecione para example.com/fallback.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/concurrency-limit: "1000"
mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Espelhamento de tráfego
O espelhamento de tráfego copia requisições ao vivo para um service secundário sem afetar a resposta original. Use-o para auditoria, testes ou depuração de tráfego em um ambiente espelhado (shadow).
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Service de destino para o tráfego espelhado. Formato: |
— |
Sim (para ativar o espelhamento) |
|
|
Porcentagem de tráfego a ser espelhada. Intervalo válido: 0–100. |
|
Não |
Quando o tráfego espelhado é encaminhado para o service de destino, o sistema anexa automaticamente o sufixo-shadowao headerHost. Por exemplo,example.comtorna-seexample.com-shadow.
Example 1: Espelhe 100% das requisições para example.com/test para test/app:8080.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Espelhe 10% das requisições para example.com/test para test/app:8080.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
mse.ingress.kubernetes.io/mirror-percentage: 10
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Protocolos de service de backend: HTTPS e gRPC
Por padrão, o MSE Ingress usa HTTP para encaminhar requisições para contêineres de backend. Use nginx.ingress.kubernetes.io/backend-protocol para mudar para HTTPS ou gRPC.
Se o recurso Service do Kubernetes para o seu backend tiver uma porta chamadagrpcouhttp2, o MSE Ingress usa automaticamente o protocolo correspondente sem exigir a annotationbackend-protocol. Isso difere do comportamento padrão do NGINX Ingress.
Example 1: Encaminhe requisições para um backend por HTTPS.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Encaminhe requisições para um backend gRPC. Há dois métodos disponíveis.
Método 1 — use a annotation backend-protocol:
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Método 2 — nomeie a porta do Service como grpc para que o MSE Ingress detecte automaticamente o protocolo:
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
ports:
- name: grpc
port: 80
protocol: TCP
selector:
app: demo-service
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
ports:
- name: grpc
port: 80
protocol: TCP
selector:
app: demo-service
Algoritmos de balanceamento de carga
O MSE Ingress suporta vários algoritmos de balanceamento de carga para distribuir requisições aos Pods de backend. Escolha o algoritmo com base na sua distribuição de tráfego e nos requisitos de sessão:
|
Algoritmo |
Valor da annotation |
Descrição |
Use quando |
|
Round robin |
|
Distribui requisições uniformemente entre os Pods em rotação. |
Padrão; adequado para backends stateless e com desempenho uniforme. |
|
Least connections |
|
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 |
|
Roteia requisições para um Pod selecionado aleatoriamente. |
Distribuição uniforme simples e sem estado. |
|
Hashing consistente |
Veja abaixo |
Roteia requisições com a mesma chave de hash para o mesmo Pod. |
Afinidade de sessão por IP, header ou parâmetro de query. |
O MSE Ingress não suporta o algoritmo de média móvel ponderada exponencialmente (EWMA). Se configurado, o sistema retorna ao round robin.
Algoritmos comuns de balanceamento de carga
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Algoritmo de balanceamento de carga. Valores válidos: |
|
Não |
Example: Use least connections para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /order
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "least_conn"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Hashing consistente
O hashing consistente roteia requisições com a mesma chave de hash para o mesmo Pod de backend. O MSE Ingress suporta hashing por variáveis do NGINX, headers de requisição ou parâmetros de query.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Expressão da chave de hash. Valores suportados: variáveis do NGINX (ex: |
— |
Sim (para hashing consistente) |
Example 1: Faça o hash por IP do cliente: as requisições do mesmo IP sempre chegam ao mesmo Pod.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Faça o hash pelo header de requisição X-Stage: as requisições com o mesmo valor de X-Stage sempre chegam ao mesmo Pod.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 3: Faça o hash pelo parâmetro de query x-stage: as requisições com o mesmo valor de x-stage sempre chegam ao mesmo Pod.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Warm-up (inicialização gradual)
O recurso de warm-up aumenta gradualmente o tráfego para um Pod recém-iniciado durante uma janela de tempo especificada, evitando que um Pod frio receba carga total imediatamente. Apenas os algoritmos round robin e least connections suportam warm-up.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Duração da janela de warm-up em segundos. Quando um novo Pod é iniciado, o tráfego aumenta gradualmente ao longo desse período. |
Warm-up desativado |
Não |
Example: Ative uma janela de warm-up de 30 segundos para demo-service.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/warmup: "30"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Afinidade de cookie (persistência de sessão)
A afinidade de cookie fixa um cliente ao mesmo Pod de backend entre requisições por meio de um cookie gerado pelo gateway. Na primeira requisição, o MSE Ingress define um cookie na resposta. As requisições subsequentes do mesmo cliente incluem esse cookie e o sistema as roteia para o mesmo Pod.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Ativa a afinidade de cookie. O único valor válido é |
— |
Sim (para ativar afinidade de cookie) |
|
|
Modo de afinidade. O único valor válido é |
|
Não |
|
|
Nome do cookie usado como chave de hash. |
|
Não |
|
|
Atributo de caminho do cookie gerado. |
|
Não |
|
|
Tempo de expiração do cookie gerado, em segundos. |
Escopo de sessão |
Não |
|
|
Tempo de expiração do cookie gerado, em segundos. |
Escopo de sessão |
Não |
Example 1: Ative a afinidade de cookie com os padrões — nome do cookie INGRESSCOOKIE, caminho /, tempo de vida com escopo de sessão.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Example 2: Ative a afinidade de cookie com um cookie personalizado chamado test, caminho / e expiração de 10 segundos.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "test"
nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "test"
nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Pool de conexões entre um gateway e um service de backend
Configure um pool de conexões para controlar o número de conexões entre o gateway e um service de backend. Essa configuração evita a sobrecarga do backend durante picos de tráfego.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Máximo total de conexões TCP entre o gateway e o service de backend. |
— |
Não |
|
|
Máximo de conexões TCP entre o gateway e um único Pod do service de backend. |
— |
Não |
|
|
Máximo de requisições HTTP por conexão entre o gateway e o service de backend. |
— |
Não |
Example: Para demo-service, defina um máximo de 10 conexões totais e 2 conexões por Pod.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Versões de TLS e suítes de criptografia
O intervalo padrão de versões de TLS para o MSE Ingress é de TLSv1.0 (mais antiga) a TLSv1.3 (mais recente). As suítes de criptografia padrão são:
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-SHA
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA
ECDHE-RSA-AES256-SHA
AES256-GCM-SHA384
AES256-SHA
Use as seguintes annotations para configurar as definições de TLS por nome de domínio.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Versão TLS mais antiga aceita. Valores válidos: |
|
Não |
|
|
Versão TLS mais recente aceita. |
|
Não |
|
|
Suítes de criptografia TLS, separadas por vírgula. Entra em vigor apenas para versões TLS 1.0–1.2. |
Ver lista padrão acima |
Não |
Example: Restrinja example.com apenas ao TLSv1.2.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80
Mutual TLS (mTLS) entre um gateway e um service de backend
Por padrão, o MSE Ingress usa HTTP para encaminhar requisições para contêineres de backend. Quando você define nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", o MSE Ingress usa TLS unidirecional: ele autentica o certificado do backend, que deve ser emitido por uma autoridade certificadora (CA) reconhecida.
Para Mutual TLS (mTLS), tanto o gateway quanto o service de backend autenticam os certificados um do outro.
|
Annotation |
Descrição |
Padrão |
Obrigatório |
|
|
Certificado de cliente usado pelo gateway para se autenticar no backend. Formato: |
— |
Sim (para mTLS) |
|
|
Server Name Indication (SNI) usado durante o handshake TLS. |
— |
Não |
|
|
Ativa ou desativa o SNI durante o handshake TLS. |
— |
Não |
Example: Configure mTLS entre o gateway e demo-service usando gateway-cert no namespace default.
Kubernetes v1.19+:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: Exact
Kubernetes anterior à v1.19:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
name: demo
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- path: /test
backend:
serviceName: demo-service
servicePort: 80