Riscrittura URL per il Gateway applicativo di Azure per contenitori - API in ingresso
Il Gateway applicativo per contenitori consente di riscrivere l'URL di una richiesta client, incluso il nome host e/o il percorso delle richieste. Quando il Gateway applicativo per contenitori avvia la richiesta alla destinazione back-end, la richiesta contiene l'URL appena riscritto per avviare la richiesta.
Usage details (Dettagli di utilizzo)
Le riscritture URL sfruttano la risorsa personalizzata IngressExtension del Gateway applicativo per contenitori.
Background
La riscrittura URL consente di convertire una richiesta in ingresso in un URL diverso quando viene avviata in una destinazione back-end.
La figura seguente illustra una richiesta destinata a contoso.com/shop da riscrivere in contoso.com/ecommerce quando la richiesta viene avviata alla destinazione back-end dal Gateway applicativo per contenitori:
Prerequisiti
- Se si segue la strategia di distribuzione personalizzata BYO (Bring Your Own), assicurarsi di configurare le risorse del Gateway applicativo per contenitori e il controller ALB.
- Se si segue la strategia di distribuzione gestita di ALB, assicurarsi di effettuare il provisioning del controller ALB e delle risorse del Gateway applicativo per contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.
- Distribuire un'applicazione HTTP di esempio:
Applicare il file deployment.yaml seguente nel cluster per creare un'applicazione Web di esempio per illustrare il percorso, la query e il routing basato sull'intestazione.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Questo comando crea gli elementi seguenti nel cluster:
- Uno spazio dei nomi denominato
test-infra
- Due servizi denominati
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
- Due distribuzioni denominate
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
Distribuire le risorse dell'API in ingresso necessarie
- Creare una risorsa In ingresso per intercettare tutto il traffico e instradarlo verso back-end-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
- Creare una risorsa In ingresso che corrisponda al prefisso /shop per instradare 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
Quando il Controller ALB crea le risorse Gateway applicativo per contenitori in ARM, userà la convenzione di denominazione seguente per una risorsa front-end: fe-<8 caratteri generati in modo casuale>
Se si vuole modificare il nome del front-end creato in Azure, valutare la possibilità di seguire la strategia di distribuzione personalizzata (Bring Your Own Deployment).
Quando tutte le risorse in ingresso sono state create, verificare che lo stato sia valido, che il listener sia programmato e che venga assegnato un indirizzo al gateway.
kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml
Output di esempio di una delle risorse in ingresso.
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
Quando viene creata la risorsa in ingresso, creare una risorsa IngressExtension per contoso.com
. Questo esempio garantisce che il traffico inviato a contoso.com/shop
venga avviato come contoso.com/ecommerce
alla destinazione back-end.
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
Quando viene creata la risorsa IngressExtension, verificare che la risorsa IngressExtension sia accettata e che il Gateway applicativo per le risorse contenitori sia programmata.
kubectl get IngressExtension url-rewrite -n test-infra -o yaml
Verificare che il Gateway applicativo per le risorse contenitori sia stato aggiornato correttamente per IngressExtension.
Testare l'accesso all'applicazione
A questo punto, è possibile inviare traffico all'applicazione di esempio tramite l’FQDN assegnato al front-end. Usare il comando seguente per ottenere il nome di dominio completo.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Se si specifica l'indicatore contoso.com/shop
del nome del server usando il comando curl, viene restituita una risposta dal servizio back-end-v1 con il percorso richiesto alla destinazione back-end che mostra contoso.com/ecommerce
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop
Tramite la risposta si dovrebbe vedere:
{
"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"
}
Se si specifica l'indicatore contoso.com
del nome del server usando il comando curl, viene restituita una risposta dal servizio back-end-v2, come illustrato.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Verrà visualizzata la risposta seguente:
{
"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"
}
Congratulazioni, è stato installato ALB Controller, è stata distribuita un'applicazione back-end ed è stato usato IngressExtension per riscrivere l'URL richiesto dal client, prima che il traffico sia impostato sulla destinazione nel Gateway applicativo per contenitori.