Přesměrování adresy URL pro bránu Aplikace Azure pro kontejnery – rozhraní API brány
Application Gateway pro kontejnery umožňuje vrátit odpověď přesměrování klientovi na základě tří aspektů adresy URL: protokol, název hostitele a cesta. Pro každé přesměrování se může klientovi vrátit definovaný stavový kód HTTP, který definuje povahu přesměrování.
Podrobnosti využití
Přesměrování adres URL využívají filtr pravidel RequestRedirect definovaný rozhraním API brány Kubernetes.
Přesměrování
Přesměrování nastaví stavový kód odpovědi vrácený klientům, aby porozuměl účelu přesměrování. Podporují se následující typy přesměrování:
- 301 (přesunuto trvale): Označuje, že cílový prostředek má přiřazen nový trvalý identifikátor URI. Budoucí odkazy na tento prostředek používají jednu z uzavřených identifikátorů URI. Použijte stavový kód 301 pro přesměrování HTTP na HTTPS.
- 302 (nalezeno): Označuje, že cílový prostředek je dočasně pod jiným identifikátorem URI. Vzhledem k tomu, že přesměrování se může občas změnit, měl by klient dál používat efektivní identifikátor URI požadavku pro budoucí požadavky.
Možnosti přesměrování
Přesměrování protokolu se běžně používá k tomu, aby klientovi řekl, aby se přesměroval z nešifrovaného schématu provozu na provoz, jako je přesměrování HTTP na HTTPS.
Přesměrování názvu hostitele odpovídá plně kvalifikovanému názvu domény (fqdn) požadavku. To se běžně vyskytuje při přesměrování starého názvu domény na nový název domény;
contoso.com
například dofabrikam.com
.Přesměrování cesty má dvě různé varianty:
prefix
afull
.Prefix
Typ přesměrování přesměruje všechny požadavky začínající definovanou hodnotou. Například: předpona /shop by odpovídala /shop a jakýkoli text za. Například /shop, /shop/checkout a /shop/item-a by se všechny přesměrovaly na /shop.Full
typ přesměrování odpovídá přesné hodnotě. Například: /shop by mohl přesměrovat na /store, ale /shop/checkout by nepřesměrovává na /store.
Následující obrázek znázorňuje příklad požadavku určeného pro přesměrování contoso.com/summer-promotion na contoso.com/shop/category/5. Kromě toho se vrátí druhý požadavek iniciovaný na contoso.com přes protokol HTTP, který zahájí nové připojení ke své variantě https.
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 nasaďte ukázkový certifikát TLS, který předvede možnosti přesměrování.
kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/https-scenario/ssl-termination/deployment.yaml
Tento příkaz vytvoří v clusteru následující:
- obor názvů s názvem
test-infra
- jedna služba volaná
echo
vtest-infra
oboru názvů - jedno nasazení volané
echo
vtest-infra
oboru názvů - jeden tajný klíč volaný
listener-tls-secret
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 - name: https-listener port: 443 protocol: HTTPS allowedRoutes: namespaces: from: Same tls: mode: Terminate certificateRefs: - kind : Secret group: "" name: listener-tls-secret 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
Vytvořte prostředek HTTPRoute, který contoso.com
zpracovává provoz přijatý přes https.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: https-contoso
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: https-listener
hostnames:
- "contoso.com"
rules:
- backendRefs:
- name: echo
port: 80
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
Po vytvoření brány vytvořte prostředek HTTPRoute pro contoso.com
filtr RequestRedirect, který přesměruje provoz HTTP na https.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-to-https-contoso-redirect
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: http-listener
hostnames:
- "contoso.com"
rules:
- matches:
filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
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
Vytvořte prostředek HTTPRoute, který contoso.com
zpracovává přesměrování cesty /summer-promotion na konkrétní adresu URL. Odstraněním názvu oddílu, který je ukázaný v prostředcích HTTPRoute http na https, se toto pravidlo přesměrování vztahuje na požadavky HTTP i HTTPS.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: summer-promotion-redirect
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
sectionName: https-listener
hostnames:
- "contoso.com"
rules:
- matches:
- path:
type: PathPrefix
value: /summer-promotion
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplaceFullPath
replaceFullPath: /shop/category/5
statusCode: 302
- backendRefs:
- name: echo
port: 80
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ž zadáte indikátor názvu serveru pomocí příkazu curl, http://contoso.com
měla by vrátit odpověď ze služby Application Gateway for Containers s hlavičkou location
definující přesměrování https://contoso.com
na adresu 301 .
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
Prostřednictvím odpovědi bychom měli vidět:
* Added contoso.com:80:xxx.xxx.xxx.xxx to DNS cache
* Hostname contoso.com was found in DNS cache
* Trying xxx.xxx.xxx.xxx:80...
* Connected to contoso.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: contoso.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< location: https://contoso.com/
< date: Mon, 26 Feb 2024 22:56:23 GMT
< server: Microsoft-Azure-Application-LB/AGC
< content-length: 0
<
* Connection #0 to host contoso.com left intact
Při zadání indikátoru názvu serveru pomocí příkazu https://contoso.com/summer-promotion
curl by služba Application Gateway pro kontejnery měla vrátit přesměrování https://contoso.com/shop/category/5
na adresu 302 .
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v
Prostřednictvím odpovědi bychom měli vidět:
> GET /summer-promotion HTTP/2
> Host: contoso.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 302
< location: https://contoso.com/shop/category/5
< date: Mon, 26 Feb 2024 22:58:43 GMT
< server: Microsoft-Azure-Application-LB/AGC
<
* Connection #0 to host contoso.com left intact
Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a pomocí rozhraní API brány nakonfigurovali přesměrování HTTP na HTTPS a přesměrování na základě cest na konkrétní požadavky klientů.