Partager via


Redirection d’URL pour Azure Application Gateway pour conteneurs – API de passerelle

Passerelle d’application pour conteneurs vous permet de retourner une réponse de redirection au client en fonction des trois éléments constitutifs d’une URL : le protocole, le nom d’hôte et le chemin d’accès. Pour chaque redirection, un code d’état HTTP défini peut être retourné au client pour définir la nature de la redirection.

Usage details

Les redirections d’URL profitent du filtre de règle RequestRedirect tel que défini par l’API Kubernetes Gateway.

Redirection

Une redirection définit le code d’état de réponse renvoyé aux clients pour comprendre le but de la redirection. Les types suivants de redirection sont pris en charge :

  • 301 (Déplacé de façon permanente) : indique que la ressource cible se voit attribuer un nouvel URI permanent. Les références futures à cette ressource utilisent l’un des URI inclus. Utilisez le code d’état 301 pour la redirection du protocole HTTP vers HTTPS.
  • 302 Trouvé : Indique que la ressource cible se trouve temporairement sous un autre URI. Étant donné que la redirection peut changer à l'occasion, le client doit continuer à utiliser l'URI de requête effectif pour les demandes ultérieures.

Fonctionnalités de redirection

  • La redirection de protocole est couramment utilisée pour indiquer au client de passer d’un schéma de trafic non chiffré à un trafic tel que la redirection HTTP vers HTTPS.

  • La redirection de nom d’hôte correspond au nom de domaine complet (fqdn) de la requête. Ceci est couramment observé lors de la redirection d’un ancien nom de domaine vers un nouveau nom de domaine ; par exemple, contoso.com vers fabrikam.com.

  • La redirection de chemin d’accès présente deux variantes différentes : prefix et full.

    • Le type de redirection Prefix redirige toutes les requêtes commençant par une valeur définie. Par exemple, le préfixe /shop correspondrait à /shop et à tout texte placé après. Par exemple, /shop, /shop/checkout et /shop/item-a feraient également tous l’objet d’une redirection vers /shop.
    • Le type de redirection Full correspond à une valeur exacte. Par exemple, /shop pourrait être redirigé vers /store, mais pas /shop/checkout.

La figure suivante illustre un exemple de requête destinée à contoso.com/summer-promotion et redirigée vers contoso.com/shop/category/5. Par ailleurs, une deuxième requête initiée vers contoso.com via le protocole http reçoit une redirection pour initier une nouvelle connexion à sa variante https.

Diagramme montrant la Passerelle d’application pour conteneurs qui retourne une URL de redirection à un client.

Prérequis

  1. Si vous suivez la stratégie de déploiement BYO, veillez à configurer vos ressources de Passerelle d’application pour conteneurs et le contrôleur ALB.

  2. Si vous suivez la stratégie de déploiement managé ALB, veillez à approvisionner votre contrôleur ALB et les ressources de Passerelle d’application pour conteneurs via la ressource personnalisée ApplicationLoadBalancer.

  3. Déployez un exemple d’application HTTP :

    Appliquez le fichier deployment.yaml suivant sur votre cluster pour déployer un exemple de certificat TLS afin de faire la démonstration des capacités de redirection.

    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
    

    Cette commande crée les éléments suivants sur votre cluster :

    • un espace de noms appelé test-infra
    • un service appelé echo dans l’espace de noms test-infra
    • un déploiement appelé echo dans l’espace de noms test-infra
    • un secret appelé listener-tls-secret dans l’espace de noms test-infra

Déployer les ressources d’API de passerelle requises

  1. Créer une passerelle

    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
    

Remarque

Lorsque le contrôleur ALB crée les ressources Passerelle d’application pour conteneurs dans ARM, il utilise la convention de dénomination suivante pour une ressource front-end : fe-<8 caractères générés aléatoirement>

Si vous souhaitez modifier le nom du front-end créé dans Azure, il peut être préférable de suivre la stratégie de déploiement BYO.

Une fois la ressource de passerelle créée, vérifiez que l’état est valide, que l’écouteur est programmé et qu’une adresse est affectée à la passerelle.

kubectl get gateway gateway-01 -n test-infra -o yaml

Exemple de sortie de la création réussie de la passerelle.

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

Créez une ressource HTTPRoute pour contoso.com qui gère le trafic reçu via 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

Une fois la ressource HTTPRoute créée, vérifiez que les la ressource HTTPRoute affiche Acceptée et que la ressource Passerelle d'application pour conteneurs est Programmée.

kubectl get httproute rewrite-example -n test-infra -o yaml

Vérifiez que l’état de la ressource Passerelle d'application pour conteneurs est correctement mis à jour pour chaque 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

Une fois la passerelle créée, créez une ressource HTTPRoute pour contoso.com avec un filtre RequestRedirect qui redirige le trafic http vers 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

Une fois la ressource HTTPRoute créée, vérifiez que les la ressource HTTPRoute affiche Acceptée et que la ressource Passerelle d'application pour conteneurs est Programmée.

kubectl get httproute rewrite-example -n test-infra -o yaml

Vérifiez que l’état de la ressource Passerelle d'application pour conteneurs est correctement mis à jour pour chaque 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

Créez une ressource HTTPRoute pour contoso.com qui gère une redirection pour le chemin d’accès /summer-promotion vers une URL spécifique. En éliminant sectionName, illustré dans les ressources http to https HTTPRoute, cette règle de redirection s’applique aux requêtes HTTP et 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

Une fois la ressource HTTPRoute créée, vérifiez que les la ressource HTTPRoute affiche Acceptée et que la ressource Passerelle d'application pour conteneurs est Programmée.

kubectl get httproute rewrite-example -n test-infra -o yaml

Vérifiez que l’état de la ressource Passerelle d'application pour conteneurs est correctement mis à jour pour chaque 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

Tester l’accès à l’application

Nous sommes maintenant prêts à envoyer du trafic à notre exemple d’application, via le nom de domaine complet affecté au front-end. Utilisez la commande suivante pour obtenir le nom de domaine complet.

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Lorsque vous spécifiez l’indicateur de nom de serveur à l’aide de la commande curl, http://contoso.com doit renvoyer une réponse de Passerelle d’application pour conteneurs avec un en-tête location définissant une redirection 301 vers https://contoso.com.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v

Par le biais de la réponse, nous devrions voir :

* 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

Lorsque vous spécifiez l’indicateur de nom de serveur à l’aide de la commande curl, https://contoso.com/summer-promotion, Passerelle d’application pour conteneurs doit renvoyer une redirection 302 vers https://contoso.com/shop/category/5.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v

Par le biais de la réponse, nous devrions voir :

> 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

Félicitations, vous avez installé le contrôleur ALB, déployé une application back-end et utilisé l'API de passerelle pour configurer à la fois une redirection HTTP vers HTTPS et une redirection basée sur le chemin d’accès vers des requêtes client spécifiques.