Chemin d’accès, en-tête et routage des chaînes de requête avec Passerelle d’application pour conteneurs – API Passerelle
Ce document vous aide à configurer un exemple d’application qui utilise les ressources de l’API de passerelle pour illustrer le routage du trafic en fonction du chemin d’URL, de la chaîne de requête et de l’en-tête. Les étapes sont fournies pour :
- Créez une ressource de passerelle avec un écouteur HTTPS.
- Créez une ressource HTTPRoute qui fait référence à un service principal.
- Utilisez HTTPRouteMatch pour effectuer
matches
cette route en fonction du chemin, de l’en-tête et de la chaîne de requête.
Background
Application Gateway pour conteneurs active le routage du trafic en fonction du chemin d’URL, de la chaîne de requête et de l’en-tête. Consultez l’exemple de scénario suivant :
Prérequis
Si vous suivez la stratégie de déploiement BYO, vérifiez que vous avez configuré vos ressources Passerelle d’application pour conteneurs et le contrôleur ALB
Si vous suivez la stratégie de déploiement managé ALB, vérifiez que vous avez approvisionné votre Contrôleur ALB et approvisionné les ressources Passerelle d'application pour conteneurs via la ressource personnalisée ApplicationLoadBalancer.
Déployer un exemple d’application HTTP Appliquez le fichier deployment.yaml suivant sur votre cluster pour créer un exemple d’application web pour illustrer le chemin d’accès, la requête et le routage basé sur l’en-tête.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Cette commande crée les éléments suivants sur votre cluster :
- un espace de noms nommé
test-infra
- deux services nommés
backend-v1
etbackend-v2
dans l’espace de nomstest-infra
- deux déploiements nommés
backend-v1
etbackend-v2
dans l’espace de nomstest-infra
- un espace de noms nommé
Déployer les ressources d’API de passerelle requises
Créez une passerelle :
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
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
Une fois la passerelle créée, créez un itinéraire HTTPRoute pour définir deux correspondances différentes et un service par défaut vers lequel acheminer le trafic.
La façon dont les règles suivantes lisent sont les suivantes :
- Si le chemin d’accès est /bar, le trafic est acheminé vers le service backend-v2 sur le port 8080 OR
- Si la requête contient un en-tête HTTP portant le nom magic et la valeur foo, l’URL contient une chaîne de requête définissant le nom avec une valeur d’exemple, ET le chemin d’accès est /some/thing, la requête est envoyée à backend-v2 sur le port 8080.
- Sinon, toutes les autres requêtes sont acheminées vers le service backend-v1 sur le port 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
Une fois la ressource HTTPRoute créée, vérifiez que l’itinéraire a été accepté et que la ressource Application Gateway pour conteneurs a été programmé.
kubectl get httproute http-route -n test-infra -o yaml
Vérifiez que l’état de la ressource Application Gateway pour conteneurs a été correctement mis à jour.
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}')
À l’aide de la commande curl, nous pouvons valider trois scénarios différents :
Routage basé sur le chemin
Dans ce scénario, la demande cliente envoyée à http://frontend-fqdn/bar est acheminée vers le service backend-v2.
Exécutez la commande suivante :
curl http://$fqdn/bar
Notez que le conteneur qui sert la requête est backend-v2.
Chaîne de requête + en-tête + routage du chemin d’accès
Dans ce scénario, la demande cliente envoyée à http://frontend-fqdn/some/thing?great=example avec une partie clé/valeur d’en-tête de « magic : foo » est acheminée vers le service backend-v2.
Exécutez la commande suivante :
curl http://$fqdn/some/thing?great=example -H "magic: foo"
Notez que le conteneur qui sert la requête est backend-v2.
Itinéraire par défaut
Si aucun des deux premiers scénarios n’est satisfait, Application Gateway pour conteneurs achemine toutes les autres requêtes vers le service backend-v1.
Exécutez la commande suivante :
curl http://$fqdn/
Notez que le conteneur qui sert la requête est backend-v1.
Félicitations, vous avez installé le contrôleur ALB, déployé une application back-end et routé le trafic vers l’application via l’API Gateway sur Application Gateway pour conteneurs.