URL-omskrivning för Azure Application Gateway för containrar – API för inkommande
Med Application Gateway för containrar kan du skriva om URL:en för en klientbegäran, inklusive begärandenas värdnamn och/eller sökväg. När Application Gateway for Containers initierar begäran till serverdelsmålet innehåller begäran den nyligen omskrivna URL:en för att initiera begäran.
Användningsinformation
URL-omskrivningar drar nytta av Application Gateway för containrars anpassade resurs IngressExtension.
Bakgrund
Med url-omskrivning kan du översätta en inkommande begäran till en annan URL när den initieras till ett serverdelsmål.
Följande bild illustrerar en begäran som är avsedd för contoso.com/shop som skrivs om till contoso.com/ecommerce när begäran initieras till serverdelsmålet av Application Gateway för containrar:
Förutsättningar
- Om du följer BYO-distributionsstrategin kontrollerar du att du konfigurerar application gateway för containrar och ALB-styrenhet.
- Om du följer ALB-strategin för hanterad distribution ser du till att du etablerar ALB-styrenheten och etablerar Application Gateway för containrar-resurser via den anpassade resursen ApplicationLoadBalancer.
- Distribuera HTTP-exempelprogram:
Använd följande deployment.yaml-fil i klustret för att skapa ett exempelwebbprogram för att demonstrera sökväg, fråga och rubrikbaserad routning.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Det här kommandot skapar följande i klustret:
- Ett namnområde med namnet
test-infra
- Två tjänster anropas
backend-v1
ochbackend-v2
itest-infra
namnområdet - Två distributioner anropas
backend-v1
ochbackend-v2
itest-infra
namnområdet
Distribuera nödvändiga INGRESS API-resurser
- Skapa en ingress som fångar upp all trafik och alla vägar till 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
- Skapa en ingress som matchar prefixet /shop som dirigerar till 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
Kommentar
När ALB-styrenheten skapar Application Gateway for Containers-resurser i ARM använder den följande namngivningskonvention för en klientdelsresurs: fe-8< slumpmässigt genererade tecken>
Om du vill ändra namnet på klientdelen som skapats i Azure kan du överväga att följa din egen distributionsstrategi.
När varje ingressresurs skapas kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.
kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml
Exempel på utdata från en av ingressresurserna.
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
När ingressen har skapats skapar du en IngressExtension-resurs för contoso.com
. Det här exemplet säkerställer att trafik som skickas till contoso.com/shop
initieras till contoso.com/ecommerce
serverdelsmålet.
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
När Resursen IngressExtension har skapats kontrollerar du att IngressExtension-resursen visar Godkänd och att Application Gateway for Containers-resursen är programmerad.
kubectl get IngressExtension url-rewrite -n test-infra -o yaml
Kontrollera att Application Gateway for Containers-resursen har uppdaterats för IngressExtension.
Testa åtkomsten till programmet
Nu är vi redo att skicka trafik till vårt exempelprogram via det FQDN som tilldelats klientdelen. Använd följande kommando för att hämta FQDN.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Om du anger indikatorn contoso.com/shop
för servernamn med hjälp av curl-kommandot returneras ett svar från backend-v1-tjänsten med den begärda sökvägen till serverdelsmålet som visar contoso.com/ecommerce
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop
Via svaret bör vi se:
{
"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"
}
Om du anger indikatorn contoso.com
för servernamn med hjälp av curl-kommandot returneras ett svar från backend-v2-tjänsten som visas.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Följande svar bör visas:
{
"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"
}
Grattis, du har installerat ALB-styrenheten, distribuerat ett serverdelsprogram och använt IngressExtension för att skriva om den begärda URL:en innan trafik ställs in på målet på Application Gateway för containrar.