Comparteix a través de


Reescritura de direcciones URL para la Puerta de enlace de aplicaciones para contenedores de Azure: API de entrada

La Puerta de enlace de aplicaciones para contenedores permite volver a escribir la dirección URL de una solicitud de cliente, incluido el nombre de host o la ruta de acceso de las solicitudes. Cuando la Puerta de enlace de aplicaciones para contenedores inicia la solicitud al destino de backend, la solicitud contiene la dirección URL recién reescrita para iniciar la solicitud.

Detalles de uso

Las reescrituras de direcciones URL aprovechan el recurso personalizado IngressExtension de la Puerta de enlace de aplicaciones para contenedores.

Fondo

La reescritura de direcciones URL permite traducir una solicitud entrante a una dirección URL diferente cuando se inicia en un destino de backend.

En la ilustración siguiente se muestra una solicitud destinada a contoso.com/shop volver a escribir en contoso.com/ecommerce cuando la solicitud se inicia en el destino de backend mediante la Puerta de enlace de aplicaciones para contenedores:

Diagrama que muestra cómo Puerta de enlace de aplicaciones para contenedores reescribe una dirección URL al back-end.

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. Despliegue la aplicación HTTP de ejemplo:
    Aplique el siguiente archivo deployment.yaml en el clúster para crear una aplicación web de ejemplo para mostrar la ruta de acceso, la consulta y el enrutamiento basado en encabezados.
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 crea lo siguiente en el clúster:

  • Un espacio de nombres denominado test-infra
  • Dos servicios llamados backend-v1 y backend-v2 en el espacio de nombres test-infra
  • Dos implementaciones llamadas backend-v1 y backend-v2 en el espacio de nombres test-infra

Implementación de los recursos necesarios de la API de entrada

  1. Cree una entrada que capture todo el tráfico y las rutas a backend-v2
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF
  1. Cree una entrada que coincida con el prefijo /shop que se enruta a backend-v1
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-02
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-ingress-extension: url-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /shop
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
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.

Cuando se crea cada recurso de entrada, asegúrese de que el estado sea válido, que el oyente esté Programado y que se asigne una dirección a la puerta de enlace.

kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml

Salida de ejemplo de uno de los recursos de entrada.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
  - host: contoso.com
    http:
      paths:
      - backend:
          service:
            name: backend-v2
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

Cuando se crea la entrada, cree un recurso IngressExtension para contoso.com. En este ejemplo se garantiza que el tráfico enviado a contoso.com/shop se inicie como contoso.com/ecommerce al destino de backend.

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: url-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
      - type: URLRewrite
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /ecommerce
EOF

Cuando se crea el recurso IngressExtension, asegúrese de que el recurso IngressExtension muestra Aceptado y el recurso de la Puerta de enlace de aplicaciones para contenedores está Programado.

kubectl get IngressExtension url-rewrite -n test-infra -o yaml

Compruebe que el recurso de la Puerta de enlace de aplicaciones para contenedores se ha actualizado correctamente para IngressExtension.

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 ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Si especifica el indicador de nombre de servidor contoso.com/shop mediante el comando curl, se devuelve una respuesta del servicio backend-v1 con la ruta de acceso solicitada al destino de backend que muestra contoso.com/ecommerce.

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

Mediante la respuesta deberíamos ver:

{
 "path": "/ecommerce",
 "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"
}

Si especifica el indicador de nombre de servidor contoso.com mediante el comando curl, se devuelve una respuesta del servicio backend-v2 tal como se muestra.

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

Se debe mostrar la siguiente respuesta:

{
 "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": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

Enhorabuena, instaló el controlador ALB, implementó una aplicación backend y utilizó IngressExtension para reescribir la URL solicitada por el cliente, antes de establecer el tráfico en el destino en la Puerta de enlace de aplicaciones para contenedores.