Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Advanced APIG Ingress usage

Última atualização: Sep 12, 2026

O APIG Ingress gerencia o acesso externo aos services do cluster com balanceamento de carga na camada 7. Adicione annotations aos seus resources de Ingress para configurar roteamento avançado de tráfego, limitação de taxa e recursos de segurança.

Os exemplos neste tópico usam os prefixos de annotation nginx.ingress.kubernetes.io e higress.ingress.kubernetes.io. O prefixo aplicável a cada annotation está indicado no índice de annotations abaixo.

Índice de annotations

Clique em no nome de uma annotation para ir diretamente à sua descrição.

Annotation

Tipo

Escopo

Recurso

nginx.ingress.kubernetes.io/canary

string ("true")

Rota

Canary release

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

string

Rota

Canary release baseado em header

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

string

Rota

Canary release baseado em header

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

string

Rota

Canary release baseado em parâmetro de query

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

string

Rota

Canary release baseado em parâmetro de query

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

string

Rota

Canary release baseado em cookie

nginx.ingress.kubernetes.io/canary-weight

integer (0–100)

Rota

Canary release baseado em peso

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

integer

Rota

Canary release baseado em peso

higress.ingress.kubernetes.io/service-subset

string

Rota

Subconjunto de service

higress.ingress.kubernetes.io/subset-labels

string

Rota

Subconjunto de service com rótulos personalizados

nginx.ingress.kubernetes.io/enable-cors

boolean

Rota

CORS

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

string

Rota

CORS

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

string

Rota

CORS

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

string

Rota

CORS

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

string

Rota

CORS

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

boolean

Rota

CORS

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

integer (segundos)

Rota

CORS

nginx.ingress.kubernetes.io/use-regex

boolean

Rota

Correspondência por expressão regular

nginx.ingress.kubernetes.io/rewrite-target

string

Rota

Reescrita de caminho

nginx.ingress.kubernetes.io/upstream-vhost

string

Domínio

Reescrita de host

nginx.ingress.kubernetes.io/ssl-redirect

boolean

Rota

Redirecionamento de HTTP para HTTPS

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

boolean

Rota

Redirecionamento de HTTP para HTTPS

nginx.ingress.kubernetes.io/permanent-redirect

URL

Rota

Redirecionamento permanente

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

integer

Rota

Redirecionamento permanente

nginx.ingress.kubernetes.io/temporal-redirect

URL

Rota

Redirecionamento temporário

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

string

Rota

Controle de headers de requisição

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

string

Rota

Controle de headers de requisição

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

string

Rota

Controle de headers de requisição

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

string

Rota

Controle de headers de resposta

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

string

Rota

Controle de headers de resposta

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

string

Rota

Controle de headers de resposta

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

integer

Rota

Retry

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

integer (segundos)

Rota

Retry

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

string

Rota

Retry

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

CIDR/IP

Rota

Controle de acesso por IP

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

CIDR/IP

Rota

Controle de acesso por IP

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

CIDR/IP

Domínio

Controle de acesso por IP

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

CIDR/IP

Domínio

Controle de acesso por IP

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

integer

Rota

Limitação de taxa por gateway

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

integer

Rota

Limitação de taxa por gateway

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

integer

Rota

Limitação de taxa por gateway

higress.ingress.kubernetes.io/rate-limit

integer (RPS)

Rota

Controle global de limitação de taxa

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

integer

Rota

Controle global de limitação de taxa

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

string

Rota

Controle global de limitação de taxa

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

string

Rota

Controle global de limitação de taxa

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

URL

Rota

Controle global de limitação de taxa

higress.ingress.kubernetes.io/concurrency-limit

integer

Rota

Controle global de concorrência

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

integer

Rota

Controle global de concorrência

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

string

Rota

Controle global de concorrência

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

string

Rota

Controle global de concorrência

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

URL

Rota

Controle global de concorrência

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

string (namespace/name:port)

Rota

Espelhamento de tráfego

higress.ingress.kubernetes.io/mirror-percentage

integer (0–100)

Rota

Espelhamento de tráfego

nginx.ingress.kubernetes.io/backend-protocol

string (HTTPS, GRPC)

Rota

Protocolos de service de backend

nginx.ingress.kubernetes.io/load-balance

string

Rota

Algoritmos de balanceamento de carga

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

string

Rota

Hashing consistente

higress.ingress.kubernetes.io/warmup

integer (segundos)

Rota

Warmup (inicialização gradual)

nginx.ingress.kubernetes.io/affinity

string ("cookie")

Rota

Afinidade por cookie

nginx.ingress.kubernetes.io/affinity-mode

string ("balanced" ou "persistent")

Rota

Afinidade por cookie

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

string

Rota

Afinidade por cookie

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

string

Rota

Afinidade por cookie

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

integer (segundos)

Rota

Afinidade por cookie

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

integer (segundos)

Rota

Afinidade por cookie

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

integer

Rota

Pool de conexões

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

integer

Rota

Pool de conexões

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

integer

Rota

Pool de conexões

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

string

Domínio

Versões de TLS e suítes de criptografia

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

string

Domínio

Versões de TLS e suítes de criptografia

nginx.ingress.kubernetes.io/ssl-cipher

string

Domínio

Versões de TLS e suítes de criptografia

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

string (namespace/name)

Rota

mTLS com services de backend

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

string

Rota

mTLS com services de backend

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

boolean

Rota

mTLS com services de backend

Canary release

O canary release permite direcionar tráfego para uma nova versão do service sem remover a versão atual de produção. Ative o recurso com nginx.ingress.kubernetes.io/canary: "true" e adicione uma ou mais annotations de direcionamento para controlar a distribuição do tráfego.

Quando vários métodos de direcionamento são configurados no mesmo Ingress, as regras são avaliadas na seguinte ordem de prioridade:

Cookie > Header > Parâmetro de query > Peso

Canary release baseado em header

Annotation

Descrição

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

Roteia o tráfego com base no nome de um header de requisição. Defina o valor do header como always para rotear sempre para o canary. Qualquer outro valor roteia para produção, a menos que canary-by-header-value também corresponda.

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

Quando combinado com canary-by-header, roteia para o service canary apenas se o nome e o valor do header corresponderem.

Exemplo 1: Roteie requisições com o header apig: always para o service canary

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Exemplo 2: Roteie para múltiplas versões canary pelo valor do header (apig: v1 → v1, apig: v2 → v2)

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Canary release baseado em parâmetro de query

Annotation

Descrição

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

Roteia o tráfego com base no nome de um parâmetro de query da URL. Defina o valor do parâmetro como always para rotear para o service canary.

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

Quando combinado com canary-by-query, roteia para o service canary apenas se o nome e o valor do parâmetro de query corresponderem.

É possível combinar regras baseadas em header e em parâmetro de query. Quando ambas estão configuradas, a requisição é roteada para o service canary somente se as duas condições forem atendidas.

Exemplo 1: Roteie requisições com o parâmetro de query canary=gray na URL para o service canary

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Exemplo 2: Roteie para o canary apenas quando canary=gray estiver na URL e x-user-id: test estiver no header

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Canary release baseado em cookie

Use nginx.ingress.kubernetes.io/canary-by-cookie para dividir o tráfego com base em um cookie. Defina o valor do cookie como always para rotear requisições para o service canary; todas as demais requisições vão para o service de produção.

O canary release baseado em cookie não aceita valores personalizados. O valor do cookie deve ser always.

Exemplo: Roteie requisições com o cookie demo=always para o service canary

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Canary release baseado em peso

Annotation

Descrição

Padrão

nginx.ingress.kubernetes.io/canary-weight

Percentual de requisições roteadas para a versão canary. Integer de 0 a 100.

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

Peso total entre todas as versões.

100

Exemplo: Divida o tráfego entre três versões — canary v1 com 30%, canary v2 com 20% e produção com 50%

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Subconjunto de service

Os subconjuntos de service permitem rotear o tráfego para Pods específicos dentro de um Service. Esse recurso é útil quando um único Service é sustentado por vários Deployments executando diferentes versões de código.

Convenção de rótulos de Pod para APIG Ingress

Defina higress.ingress.kubernetes.io/service-subset para especificar qual grupo de Pods recebe as requisições. Por padrão, o APIG Ingress mapeia o valor do subconjunto para rótulos de Pod com o prefixo opensergo.io/canary:

  • Valor "" ou base: roteia para Pods com o rótulo opensergo.io/canary: "" ou para Pods que não possuem nenhum rótulo com o prefixo opensergo.io/canary.

  • Qualquer outra string (por exemplo, gray): roteia para Pods com o rótulo opensergo.io/canary-gray: gray.

Exemplo: Roteie requisições com x-user-id: test para o Deployment gray do go-httpbin

Primeiro, aplique o Service e os Deployments:

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

Em seguida, configure os resources de Ingress:

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Uso de rótulos personalizados

Para direcionar Pods por qualquer rótulo arbitrário — fora da convenção opensergo.io/canary — defina tanto higress.ingress.kubernetes.io/service-subset quanto higress.ingress.kubernetes.io/subset-labels.

Quando subset-labels está configurado, o subconjunto deixa de ser mapeado para rótulos com o prefixo opensergo.io/canary.

Exemplo: Roteie requisições com x-user-id: test para Pods com o rótulo version: gray

Primeiro, aplique os Deployments (o rótulo version: gray foi adicionado ao template de Pod do Deployment gray):

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

Em seguida, configure os resources de Ingress:

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

CORS

O compartilhamento de recursos de origem cruzada (CORS) controla quais domínios externos podem fazer requisições ao seu service.

Annotation

Descrição

Padrão

nginx.ingress.kubernetes.io/enable-cors

Ativa ou desativa o CORS.

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

Origens de terceiros permitidas. Separado por vírgulas; aceita o curinga *.

* (todas as origens)

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

Métodos HTTP permitidos. Separado por vírgulas; aceita o curinga *.

GET,PUT,POST,DELETE,PATCH,OPTIONS

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

Headers de requisição permitidos. Separado por vírgulas; aceita o curinga *.

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

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

Headers de resposta que o navegador pode acessar. Separado por vírgulas.

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

Indica se credenciais são permitidas nas requisições CORS.

true

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

Tempo de cache das respostas de preflight, em segundos.

1728000

Exemplo: Permita example.com, autorize apenas GET e POST, restrinja ao header X-Foo-Bar e não permita credenciais

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Correspondência por expressão regular

Os Ingresses padrão do Kubernetes aceitam apenas correspondência de caminho do tipo Exact e Prefix. O APIG Ingress também oferece suporte a correspondência por expressão regular. Ative esse recurso com nginx.ingress.kubernetes.io/use-regex: "true" e use um padrão regex como valor do caminho.

Exemplo: Encaminhe qualquer requisição que corresponda a /app/... ou /test/... para o service demo

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Reescrita de caminho e host

A reescrita modifica o caminho ou o host de uma requisição antes que o APIG Ingress a encaminhe para o service de backend.

Annotation

Descrição

nginx.ingress.kubernetes.io/rewrite-target

Caminho de destino após a reescrita. Aceita grupos de captura.

nginx.ingress.kubernetes.io/upstream-vhost

Valor do header Host enviado ao service de backend.

Reescrita de caminho

Todos os exemplos abaixo utilizam nginx.ingress.kubernetes.io/rewrite-target para modificar o caminho da requisição.

Exemplo 1: Reescreva example.com/test para example.com/dev antes do encaminhamento

Clusters com Kubernetes 1,19 e posterior

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

Clusters anteriores ao Kubernetes 1,19

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

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

Clusters com Kubernetes 1,19 e posterior

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

Clusters anteriores ao Kubernetes 1,19

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

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

Clusters com Kubernetes 1,19 e posterior

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

Clusters anteriores ao Kubernetes 1,19

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

Reescrita de host

Exemplo: Reescreva o host de example.com para test.com antes do encaminhamento

Clusters com Kubernetes 1,19 e posterior

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

Clusters anteriores ao Kubernetes 1,19

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

Redirecionamento

Redirecionamento de HTTP para HTTPS

Annotation

Descrição

nginx.ingress.kubernetes.io/ssl-redirect

Redireciona requisições HTTP para HTTPS.

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

Redireciona requisições HTTP para HTTPS.

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

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

Clusters com versão 1,19 e posterior

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

Clusters anteriores à versão 1,19

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

Redirecionamento permanente

Annotation

Descrição

Padrão

nginx.ingress.kubernetes.io/permanent-redirect

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

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

Código de status HTTP para o redirecionamento.

301

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

Clusters com versão 1,19 e posterior

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

Clusters anteriores à versão 1,19

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

Redirecionamento temporário

Use nginx.ingress.kubernetes.io/temporal-redirect para definir a URL de destino de um redirecionamento temporário. A URL deve incluir o esquema (http:// ou https://).

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

Clusters com versão 1,19 e posterior

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

Clusters anteriores à versão 1,19

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

Controle de headers

O controle de headers permite adicionar, atualizar ou remover headers HTTP enquanto o APIG Ingress encaminha requisições para os services de backend e devolve respostas aos clientes.

Controle de headers de requisição

As três annotations compartilham a mesma sintaxe para múltiplos headers: um único header usa um par chave-valor; vários headers usam o bloco escalar YAML | com um par chave-valor por linha.

Annotation

Descrição

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

Adiciona um header à requisição encaminhada. Se o header já existir, o valor é anexado.

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

Atualiza um header na requisição encaminhada. Se o header já existir, o valor é sobrescrito.

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

Remove um header da requisição encaminhada. Separe vários nomes de headers com vírgulas.

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

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Exemplo 2: Combine controle de headers com canary releases para marcar o tráfego por estágio de deployment

Quando apig: v1 está presente no header da requisição, o APIG Ingress roteia para o canary e adiciona stage: gray. Todas as outras requisições vão para a versão base e recebem stage: production.

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Controle de headers de resposta

Annotation

Descrição

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

Adiciona um header à resposta antes do encaminhamento ao cliente. Se o header já existir, o valor é anexado.

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

Atualiza um header na resposta antes do encaminhamento ao cliente. Se o header já existir, o valor é sobrescrito.

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

Remove um header da resposta antes do encaminhamento ao cliente. Separe vários nomes de headers com vírgulas.

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

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Retry

O APIG Ingress tenta novamente requisições com falha automaticamente no nível da rota. Configure o número máximo de tentativas, o timeout e as condições que acionam uma nova tentativa.

Annotation

Descrição

Padrão

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

Número máximo de tentativas.

3

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

Timeout para tentativas, em segundos.

Sem timeout

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

Lista de condições para nova tentativa, separada por vírgulas.

error,timeout

Condições válidas para nova tentativa:

Condição

Descrição

error

Falha no estabelecimento da conexão ou retorno de código de status 5xx.

timeout

Timeout no estabelecimento da conexão ou retorno de código de status 5xx.

invalid_header

Erro na requisição ou retorno de código de status 5xx.

http_xxx

Tenta novamente em um código de status HTTP específico (por exemplo, http_502, http_403).

non_idempotent

Habilita tentativas para requisições não idempotentes (POST, PATCH). Por padrão, essas requisições não sofrem nova tentativa.

off

Desativa totalmente as tentativas.

Exemplo: Tente até 2 vezes em 5 segundos, apenas em HTTP 502, e tente novamente também requisições não idempotentes

Clusters com Kubernetes 1,19 e posterior

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

Clusters com Kubernetes anterior a 1,19

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

Controle de acesso por IP

O APIG Ingress oferece suporte a listas de permissões e listas de bloqueios de endereços IP tanto no nível da rota quanto no nível do domínio. As regras no nível da rota têm precedência sobre as regras no nível do domínio.

Controle de acesso por IP no nível da rota

Annotation

Descrição

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

Lista de permissões para uma rota específica. Aceita endereços IP e blocos CIDR, separados por vírgulas.

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

Lista de bloqueios para uma rota específica. Aceita endereços IP e blocos CIDR, separados por vírgulas.

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

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Exemplo 2: Bloqueie acesso a example.com/test de 2.2.2.2

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Controle de acesso por IP no nível do domínio

Annotation

Descrição

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

Lista de permissões aplicada a todas as rotas sob um domínio. Listas de permissões no nível da rota têm precedência. Aceita endereços IP e blocos CIDR, separados por vírgulas.

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

Lista de bloqueios aplicada a todas as rotas sob um domínio. Listas de bloqueios no nível da rota têm precedência. Aceita endereços IP e blocos CIDR, separados por vírgulas.

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

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Exemplo 2: Combine listas de permissões no nível do domínio e da rota — restrinja /order a 3.3.X.X enquanto permite 1.1.X.X e 2.2.2.2 em todas as outras rotas

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Limitação de taxa por gateway

A limitação de taxa por gateway restringe a taxa de requisições de uma rota específica em cada instância do Cloud-native API Gateway. O limite se aplica por réplica do gateway, e não em todo o cluster.

Importante

Os limites de taxa se aplicam por réplica do gateway. Se você executar várias réplicas ou usar um Horizontal Pod Autoscaler (HPA), o limite efetivo em todo o cluster será o valor configurado multiplicado pelo número de réplicas. Para um limite global que não seja afetado pela contagem de réplicas, use o controle global de limitação de taxa.

Annotation

Descrição

Padrão

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

Máximo de requisições por minuto (RPM) por instância do gateway. Quando o limite é excedido, o corpo da resposta é local_rate_limited.

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

Máximo de requisições por segundo (RPS) por instância do gateway. Quando o limite é excedido, o corpo da resposta é local_rate_limited.

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

Multiplicador do limite de pico. O limite de pico equivale ao valor de RPM ou RPS multiplicado por este número.

5

O código de status da resposta quando a limitação é acionada depende da versão do seu gateway:

  • Versão do gateway anterior a 1.2.23: HTTP 503

  • Versão do gateway 1.2.23 ou posterior: HTTP 429

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

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

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

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Controle global de limitação de taxa

Este recurso requer a versão 1.2.25 ou posterior do gateway APIG Ingress.

O controle global de limitação de taxa integra-se ao Sentinel para impor um limite de RPS em todo o cluster para uma rota específica. Quando o limite é excedido, a resposta padrão é HTTP 429 com o corpo sentinel rate limited. É possível substituir esse comportamento por uma resposta personalizada ou um redirecionamento — mas não ambos simultaneamente.

Resposta personalizada

Annotation

Descrição

Padrão

higress.ingress.kubernetes.io/rate-limit

RPS máximo para a rota em todo o cluster de gateways.

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

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

429

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

Formato do corpo da resposta: text (text/plain; charset=UTF-8) ou json (application/json; charset=UTF-8).

text

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

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

sentinel rate limited

Exemplo 1: Limite example.com/test a 100 RPS com a resposta de limitação padrão

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Exemplo 2: Limite example.com/test a 100 RPS; retorne HTTP 503 com o corpo server is overload quando limitado

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Redirecionamento

Use higress.ingress.kubernetes.io/rate-limit-fallback-redirect-url para redirecionar clientes a uma URL alternativa quando a limitação for acionada.

Exemplo: Limite example.com/test a 100 RPS; redirecione para example.com/fallback quando limitado

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Controle global de concorrência

Este recurso requer a versão 1.2.25 ou posterior do gateway APIG Ingress.

O controle global de concorrência integra-se ao Sentinel para impor um limite de requisições simultâneas em todo o cluster para uma rota específica. Quando o limite é excedido, a resposta padrão é HTTP 429 com o corpo sentinel rate limited. É possível substituir esse comportamento por uma resposta personalizada ou um redirecionamento — mas não ambos simultaneamente.

Resposta personalizada

Annotation

Descrição

Padrão

higress.ingress.kubernetes.io/concurrency-limit

Máximo de requisições simultâneas para a rota em todo o cluster de gateways.

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

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

429

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

Formato do corpo da resposta: text (text/plain; charset=UTF-8) ou json (application/json; charset=UTF-8).

text

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

Exemplo 1: Limite requisições simultâneas para example.com/test a 1.000 com a resposta padrão

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Exemplo 2: Limite requisições simultâneas a 1.000; retorne HTTP 503 com o corpo server is overloaded quando o limite for atingido

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Redirecionamento

Use higress.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url para redirecionar clientes a uma URL alternativa quando o controle de concorrência for acionado.

Exemplo: Limite requisições simultâneas a 1.000; redirecione para example.com/fallback quando o limite for atingido

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Espelhamento de tráfego

O espelhamento de tráfego copia o tráfego de requisições em tempo real para um service sombra sem afetar o fluxo original da requisição. Utilize esse recurso para auditoria operacional, testes de tráfego ou validação de novas versões de services em modo sombra.

Annotation

Descrição

Padrão

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

Service de destino para o tráfego espelhado. Formato: namespace/name:port. Os campos namespace e port são opcionais — namespace assume como padrão o namespace do gateway de Ingress, e port assume como padrão a primeira porta do service.

higress.ingress.kubernetes.io/mirror-percentage

Percentual de tráfego a ser espelhado. Valores válidos: 0–100.

100

Importante

Quando o tráfego espelhado é encaminhado ao service de destino, o APIG Ingress acrescenta automaticamente -shadow ao header Host. Por exemplo, example.com torna-se example.com-shadow. Se o service de destino utilizar o header Host para roteamento ou logs, leve essa reescrita em consideração na configuração do seu service.

Exemplo 1: Espelhe todo o tráfego de example.com/test para test/app:8080

Clusters com versão 1,19 e posterior

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

Clusters com versões anteriores a 1,19

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

Exemplo 2: Espelhe 10% do tráfego de example.com/test para test/app:8080

Clusters com versão 1,19 e posterior

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

Clusters com versões anteriores a 1,19

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

Protocolos de service de backend

Por padrão, o APIG Ingress encaminha requisições aos services de backend via HTTP. Use a annotation nginx.ingress.kubernetes.io/backend-protocol para alternar para HTTPS ou gRPC.

Se o nome da porta em um resource de Kubernetes Service estiver definido como grpc ou http2, o APIG Ingress usará automaticamente gRPC ou HTTP/2 para esse backend — sem necessidade da annotation. Isso difere do NGINX Ingress, que exige a annotation em todos os casos.

Exemplo 1: Encaminhe requisições para um backend HTTPS

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com versões do Kubernetes anteriores a 1,19

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

Exemplo 2: Encaminhe requisições para um backend gRPC

Dois métodos: annotation (explícito) ou nome da porta do Service (convenção sobre configuração).

Método 1 — annotation:

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com versões do Kubernetes anteriores a 1,19

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

Método 2 — Nome da porta do Service (grpc):

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com versões do Kubernetes anteriores a 1,19

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

Algoritmos de balanceamento de carga para services de backend

Os algoritmos de balanceamento de carga determinam como o gateway seleciona os nós de backend ao encaminhar requisições.

Algoritmos comuns de balanceamento de carga

Use nginx.ingress.kubernetes.io/load-balance para definir o algoritmo.

Valor

Descrição

round_robin

Distribui requisições entre os nós de backend em rodízio. Este é o padrão.

least_conn

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

random

Seleciona um nó de backend aleatoriamente.

Importante

O APIG Ingress não oferece suporte ao algoritmo de média móvel ponderada exponencialmente (EWMA). Se o EWMA for configurado, o sistema reverte para round_robin.

Exemplo: Use least connections para o backend demo-service

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Algoritmos de balanceamento de carga baseados em hashing consistente

O hashing consistente garante que requisições com a mesma chave sejam sempre roteadas para o mesmo nó de backend. Esse recurso é útil para aplicações sensíveis a sessão ou localidade de cache. Defina a chave de hash usando nginx.ingress.kubernetes.io/upstream-hash-by.

Tipos de chave de hash suportados:

Chave de hash

Configuração

Descrição

URI da requisição

$request_uri

Inclui parâmetros de caminho.

Host

$host

O header host da requisição.

IP do cliente

$remote_addr

O endereço IP do cliente.

Header da requisição

$http_<header-name>

O valor de um header específico da requisição.

Parâmetro de query

$arg_<param-name>

O valor de um parâmetro de query específico da URL.

Exemplo 1: Roteie todas as requisições do mesmo IP de cliente para o mesmo nó de backend

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Exemplo 2: Roteie requisições com o mesmo valor de header X-Stage para o mesmo nó de backend

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Exemplo 3: Roteie requisições com o mesmo valor de parâmetro de query X-Stage para o mesmo nó de backend

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Warmup (inicialização gradual)

O warmup aumenta gradualmente o tráfego para um nó de backend recém-iniciado durante uma janela de tempo especificada. Isso dá ao nó tempo para inicializar caches e compilar código JIT antes de lidar com o pico de tráfego.

Use higress.ingress.kubernetes.io/warmup para definir a janela de warmup em segundos. O warmup vem desativado por padrão.

O warmup só é compatível com os algoritmos de balanceamento de carga round_robin e least_conn.

Exemplo: Faça o warmup do demo-service durante uma janela de 30 segundos

Clusters com Kubernetes 1,19 e posterior

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

Clusters com Kubernetes anterior a 1,19

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

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

A afinidade por cookie roteia todas as requisições do mesmo cliente para o mesmo nó de backend. O APIG Ingress gera um cookie de afinidade na primeira requisição; as requisições subsequentes carregam o cookie e são roteadas para o mesmo nó.

Annotation

Descrição

Padrão

nginx.ingress.kubernetes.io/affinity

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

nginx.ingress.kubernetes.io/affinity-mode

Modo de afinidade: balanced distribui novas sessões uniformemente entre os backends; persistent sempre roteia para o mesmo backend durante toda a vida útil do cookie.

balanced

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

Nome do cookie usado como chave de hash.

INGRESSCOOKIE

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

Caminho do cookie gerado. Deve corresponder ao caminho do Ingress.

/

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

Tempo de expiração do cookie gerado, em segundos. Tem precedência sobre session-cookie-expires.

Nível de sessão

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

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

Nível de sessão

Exemplo 1: Ative a afinidade por cookie com configurações padrão (nome do cookie INGRESSCOOKIE, caminho /, vida útil no nível da sessão)

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Exemplo 2: Ative a afinidade por cookie com nome de cookie personalizado test, caminho / e expiração de 10 segundos

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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

Pool de conexões

Os pools de conexões limitam quantas conexões uma instância do gateway abre para um service de backend, evitando sobrecarga sob alto tráfego.

Annotation

Descrição

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

Total máximo de conexões TCP entre a instância do gateway e o service de backend.

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

Máximo de conexões TCP entre a instância do gateway e um único Pod de backend.

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

Máximo de requisições HTTP por conexão TCP entre a instância do gateway e o service de backend.

Exemplo: Limite o gateway a 10 conexões totais e 2 conexões por Pod para o demo-service

Clusters com versão 1,19 e posterior

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

Clusters anteriores à versão 1,19

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

Versões de TLS e suítes de criptografia

Por padrão, o APIG Ingress aceita conexões TLS do TLS 1.0 ao TLS 1.3, usando as seguintes suítes de criptografia:

  • 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 annotations a seguir para restringir o intervalo de versões de TLS ou as suítes de criptografia para um domínio específico:

Annotation

Descrição

Padrão

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

Versão mínima do TLS. Valores válidos: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3.

TLSv1.0

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

Versão máxima do TLS. Valores válidos: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3.

TLSv1.3

nginx.ingress.kubernetes.io/ssl-cipher

Suítes de criptografia permitidas, separadas por vírgulas. Aplica-se apenas a handshakes TLS 1.0–1.2.

Exemplo: Restrinja example.com apenas ao TLS 1.2

Clusters com versão 1,19 e posterior

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

Clusters com versão anterior a 1,19

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

Autenticação mTLS com services de backend

O TLS unidirecional (via nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", descrito em Protocolos de service de backend) verifica apenas o certificado do backend. Para verificação mútua, configure o mTLS — o backend também verifica um certificado de cliente apresentado pelo gateway.

Use estas annotations para configurar o certificado de cliente que o gateway apresenta:

Annotation

Descrição

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

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

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

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

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

Ativa ou desativa o SNI durante o handshake TLS.

Exemplo: Configure mTLS entre o gateway e o demo-service usando o certificado default/gateway-cert

Clusters com Kubernetes 1,19 ou posterior

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

Clusters com Kubernetes anterior a 1,19

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