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:
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.
- 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
ybackend-v2
en el espacio de nombrestest-infra
- Dos implementaciones llamadas
backend-v1
ybackend-v2
en el espacio de nombrestest-infra
Implementación de los recursos necesarios de la API de entrada
- 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
- 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.