Přepsání adresy URL pro bránu Aplikace Azure lication pro kontejnery – rozhraní API brány
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á filtry definované rozhraním API brány Kubernetes.
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 příklad požadavku určeného k přepsání contoso.com/shop na contoso.com/ecommerce. Požadavek se zahájí do back-endového cíle službou Application Gateway pro kontejnery:
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, která předvede podporu rozdělení provozu nebo váženého kruhového dotazování.
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ů
- Obor názvů s názvem
Nasazení požadovaných prostředků rozhraní API brány
Vytvoření brány
kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: gateway-01 namespace: test-infra annotations: alb.networking.azure.io/alb-namespace: alb-test-infra alb.networking.azure.io/alb-name: alb-test spec: gatewayClassName: azure-alb-external listeners: - name: http-listener port: 80 protocol: HTTP allowedRoutes: namespaces: from: Same 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í prostředku brány se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.
kubectl get gateway gateway-01 -n test-infra -o yaml
Příklad výstupu úspěšného vytvoření brány
status:
addresses:
- type: Hostname
value: xxxx.yyyy.alb.azure.com
conditions:
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Valid Gateway
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
listeners:
- attachedRoutes: 0
conditions:
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: ""
observedGeneration: 1
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Listener is accepted
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T21:04:55Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
name: https-listener
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
Po vytvoření brány vytvořte prostředek HTTPRoute 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: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: rewrite-example
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
hostnames:
- "contoso.com"
rules:
- matches:
- path:
type: PathPrefix
value: /shop
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /ecommerce
backendRefs:
- name: backend-v1
port: 8080
- backendRefs:
- name: backend-v2
port: 8080
EOF
Po vytvoření prostředku HTTPRoute se ujistěte, že se prostředek HTTPRoute zobrazuje jako akceptovaný a prostředek Application Gateway for Containers je naprogramovaný.
kubectl get httproute rewrite-example -n test-infra -o yaml
Ověřte, že se prostředek Služby Application Gateway pro kontejnery úspěšně aktualizoval pro každou službu HTTPRoute.
status:
parents:
- conditions:
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: ""
observedGeneration: 1
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: Route is Accepted
observedGeneration: 1
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2023-06-19T22:18:23Z"
message: Application Gateway For Containers resource has been successfully updated.
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
controllerName: alb.networking.azure.io/alb-controller
parentRef:
group: gateway.networking.k8s.io
kind: Gateway
name: gateway-01
namespace: test-infra
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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Když pomocí příkazu curl zadáte indikátor názvu serveru, contoso.com/shop
měla by vrátit 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"
}
Když zadáte indikátor názvu serveru pomocí příkazu curl, contoso.com
měla by vrátit odpověď ze služby back-end-v2.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Prostřednictvím odpovědi bychom měli vidět:
{
"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 ovladač ALB a nasadili jste back-endovou aplikaci, která zahrnuje filtrování pro přepsání požadované adresy URL klienta. Cíl ve službě Application Gateway pro kontejnery je připravený přijímat provoz.