Routing di percorsi, intestazioni e stringhe di query con gateway applicazione per contenitori - API gateway
Questo documento consente di configurare un'applicazione di esempio che usa le risorse dell'API Gateway per illustrare il routing del traffico in base al percorso dell'URL, alla stringa di query e all'intestazione. Vengono forniti i passaggi per:
- Creare una risorsa Gateway con un listener HTTPS.
- Creare una HTTPRoute che fa riferimento a un servizio back-end.
- Usare HTTPRouteMatch per eseguire
matches
, la cui route si basa su percorso, intestazione e stringa di query.
Background
Il Gateway applicativo per contenitori consente il routing del traffico in base al percorso URL, alla stringa di query e all'intestazione. Vedere lo scenario di esempio seguente:
Prerequisiti
Se si segue la strategia di distribuzione personalizzata BYO (Bring Your Own), assicurarsi di aver configurato le risorse del Gateway applicativo per contenitori e il controller ALB
Se si segue la strategia di distribuzione gestita di ALB, assicurarsi di aver effettuato il provisioning del controller ALB e che sia stato effettuato il provisioning delle risorse del Gateway applicativo per contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.
Per distribuire l'applicazione di esempio HTTP, applicare il file deployment.yaml seguente nel cluster in modo da creare un'applicazione Web di esempio per illustrare il percorso, la query e il routing basato sull'intestazione.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Questo comando crea quanto segue nel cluster:
- uno spazio dei nomi denominato
test-infra
- due servizi denominati
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
- due distribuzioni denominate
backend-v1
ebackend-v2
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/v1beta1
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
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
Dopo aver creato il gateway, creare un HTTPRoute per definire due corrispondenze diverse e un servizio predefinito a cui instradare il traffico.
Il modo in cui le regole seguenti vengono lette viene descritto di seguito:
- Se il percorso è /bar, il traffico viene instradato al servizio backend-v2 nella porta 8080 O
- Se la richiesta contiene un'intestazione HTTP con il nome magic e il valore foo, l'URL contiene una stringa di query che definisce il nome ideale con un valore di esempio, E il percorso è /some/thing, la richiesta viene inviata al backend-v2 nella porta 8080.
- In caso contrario, tutte le altre richieste vengono instradate al servizio backend-v1 nella porta 8080.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: http-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
namespace: test-infra
rules:
- matches:
- path:
type: PathPrefix
value: /bar
backendRefs:
- name: backend-v2
port: 8080
- matches:
- headers:
- type: Exact
name: magic
value: foo
queryParams:
- type: Exact
name: great
value: example
path:
type: PathPrefix
value: /some/thing
method: GET
backendRefs:
- name: backend-v2
port: 8080
- backendRefs:
- name: backend-v1
port: 8080
EOF
Dopo aver creato la risorsa HTTPRoute, verificare che la route sia Accettata e che lo stato della risorsa del Gateway applicativo per contenitori sia Programmato.
kubectl get httproute http-route -n test-infra -o yaml
Verificare che lo stato della risorsa del Gateway applicativo per contenitori sia stato aggiornato correttamente.
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}')
Usando il comando curl, è possibile convalidare tre scenari diversi:
Routing basato sul percorso
In questo scenario, la richiesta client inviata a http://frontend-fqdn/bar viene instradata al servizio backend-v2.
Esegui questo comando:
curl http://$fqdn/bar
Si noti che il contenitore che gestisce la richiesta è backend-v2.
Stringa di query + intestazione + routing del percorso
In questo scenario, la richiesta client inviata a http://frontend-fqdn/some/thing?great=example con una parte di intestazione chiave/valore di "magic: foo" viene instradata al servizio backend-v2.
Esegui questo comando:
curl http://$fqdn/some/thing?great=example -H "magic: foo"
Si noti che il contenitore che gestisce la richiesta è backend-v2.
Route predefinita
Se nessuno dei primi due scenari è soddisfatto, il Gateway applicativo per contenitori instrada tutte le altre richieste al servizio backend v1.
Esegui questo comando:
curl http://$fqdn/
Si noti che il contenitore che gestisce la richiesta è backend-v1.
Congratulazioni, è stato installato il controller ALB, è stata distribuita un'applicazione back-end e il traffico è stato instradato all'applicazione tramite l'API Gateway nel Gateway applicativo per contenitori.