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
versfabrikam.com
.La redirection de chemin d’accès présente deux variantes différentes :
prefix
etfull
.- 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.
- Le type de redirection
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.
Prérequis
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.
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.
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 nomstest-infra
- un déploiement appelé
echo
dans l’espace de nomstest-infra
- un secret appelé
listener-tls-secret
dans l’espace de nomstest-infra
- un espace de noms appelé
Déployer les ressources d’API de passerelle requises
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.