Condividi tramite


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:

Figura che mostra il routing di percorsi, intestazioni e stringhe di query con gateway applicazione per contenitori.

Prerequisiti

  1. 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

  2. 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.

  3. 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 e backend-v2 nello spazio dei nomi test-infra
    • due distribuzioni denominate backend-v1 e backend-v2 nello spazio dei nomi test-infra

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:

  1. Se il percorso è /bar, il traffico viene instradato al servizio backend-v2 nella porta 8080 O
  2. 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.
  3. 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.