Condividi tramite


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 a fabrikam.com.

  • Il reindirizzamento del percorso ha due varianti diverse: prefix e full.

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

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.

Diagramma che mostra il Gateway applicativo per contenitori che restituisce un URL di reindirizzamento a un client.

Prerequisiti

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

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

  3. 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 nomi test-infra
    • una distribuzione denominata echo nello spazio dei nomi test-infra
    • un segreto denominato listener-tls-secret nello spazio dei nomi test-infra

Distribuire le risorse necessarie per l'API gateway

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