Compartilhar via


Reescrita de cabeçalho para o Gateway de Aplicativos do Azure para contêineres – API de Gateway

O Gateway de Aplicativos para contêineres permite que você reescreva cabeçalhos HTTP de solicitações de cliente e respostas de destinos de back-end.

Detalhes de uso

As reescritas de cabeçalho aproveitam os filtros, conforme definido pela API de Gateway do Kubernetes.

Tela de fundo

As reescritas de cabeçalho permitem modificar os cabeçalhos de solicitação e resposta bidirecionalmente nos destinos de back-end.

A seguinte figura ilustra uma solicitação com um agente de usuário específico reescrito pára um valor simplificado chamado SearchEngine-BingBot quando a solicitação é iniciada para o destino de back-end pelo Gateway de Aplicativos para contêineres:

Um diagrama mostrando o Gateway de Aplicativos para contêineres reescrevendo um cabeçalho de solicitação para o back-end.

Pré-requisitos

  1. Se estiver seguindo a estratégia de implantação BYO, verifique se você configurou os recursos do Gateway de Aplicativos para contêineres e o Controlador ALB

  2. Se estiver seguindo a estratégia de implantação gerenciada pelo ALB, verifique se você provisionou o Controlador ALB e provisionou os recursos do Gateway de Aplicativos para contêineres por meio do recurso personalizado ApplicationLoadBalancer.

  3. Implantar o aplicativo HTTP de exemplo e aplique o seguinte arquivo deployment.yaml no cluster para criar um aplicativo Web de exemplo a fim de demonstrar a reescrita de cabeçalho.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Este comando cria os seguintes itens no cluster:

    • Um namespace chamado test-infra
    • dois serviços chamados backend-v1 e backend-v2 no namespace test-infra
    • duas implantações chamadas backend-v1 e backend-v2 no namespace test-infra

Implantar os recursos necessários da API do Gateway

Crie um gateway:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

Observação

Quando o Controlador ALB cria os recursos do Gateway de Aplicativos para contêineres no ARM, ele usará a seguinte convenção de nomenclatura para um recurso de front-end: fe-<oito caracteres gerados aleatoriamente>

Se você quiser alterar o nome do front-end criado no Azure, siga a estratégia de trazer sua própria implantação.

Depois que o recurso de gateway for criado, verifique se o status é válido, se o ouvinte está Programado e se um endereço foi atribuído ao gateway.

kubectl get gateway gateway-01 -n test-infra -o yaml

Exemplo de saída da criação bem-sucedida do gateway.

status:
  addresses:
  - type: IPAddress
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Depois que o gateway for criado, crie um HTTPRoute que ouça o nome do host contoso.com e substitua o valor do agente de usuário para SearchEngine-BingBot.

Neste exemplo, procuramos o agente de usuário usado pelo mecanismo de pesquisa do Bing e simplificamos o cabeçalho para SearchEngine-BingBot a fim de facilitar a análise de back-end.

Este exemplo também demonstra a adição de um novo cabeçalho chamado AGC-Header-Add com o valor de AGC-value e remove um cabeçalho de solicitação chamado client-custom-header.

Dica

Para este exemplo, embora possamos usar o HTTPHeaderMatch de "Exact" para uma correspondência de cadeia de caracteres, uma demonstração é usada na expressão regular para ilustração de outras funcionalidades.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: header-rewrite-route
  namespace: test-infra
spec:
  parentRefs:
    - name: gateway-01
      namespace: test-infra
  hostnames:
    - "contoso.com"
  rules:
    - matches:
        - headers:
          - name: user-agent
            value: Mozilla/5\.0 AppleWebKit/537\.36 \(KHTML, like Gecko; compatible; bingbot/2\.0; \+http://www\.bing\.com/bingbot\.htm\) Chrome/
            type: RegularExpression
      filters:
        - type: RequestHeaderModifier
          requestHeaderModifier:
            set:
              - name: user-agent
                value: SearchEngine-BingBot
            add:
              - name: AGC-Header-Add
                value: AGC-value
            remove: ["client-custom-header"]
      backendRefs:
        - name: backend-v2
          port: 8080
    - backendRefs:
        - name: backend-v1
          port: 8080
EOF

Depois que o recurso HTTPRoute for criado, verifique se a rota é mostrada como Accepted e se o recurso do Gateway de Aplicativos para contêineres indica que foi Programmed.

kubectl get httproute header-rewrite-route -n test-infra -o yaml

Verifique se o status do recurso do Gateway de Aplicativos para contêineres foi atualizado com êxito.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Testar o acesso ao aplicativo

Agora estamos prontos para enviar um tráfego para o aplicativo de exemplo por meio do FQDN atribuído ao front-end. Use o seguinte comando para obter o FQDN:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Se você especificar o indicador de nome do servidor usando o comando do cURL, contoso.com para o FQDN de front-end, a saída retornará uma resposta do serviço de back-end-v1.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

Por meio da resposta, veremos que:

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

A especificação de um cabeçalho de agente de usuário com o valor `` retorna uma resposta do serviço de back-end igual a SearchEngine-BingBot:

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/"

Por meio da resposta, veremos que:

{
 "path": "/",
 "host": "fabrikam.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-5b8fd96959-f59mm"
}

A especificação de um cabeçalho client-custom-header com o valor moo deverá ser removida da solicitação quando o Gateway de Aplicativos para contêineres iniciar a conexão com o serviço de back-end:

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"

Por meio da resposta, veremos que:

{
 "path": "/",
 "host": "fabrikam.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "kd83nc84-4325-5d22-3d23-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-5b8fd96959-f59mm"
}

Parabéns! Você instalou o Controlador ALB, implantou um aplicativo de back-end e modificou valores de cabeçalho por meio da API de Gateway no Gateway de Aplicativos para contêineres.