Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Application Gateway for Containers permite que você retorne uma resposta de redirecionamento para o cliente com base em três aspetos de uma 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 utilização
Os redirecionamentos de URL aproveitam o filtro de regra RequestRedirect, conforme definido pela API do Gateway do Kubernetes.
Redirecionamento
Um redirecionamento define o código de status de resposta retornado aos clientes para entender a finalidade do redirecionamento. Os seguintes tipos de redirecionamento são suportados:
- 301 (Movido permanentemente): Indica que o recurso de destino recebe um novo URI permanente. Referências futuras a este recurso utilizem um dos URIs fornecidos. Use o código de status 301 para redirecionamento 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.
Recursos de redirecionamento
O redirecionamento de protocolo é comumente usado para dizer ao cliente para passar de um esquema de tráfego não criptografado para o tráfego, como o redirecionamento HTTP para HTTPS.
O redirecionamento de nome de host corresponde ao FQDN (nome de domínio totalmente qualificado) da solicitação. Isso é comumente observado ao redirecionar um nome de domínio antigo para um novo nome de domínio; tais como
contoso.comafabrikam.com.O redirecionamento de caminho tem duas variantes diferentes:
prefixefull.-
PrefixO tipo de redirecionamento 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 redirecionariam para /shop também. -
FullO tipo de redirecionamento 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 é retornada um redirecionamento para iniciar uma nova conexão com sua variante https.
Pré-requisitos
Se estiver seguindo a estratégia de implantação do BYO, certifique-se de configurar os recursos do Application Gateway for Containers e do ALB Controller.
Se estiver seguindo a estratégia de implantação gerenciada ALB, certifique-se de provisionar seu controlador ALB e provisionar os recursos do Application Gateway for Containers por meio do recurso personalizado ApplicationLoadBalancer.
Implantar aplicativo HTTP de exemplo:
Aplique o seguinte arquivo deployment.yaml em seu cluster para implantar um certificado TLS de exemplo para demonstrar 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.yamlEste comando cria o seguinte no cluster:
- um namespace chamado
test-infra - um serviço chamado
echonotest-infranamespace - uma implementação chamada
echono espaço de nomestest-infra - Um segredo chamado
listener-tls-secretnotest-infranamespace
- um namespace chamado
Implantar os recursos necessários da API do Gateway
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
Nota
Quando o Controlador ALB cria os recursos do Gateway de Aplicativo para Contêineres no Gerenciador de Recursos do Azure, ele usa a seguinte convenção de nomenclatura para um recurso frontend: fe-<eight randomly generated characters>.
Se pretender alterar o nome do recurso de front-end criado no Azure, considere seguir a estratégia de implantação "traga o seu próprio".
Depois que o recurso de gateway for criado, verifique se o status é válido, se o ouvinte está programado e se um endereço é 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 lidar com o tráfego recebido via 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
Quando o recurso HTTPRoute for criado, verifique se o recurso HTTPRoute mostra Accepted e se o recurso Application Gateway for Containers está Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verifique se o recurso Application Gateway for Containers 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
Quando o recurso HTTPRoute for criado, verifique se o recurso HTTPRoute mostra Accepted e se o recurso Application Gateway for Containers está Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verifique se o recurso Application Gateway for Containers 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 lide com um redirecionamento para o caminho /summer-promotion para uma URL específica. Ao eliminar sectionName, demonstrado nos recursos http to 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
Quando o recurso HTTPRoute for criado, verifique se o recurso HTTPRoute mostra Accepted e se o recurso Application Gateway for Containers está Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verifique se o recurso Application Gateway for Containers 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 à aplicação
Agora estamos prontos para enviar algum tráfego para o nosso aplicativo de exemplo, através do FQDN atribuído ao frontend. Use o comando a seguir para obter o FQDN.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Quando você especifica o indicador de nome do servidor usando o comando curl, http://contoso.com deve retornar uma resposta do Application Gateway for Containers com um location cabeçalho definindo um redirecionamento 301 para https://contoso.com.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
Através da resposta devemos ver:
* 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
Quando você especifica o indicador de nome do servidor usando o comando curl, https://contoso.com/summer-promotion o Application Gateway for Containers deve 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
Através da resposta devemos ver:
> 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 ALB Controller, implantou um aplicativo de back-end e usou a API do Gateway para configurar um redirecionamento HTTP para HTTPS e um redirecionamento baseado em caminho para solicitações específicas do cliente.