Přepsání adresy URL pro bránu Aplikace Azure lication pro kontejnery – rozhraní API pro příchozí přenos dat
Application Gateway for Containers umožňuje přepsat adresu URL požadavku klienta, včetně názvu hostitele požadavků nebo cesty. Když služba Application Gateway for Containers zahájí požadavek na back-endový cíl, požadavek obsahuje nově přepsanou adresu URL, která požadavek zahájí.
Podrobnosti využití
Přepsání adres URL využívá vlastní prostředek IngressExtension služby Application Gateway pro kontejnery.
Pozadí
Přepsání adresy URL umožňuje přeložit příchozí požadavek na jinou adresu URL při zahájení do back-endového cíle.
Následující obrázek znázorňuje požadavek určený pro contoso.com/shop přepsání na contoso.com/ecommerce při zahájení požadavku do back-endového cíle službou Application Gateway for Containers:
Požadavky
- Pokud sledujete strategii nasazení BYO, ujistěte se, že jste nastavili prostředky služby Application Gateway pro kontejnery a řadič ALB.
- Pokud sledujete strategii nasazení spravovaného albem, ujistěte se, že zřídíte kontroler ALB a zřídíte prostředky Application Gateway pro kontejnery prostřednictvím vlastního prostředku ApplicationLoadBalancer.
- Nasazení ukázkové aplikace HTTP:
Pomocí následujícího souboru deployment.yaml v clusteru vytvořte ukázkovou webovou aplikaci pro předvedení cesty, dotazu a směrování na základě hlaviček.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Tento příkaz vytvoří v clusteru následující:
- Obor názvů s názvem
test-infra
- Dvě volané
backend-v1
služby abackend-v2
vtest-infra
oboru názvů - Volali
backend-v1
se dvě nasazení abackend-v2
vtest-infra
oboru názvů
Nasazení požadovaných prostředků rozhraní API příchozího přenosu dat
- Vytvoření příchozího přenosu dat, který zachytí veškerý provoz a trasy do 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
- Vytvoření příchozího přenosu dat, který odpovídá předponě /shopu, která směruje na 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
Poznámka:
Když kontroler ALB vytvoří prostředky Application Gateway pro kontejnery v ARM, použije pro front-endový prostředek následující zásady vytváření názvů: fe-8< náhodně vygenerované znaky.>
Pokud chcete změnit název front-endu vytvořeného v Azure, zvažte použití vlastní strategie nasazení.
Po vytvoření každého prostředku příchozího přenosu dat se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.
kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml
Příklad výstupu jednoho z prostředků příchozího přenosu dat
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
Při vytvoření příchozího přenosu dat vytvořte prostředek IngressExtension pro contoso.com
. Tento příklad zajišťuje, že se provoz odesílaný contoso.com/shop
do back-endového cíle inicializoval contoso.com/ecommerce
.
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
Po vytvoření prostředku IngressExtension se ujistěte, že prostředek IngressExtension zobrazuje akceptovaný prostředek a naprogramuje se prostředek Application Gateway for Containers.
kubectl get IngressExtension url-rewrite -n test-infra -o yaml
Ověřte, že se prostředek Application Gateway for Containers úspěšně aktualizoval pro ingressExtension.
Otestování přístupu k aplikaci
Teď jsme připraveni odeslat nějaký provoz do ukázkové aplikace prostřednictvím plně kvalifikovaného názvu domény přiřazeného front-endu. K získání plně kvalifikovaného názvu domény použijte následující příkaz.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Pokud zadáte indikátor contoso.com/shop
názvu serveru pomocí příkazu curl, vrátí se odpověď ze služby back-end-v1 s požadovanou cestou k cílovému back-endu.contoso.com/ecommerce
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/shop
Prostřednictvím odpovědi bychom měli vidět:
{
"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"
}
Pokud pomocí příkazu curl zadáte indikátor contoso.com
názvu serveru, vrátí se odpověď ze služby back-end-v2, jak je znázorněno.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Měla by se zobrazit následující odpověď:
{
"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"
}
Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a použili ingressExtension k přepsání požadované adresy URL klienta před nastavením provozu na cíl ve službě Application Gateway for Containers.