Compartilhar via


Redirecionamento de URL para o Gateway de Aplicativos para contêineres do Azure – API de Gateway

O Gateway de Aplicativos para contêineres permite que você retorne uma resposta de redirecionamento para o cliente com base em três aspectos de um URL: protocolo, nome do host e caminho. Para cada redirecionamento, um código de status HTTP definido pode ser retornado ao cliente para definir a natureza do redirecionamento.

Detalhes de uso

Os redirecionamentos de URL aproveitam o filtro de regra RequestRedirect, conforme definido pela API de Gateway do Kubernetes.

Redirecionamento

Um redirecionamento define o código de status de resposta retornado aos clientes para entender a finalidade do redirecionamento. Há suporte para os seguintes tipos de redirecionamento:

  • 301 (Movido permanentemente): indica que o recurso de destino recebe um novo URI permanente. Referências futuras a esse recurso usarão um dos URIs incluídos. Use o código de status 301 para o redirecionamento de HTTP para HTTPS.
  • 302 (Encontrado) : indica que o recurso de destino está temporariamente sob um URI diferente. Como o redirecionamento pode mudar ocasionalmente, o cliente deve continuar a usar o URI de solicitação efetivo para solicitações futuras.

Funcionalidades do redirecionamento

  • O redirecionamento de protocolo geralmente é usado para instruir o cliente a mover de um esquema de tráfego não criptografado para o tráfego, como redirecionamento HTTP para HTTPS.

  • O redirecionamento de nome do host corresponde ao nome de domínio totalmente qualificado (fqdn) da solicitação. Isso geralmente é observado ao redirecionar um nome de domínio antigo para um novo nome de domínio; como contoso.com para fabrikam.com.

  • O redirecionamento de caminho tem duas variantes diferentes: prefix e full.

    • O tipo de redirecionamento Prefix redirecionará todas as solicitações começando com um valor definido. Por exemplo: um prefixo de /shop corresponderia a /shop e a qualquer texto posterior. Por exemplo, /shop, /shop/checkout e /shop/item-a também redirecionaria para /shop.
    • O tipo de redirecionamento Full corresponde a um valor exato. Por exemplo, /shop poderia redirecionar para /store, mas /shop/checkout não redirecionaria para /store.

A figura a seguir ilustra um exemplo de uma solicitação destinada a contoso.com/summer-promotion sendo redirecionada para contoso.com/shop/category/5. Além disso, uma segunda solicitação iniciada para contoso.com via protocolo http retorna um redirecionamento para iniciar uma nova conexão com sua variante https.

Um diagrama mostrando o Gateway de Aplicativos para contêineres retornando uma URL de redirecionamento para um cliente.

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 do ALB, verifique se você provisionou o Controlador ALB e os recursos do Gateway de Aplicativos para contêineres por meio do recurso personalizado ApplicationLoadBalancer.

  3. Implantar um aplicativo HTTP de exemplo:

    Aplique o arquivo deployment.yaml a seguir em seu cluster para implantar um certificado TLS de exemplo para demonstrar os recursos de redirecionamento.

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

    Esse comando cria o seguinte no cluster:

    • um namespace chamado test-infra
    • um serviço chamado echo no namespace test-infra
    • uma implantação chamada echo no namespace test-infra
    • um segredo chamado listener-tls-secret no test-infra namespace

Implantar os recursos necessários da API do Gateway

  1. Criar 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
      - name: https-listener
        port: 443
        protocol: HTTPS
        allowedRoutes:
          namespaces:
            from: Same
        tls:
          mode: Terminate
          certificateRefs:
          - kind : Secret
            group: ""
            name: listener-tls-secret
    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: Hostname
    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

Crie um recurso HTTPRoute para contoso.com que trate o tráfego recebido por meio de https.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-contoso
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: echo
      port: 80
EOF

Depois que o recurso HTTPRoute for criado, verifique se a rota é apresentada como Aceita e se o recurso do Gateway de Aplicativos para contêineres está Programado.

kubectl get httproute rewrite-example -n test-infra -o yaml

Verifique se o recurso Gateway de Aplicativo para contêineres foi atualizado com êxito para cada HTTPRoute.

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

Depois que o gateway for criado, crie um recurso HTTPRoute para contoso.com com um filtro RequestRedirect que redireciona o tráfego http para https.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-to-https-contoso-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: http-listener
  hostnames:
  - "contoso.com"
  rules:
    - matches:
      filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https
            statusCode: 301
EOF

Depois que o recurso HTTPRoute for criado, verifique se a rota é apresentada como Aceita e se o recurso do Gateway de Aplicativos para contêineres está Programado.

kubectl get httproute rewrite-example -n test-infra -o yaml

Verifique se o recurso Gateway de Aplicativo para contêineres foi atualizado com êxito para cada HTTPRoute.

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

Crie um recurso HTTPRoute para contoso.com que lida com um redirecionamento para o caminho /summer-promotion para uma URL específica. Ao eliminar o sectionName, demonstrado nos recursos http para https HTTPRoute, essa regra de redirecionamento se aplica a solicitações HTTP e HTTPS.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: summer-promotion-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /summer-promotion
    filters:
      - type: RequestRedirect
        requestRedirect:
          path:
            type: ReplaceFullPath
            replaceFullPath: /shop/category/5
          statusCode: 302
  - backendRefs:
    - name: echo
      port: 80
EOF

Depois que o recurso HTTPRoute for criado, verifique se a rota é apresentada como Aceita e se o recurso do Gateway de Aplicativos para contêineres está Programado.

kubectl get httproute rewrite-example -n test-infra -o yaml

Verifique se o recurso Gateway de Aplicativo para contêineres foi atualizado com êxito para cada HTTPRoute.

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 algum tráfego para nosso aplicativo de exemplo, por meio do FQDN atribuído ao front-end. Use o comando a seguir para obter o FQDN.

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

Ao especificar o indicador do nome do servidor usando o comando curl, http://contoso.com deve retornar uma resposta do Gateway de Aplicativos para contêineres com um cabeçalho location definindo um redirecionamento 301 para https://contoso.com.

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

Pela resposta, veremos que:

* Added contoso.com:80:xxx.xxx.xxx.xxx to DNS cache
* Hostname contoso.com was found in DNS cache
*   Trying xxx.xxx.xxx.xxx:80...
* Connected to contoso.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: contoso.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< location: https://contoso.com/
< date: Mon, 26 Feb 2024 22:56:23 GMT
< server: Microsoft-Azure-Application-LB/AGC
< content-length: 0
<
* Connection #0 to host contoso.com left intact

Ao especificar o indicador do nome do servidor usando o comando curl, o Gateway de Aplicativos para contêineres https://contoso.com/summer-promotion deverá retornar um redirecionamento 302 para https://contoso.com/shop/category/5.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v

Pela resposta, veremos que:

> GET /summer-promotion HTTP/2
> Host: contoso.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 302
< location: https://contoso.com/shop/category/5
< date: Mon, 26 Feb 2024 22:58:43 GMT
< server: Microsoft-Azure-Application-LB/AGC
<
* Connection #0 to host contoso.com left intact

Parabéns, você instalou o Controlador ALB, implantou um aplicativo de back-end e usou a API de Gateway para configurar um redirecionamento HTTP para HTTPS e um redirecionamento baseado em caminho para solicitações de cliente específicas.