Compartir a través de


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 a fabrikam.com.

  • El redireccionamiento de ruta de acceso tiene dos variantes diferentes: prefix y full.

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

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.

A diagram showing the Application Gateway for Containers returning a redirect URL to a client.

Requisitos previos

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

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

  3. 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 kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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 nombres test-infra
    • una implementación llamada echo en el espacio de nombres test-infra
    • un secreto llamado listener-tls-secret en el espacio de nombres test-infra

Implementación de los recursos necesarios de la API de puerta de enlace

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