Redirección de direcciones URL para la Puerta de enlace de aplicaciones para contenedores de Azure: API de puerta de enlace
Application Gateway for Containers permite devolver una respuesta de redirección al cliente en tres aspectos de una dirección URL: protocolo, nombre de host y ruta de acceso. Para cada redireccionamiento, se puede devolver un código de estado HTTP definido al cliente para definir la naturaleza del redireccionamiento.
Detalles de uso
Las redirecciones de direcciones URL aprovechan el filtro de reglas RequestRedirect tal como se define en la API de puerta de enlace de Kubernetes.
Redireccionamiento
Una redirección establece el código de estado de respuesta devuelto a los clientes para que comprendan el propósito de la redirección. Se admiten los siguientes tipos de redireccionamiento:
- 301 (movido permanentemente): indica que al recurso de destino se le asigna un nuevo URI permanente. Todas las referencias futuras a este recurso usarán uno de los identificadores URI delimitados. Use el código de estado 301 para el redireccionamiento de HTTP a HTTPS.
- 302 (encontrado) : Indica que el recurso de destino se encuentra temporalmente en otro URI. Puesto que el redireccionamiento se puede modificar, el cliente debe seguir usando el URI de solicitud efectivo para las solicitudes futuras.
Funcionalidades de redireccionamiento
El redireccionamiento de protocolo se usa normalmente para indicar al cliente que pase de un esquema de tráfico sin cifrar al tráfico, como la redirección HTTP a HTTPS.
El redireccionamiento de nombre de host coincide con el nombre de dominio completo (fqdn) de la solicitud. Esto suele observarse al redirigir un nombre de dominio antiguo a un nuevo nombre de dominio; por ejemplo
contoso.com
afabrikam.com
.El redireccionamiento de ruta de acceso tiene dos variantes diferentes:
prefix
yfull
.- El tipo de redireccionamiento
Prefix
redirigirá todas las solicitudes a partir de un valor definido. Por ejemplo: un prefijo de /shop coincidiría con /shop y cualquier texto después. Por ejemplo, /shop, /shop/checkout y /shop/item-a también redirigirían a /shop. - El tipo de redireccionamiento
Full
coincide con un valor exacto. Por ejemplo: /shop podría redirigir a /store, pero /shop/checkout no redirigiría a /store.
- El tipo de redireccionamiento
En la ilustración siguiente se muestra un ejemplo de una solicitud destinada a contoso.com/summer-promotion siendo redirigida a contoso.com/shop/category/5. Además, se devuelve una segunda solicitud iniciada para contoso.com a través del protocolo http para iniciar una nueva conexión a su variante https.
Requisitos previos
Si sigues la estrategia de implementación BYO, asegúrate de configurar los recursos de Puerta de enlace de aplicaciones para contenedores y el controlador de ALB.
Si sigues la estrategia de implementación administrada de ALB, asegúrate de aprovisionar tu controlador de ALB así como los recursos de Puerta de enlace de aplicaciones para contenedores mediante el recurso personalizado ApplicationLoadBalancer.
Despliega la aplicación HTTP de ejemplo:
Aplique el siguiente archivo deployment.yaml en el clúster para implementar un certificado TLS de ejemplo para demostrar las funcionalidades de redireccionamiento.
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
Este comando crea lo siguiente en el clúster:
- un espacio de nombres denominado
test-infra
- un servicio llamado
echo
en el espacio de nombrestest-infra
- una implementación llamada
echo
en el espacio de nombrestest-infra
- un secreto llamado
listener-tls-secret
en el espacio de nombrestest-infra
- un espacio de nombres denominado
Implementación de los recursos necesarios de la API de puerta de enlace
Creación de una puerta de enlace
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:
Cuando el controlador de ALB cree los recursos de Puerta de enlace de aplicaciones para contenedores en ARM, usará las siguientes convenciones de nomenclatura para un recurso de frontend: fe-<8 caracteres generados aleatoriamente>
Si desea cambiar el nombre del frontend creado en Azure, considere la posibilidad de seguir la estrategia Traiga su propia implementación.
Una vez creado el recurso de puerta de enlace, asegúrese de que el estado sea válido, de que el cliente de escucha se haya programado y de que se haya asignado una dirección a la puerta de enlace.
kubectl get gateway gateway-01 -n test-infra -o yaml
Salida de ejemplo de la creación correcta de la puerta de enlace.
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
Cree un recurso HTTPRoute para contoso.com
que controle el tráfico recibido a través 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
Cuandos se haya creado el recurso de HTTPRoute, asegúrese de que ambos recursos se muestren como Aceptado y que el recurso de la Puerta de enlace de aplicaciones para contenedores esté Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Compruebe que el recurso de la Puerta de enlace de aplicaciones para contenedores se haya actualizado correctamente para cada instancia de 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
Una vez creada la puerta de enlace, cree un recurso HTTPRoute para contoso.com
con un filtro RequestRedirect que redirija el tráfico HTTP a 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
Cuandos se haya creado el recurso de HTTPRoute, asegúrese de que ambos recursos se muestren como Aceptado y que el recurso de la Puerta de enlace de aplicaciones para contenedores esté Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Compruebe que el recurso de la Puerta de enlace de aplicaciones para contenedores se haya actualizado correctamente para cada instancia de 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
Cree un recurso HTTPRoute para contoso.com
que controle una redirección para la ruta de acceso /summer-promotion a una dirección URL específica. Al eliminar sectionName, que se muestra en los recursos http a https HTTPRoute, esta regla de redireccionamiento se aplica a las solicitudes HTTP y 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
Cuandos se haya creado el recurso de HTTPRoute, asegúrese de que ambos recursos se muestren como Aceptado y que el recurso de la Puerta de enlace de aplicaciones para contenedores esté Programado.
kubectl get httproute rewrite-example -n test-infra -o yaml
Compruebe que el recurso de la Puerta de enlace de aplicaciones para contenedores se haya actualizado correctamente para cada instancia de 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
Prueba de acceso a la aplicación
Ahora, estamos listos para enviar tráfico a nuestra aplicación de ejemplo mediante el FQDN asignado al frontend. Utilice el siguiente comando para obtener el FQDN.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Al especificar el indicador de nombre de servidor mediante el comando curl, http://contoso.com
debe devolver una respuesta de Puerta de enlace de aplicaciones para contenedores con un encabezado location
que define una redirección 301 a https://contoso.com
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
Mediante la respuesta deberíamos 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
Al especificar el indicador de nombre de servidor mediante el comando curl, Puerta de enlace de aplicaciones para contenedores https://contoso.com/summer-promotion
debe devolver una redirección 302 a https://contoso.com/shop/category/5
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v
Mediante la respuesta deberíamos 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
Enhorabuena, has instalado el controlador ALB, has implementado una aplicación backend y has usado la API de puerta de enlace para configurar una redirección HTTP a HTTPs y una redirección basada en rutas de acceso a solicitudes de cliente específicas.