Partager via


Fractionnement du trafic avec Passerelle d’application pour conteneurs – API Passerelle

Ce document permet de configurer un exemple d’application qui utilise les ressources suivantes à partir de l’API de passerelle :

  • Passerelle : création d’une passerelle avec un écouteur http
  • HTTPRoute : création d’un itinéraire HTTP qui référence deux services principaux ayant des pondérations différentes

Background

Application Gateway pour conteneurs vous permet de définir des pondérations et de déplacer le trafic entre différentes cibles back-end. Consultez l’exemple de scénario suivant :

A figure showing traffic splitting with Application Gateway for Containers.

Prérequis

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

  2. Si vous suivez la stratégie de déploiement managé ALB, vérifiez que vous avez provisionné votre contrôleur ALB ainsi que les ressources 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 créer un exemple d’application web afin de démontrer la prise en charge du fractionnement / tourniquet (round robin) pondéré du trafic.

    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 et backend-v2 dans l’espace de noms test-infra
    • Deux déploiements nommés backend-v1 et backend-v2 dans l’espace de noms test-infra

Déployer les ressources d’API de passerelle requises

Créez 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
    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: gateway-01-http
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Une fois la passerelle créée, créez une ressource HTTPRoute

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: traffic-split-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: backend-v1
      port: 8080
      weight: 50
    - name: backend-v2
      port: 8080
      weight: 50
EOF

Une fois la ressource HTTPRoute créée, vérifiez que l’itinéraire est accepté et que la ressource Passerelle d’application pour conteneurs est programmée.

kubectl get httproute traffic-split-route -n test-infra -o yaml

Vérifiez que l’état de la ressource Passerelle d’application 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 vers notre exemple d’application, via le FQDN attribué 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}')

Le curling de ce nom de domaine complet doit renvoyer les réponses des backends/pods tels que configurés sur HTTPRoute.

# this curl command will return 50% of the responses from backend-v1
# and the remaining 50% of the responses from backend-v2
watch -n 1 curl http://$fqdn

Félicitations, vous avez installé ALB Controller, déployé une application backend et acheminé le trafic vers l'application via l'entrée sur Application Gateway for Containers.