Reindirizzamento URL per gateway di app Azure lication per contenitori - API gateway
Il Gateway applicativo per contenitori consente di restituire una risposta di reindirizzamento al client in base a tre aspetti di un URL: protocollo, nome host e percorso. Per ogni reindirizzamento, un codice di stato HTTP definito può essere restituito al client per definire la natura del reindirizzamento.
Usage details (Dettagli di utilizzo)
I reindirizzamenti URL sfruttano il filtro della regola RequestRedirect come definito dall'API del gateway Kubernetes.
Reindirizzamento
Un reindirizzamento imposta il codice di stato della risposta restituito ai client per comprendere lo scopo del reindirizzamento. Sono supportati i tipi di reindirizzamento seguenti:
- 301 (spostato in modo permanente): indica che alla risorsa di destinazione viene assegnato un nuovo URI permanente. I riferimenti futuri a questa risorsa usano uno degli URI racchiusi. Usare il codice di stato 301 per il reindirizzamento da HTTP a HTTPS.
- 302 (Trovato): indica che la risorsa di destinazione è temporaneamente in un URI diverso. Poiché il reindirizzamento può cambiare in alcuni casi, il client deve continuare a usare l'URI della richiesta effettivo per le richieste future.
Funzionalità di reindirizzamento
Il reindirizzamento del protocollo viene comunemente usato per indicare al client di passare da uno schema di traffico non crittografato al traffico, ad esempio il reindirizzamento da HTTP a HTTPS.
Il reindirizzamento del nome host corrisponde al nome di dominio completo (fqdn) della richiesta. Questo è comunemente osservato nel reindirizzamento di un nome di dominio precedente a un nuovo nome di dominio, come
contoso.com
afabrikam.com
.Il reindirizzamento del percorso ha due varianti diverse:
prefix
efull
.- Il tipo di reindirizzamento
Prefix
reindirizzerà tutte le richieste a partire da un valore definito. Ad esempio, un prefisso di /shop corrisponde a /shop e a qualsiasi testo dopo. Ad esempio, /shop, /shop/completamento della transazione e /shop/item-a reindirizza tutti a /shop. - Il tipo di reindirizzamento
Full
corrisponde a un valore esatto. Ad esempio: /shop potrebbe reindirizzare a /store, ma /shop/checkout non reindirizzerebbe a /store.
- Il tipo di reindirizzamento
Nella figura seguente viene illustrato un esempio di richiesta destinata a contoso.com/summer-promotion reindirizzata a contoso.com/shop/category/5. Inoltre, viene restituita una seconda richiesta avviata a contoso.com tramite protocollo HTTP per avviare una nuova connessione alla relativa variante https.
Prerequisiti
Se si segue la strategia di distribuzione personalizzata BYO (Bring Your Own), assicurarsi di configurare le risorse del Gateway applicativo per contenitori e il controller ALB.
Se si segue la strategia di distribuzione gestita di ALB, assicurarsi di effettuare il provisioning del controller ALB e delle risorse del Gateway applicativo per contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.
Distribuire un'applicazione HTTP di esempio:
Applicare il file deployment.yaml seguente nel cluster per distribuire un certificato TLS di esempio per illustrare le funzionalità di reindirizzamento.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/ssl-termination/deployment.yaml
Questo comando crea gli elementi seguenti nel cluster:
- uno spazio dei nomi denominato
test-infra
- un servizio denominato
echo
nello spazio dei nomitest-infra
- una distribuzione denominata
echo
nello spazio dei nomitest-infra
- un segreto denominato
listener-tls-secret
nello spazio dei nomitest-infra
- uno spazio dei nomi denominato
Distribuire le risorse necessarie per l'API gateway
Creare un gateway
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
Nota
Quando il Controller ALB crea le risorse Gateway applicativo per contenitori in ARM, userà la convenzione di denominazione seguente per una risorsa front-end: fe-<8 caratteri generati in modo casuale>
Se si vuole modificare il nome del front-end creato in Azure, valutare la possibilità di seguire la strategia di distribuzione personalizzata (Bring Your Own Deployment).
Dopo aver creato la risorsa gateway, verificare che lo stato sia valido, che il listener sia programmato e che al gateway sia assegnato un indirizzo.
kubectl get gateway gateway-01 -n test-infra -o yaml
Output di esempio della corretta creazione del gateway.
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
Creare una risorsa HTTPRoute per contoso.com
che gestisca il traffico ricevuto tramite 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
Dopo aver creato la risorsa HTTPRoute, verificare che la risorsa HTTPRoute mostri Accettato e che lo stato della risorsa Gateway applicativo per contenitori sia Programmato.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verificare che lo stato della risorsa Gateway applicativo per contenitori sia stato aggiornato correttamente per ogni 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
Dopo aver creato il gateway, creare una risorsa HTTPRoute per contoso.com
con un filtro RequestRedirect che reindirizza il traffico HTTP a 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
Dopo aver creato la risorsa HTTPRoute, verificare che la risorsa HTTPRoute mostri Accettato e che lo stato della risorsa Gateway applicativo per contenitori sia Programmato.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verificare che lo stato della risorsa Gateway applicativo per contenitori sia stato aggiornato correttamente per ogni 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
Creare una risorsa HTTPRoute per contoso.com
che gestisca un reindirizzamento per il percorso /summer-promotion a un URL specifico. Eliminando sectionName, illustrato nelle risorse HTTPRoute da http a https, questa regola di reindirizzamento si applica alle richieste HTTP e 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
Dopo aver creato la risorsa HTTPRoute, verificare che la risorsa HTTPRoute mostri Accettato e che lo stato della risorsa Gateway applicativo per contenitori sia Programmato.
kubectl get httproute rewrite-example -n test-infra -o yaml
Verificare che lo stato della risorsa Gateway applicativo per contenitori sia stato aggiornato correttamente per ogni 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
Testare l'accesso all'applicazione
A questo punto, è possibile inviare traffico all'applicazione di esempio tramite l’FQDN assegnato al front-end. Usare il comando seguente per ottenere il nome di dominio completo (FQDN).
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Quando si specifica l'indicatore del nome del server usando il comando curl, http://contoso.com
deve restituire una risposta del Gateway applicativo per contenitori con un'intestazione location
che definisce un reindirizzamento 301 a https://contoso.com
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v
Tramite la risposta si osserverà quanto segue:
* 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
Quando si specifica l'indicatore del nome del server usando il comando curl, il Gateway applicativo per contenitori https://contoso.com/summer-promotion
deve restituire un reindirizzamento 302 a https://contoso.com/shop/category/5
.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v
Tramite la risposta si osserverà quanto segue:
> 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
Congratulazioni, è stato installato ALB Controller, è stata distribuita un'applicazione back-end e è stata usata l'API gateway per configurare sia un reindirizzamento HTTP a HTTPS che il reindirizzamento basato sul percorso a richieste client specifiche.