URL herschrijven voor Azure-toepassing Gateway for Containers - Api voor inkomend verkeer
Met Application Gateway for Containers kunt u de URL van een clientaanvraag herschrijven, inclusief de hostnaam en/of het pad van de aanvragen. Wanneer Application Gateway for Containers de aanvraag initieert naar het back-enddoel, bevat de aanvraag de zojuist herschreven URL om de aanvraag te initiëren.
Gebruiksgegevens
URL-herschrijven maken gebruik van de aangepaste resource inGressExtension van Application Gateway voor containers.
Achtergrond
Met URL-herschrijven kunt u een binnenkomende aanvraag vertalen naar een andere URL wanneer deze wordt gestart naar een back-enddoel.
In de volgende afbeelding ziet u een aanvraag die is bestemd voor contoso.com/shop worden herschreven naar contoso.com/ecommerce wanneer de aanvraag wordt gestart naar het back-enddoel door Application Gateway for Containers:
Vereisten
- Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller instelt.
- Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat u uw ALB-controller inricht en de Application Gateway for Containers-resources inricht via de aangepaste applicationLoadBalancer-resource.
- Voorbeeld-HTTP-toepassing implementeren:
Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeldwebtoepassing te maken om pad-, query- en headergebaseerde routering te demonstreren.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Met deze opdracht maakt u het volgende op uw cluster:
- Een naamruimte met de naam
test-infra
- Twee services die worden aangeroepen
backend-v1
enbackend-v2
in detest-infra
naamruimte - Twee implementaties die worden aangeroepen
backend-v1
enbackend-v2
in detest-infra
naamruimte
De vereiste api-resources voor inkomend verkeer implementeren
- Een inkomend verkeer maken dat al het verkeer en routes naar back-end-v2 onderschept
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
- Een inkomend verkeer maken dat overeenkomt met het voorvoegsel /shop dat wordt gerouteerd naar back-end-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
Notitie
Wanneer de ALB-controller de Application Gateway for Containers-resources in ARM maakt, wordt de volgende naamconventie gebruikt voor een front-endresource: fe-8< willekeurig gegenereerde tekens>
Als u de naam van de front-end die in Azure is gemaakt, wilt wijzigen, kunt u overwegen om uw eigen implementatiestrategie te volgen.
Wanneer elke toegangsbeheerobjectresource wordt gemaakt, controleert u of de status geldig is, wordt de listener geprogrammeerd en wordt er een adres toegewezen aan de gateway.
kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml
Voorbeelduitvoer van een van de toegangsbeheerobjectbronnen.
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
Wanneer het inkomend verkeer wordt gemaakt, maakt u een IngressExtension-resource voor contoso.com
. Dit voorbeeld zorgt ervoor dat verkeer dat naar contoso.com/shop
wordt verzonden, wordt gestart als contoso.com/ecommerce
het back-enddoel.
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
Wanneer de IngressExtension-resource is gemaakt, controleert u of de ingressExtension-resource Geaccepteerd wordt weergegeven en of de Application Gateway for Containers-resource is geprogrammeerd.
kubectl get IngressExtension url-rewrite -n test-infra -o yaml
Controleer of de Application Gateway for Containers-resource is bijgewerkt voor de IngressExtension.
Toegang tot de toepassing testen
Nu zijn we klaar om verkeer naar onze voorbeeldtoepassing te verzenden, via de FQDN die is toegewezen aan de front-end. Gebruik de volgende opdracht om de FQDN op te halen.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Als u de servernaamindicator contoso.com/shop
opgeeft met behulp van de curl-opdracht, wordt een antwoord van de back-end-v1-service geretourneerd met het aangevraagde pad naar het back-enddoel.contoso.com/ecommerce
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop
Via het antwoord moeten we het volgende zien:
{
"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"
}
Als u de servernaamindicator contoso.com
opgeeft met behulp van de curl-opdracht, wordt er een antwoord geretourneerd van de back-end-v2-service, zoals wordt weergegeven.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Het volgende antwoord moet worden weergegeven:
{
"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"
}
Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en de IngressExtension gebruikt om de aangevraagde URL van de client opnieuw te schrijven voordat verkeer wordt ingesteld op het doel op Application Gateway for Containers.