2.7. Gestion du trafic
You are viewing documentation for a Red Hat OpenShift Service Mesh release that is no longer supported.
Les plans de contrôle Service Mesh version 1.0 et 1.1 ne sont plus pris en charge. Pour plus d'informations sur la mise à niveau de votre plan de contrôle Service Mesh, voir Mise à niveau de Service Mesh.
Pour plus d'informations sur l'état de l'assistance d'une version particulière de Red Hat OpenShift Service Mesh, consultez la page Cycle de vie du produit.
Vous pouvez contrôler le flux de trafic et les appels API entre les services dans Red Hat OpenShift Service Mesh. Par exemple, certains services de votre maillage de services peuvent avoir besoin de communiquer au sein du maillage et d'autres peuvent avoir besoin d'être cachés. Gérez le trafic pour cacher des services backend spécifiques, exposer des services, créer des déploiements de test ou de version, ou ajouter une couche de sécurité sur un ensemble de services.
2.7.1. Utilisation de passerelles
Vous pouvez utiliser une passerelle pour gérer le trafic entrant et sortant de votre maillage afin de spécifier le trafic que vous souhaitez voir entrer ou sortir du maillage. Les configurations de passerelle sont appliquées aux proxys Envoy autonomes qui s'exécutent à la périphérie du maillage, plutôt qu'aux proxys Envoy sidecar qui s'exécutent aux côtés de vos charges de travail de service.
Contrairement à d'autres mécanismes de contrôle du trafic entrant dans vos systèmes, tels que les API Kubernetes Ingress, les passerelles Red Hat OpenShift Service Mesh utilisent toute la puissance et la flexibilité du routage du trafic.
La ressource de passerelle Red Hat OpenShift Service Mesh peut utiliser les propriétés d'équilibrage de charge de la couche 4-6, telles que les ports, pour exposer et configurer les paramètres TLS de Red Hat OpenShift Service Mesh. Au lieu d'ajouter le routage du trafic de la couche application (L7) à la même ressource API, vous pouvez lier un service virtuel Red Hat OpenShift Service Mesh ordinaire à la passerelle et gérer le trafic de la passerelle comme tout autre trafic de plan de données dans un maillage de services.
Les passerelles sont principalement utilisées pour gérer le trafic entrant, mais vous pouvez également configurer des passerelles de sortie. Une passerelle de sortie vous permet de configurer un nœud de sortie dédié pour le trafic quittant le maillage. Cela vous permet de limiter les services qui ont accès aux réseaux externes, ce qui ajoute un contrôle de sécurité à votre maillage de services. Vous pouvez également utiliser une passerelle pour configurer un proxy purement interne.
Exemple de passerelle
Une ressource de passerelle décrit un équilibreur de charge fonctionnant à la périphérie du maillage et recevant des connexions HTTP/TCP entrantes ou sortantes. La spécification décrit un ensemble de ports qui doivent être exposés, le type de protocole à utiliser, la configuration SNI pour l'équilibreur de charge, etc.
L'exemple suivant montre un exemple de configuration de passerelle pour le trafic HTTPS externe entrant :
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: ext-host-gwy spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 443 name: https protocol: HTTPS hosts: - ext-host.example.com tls: mode: SIMPLE serverCertificate: /tmp/tls.crt privateKey: /tmp/tls.key
Cette configuration de passerelle permet au trafic HTTPS provenant de ext-host.example.com
d'entrer dans le maillage sur le port 443, mais ne spécifie aucun routage pour le trafic.
Pour spécifier le routage et pour que la passerelle fonctionne comme prévu, vous devez également lier la passerelle à un service virtuel. Pour ce faire, vous utilisez le champ Passerelles du service virtuel, comme le montre l'exemple suivant :
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: virtual-svc spec: hosts: - ext-host.example.com gateways: - ext-host-gwy
Vous pouvez ensuite configurer le service virtuel avec des règles de routage pour le trafic externe.
2.7.2. Configuration d'une passerelle d'entrée
Une passerelle d'entrée est un équilibreur de charge fonctionnant à la périphérie du réseau maillé et recevant des connexions HTTP/TCP entrantes. Elle configure les ports et les protocoles exposés, mais n'inclut aucune configuration d'acheminement du trafic. Le routage du trafic entrant est plutôt configuré avec des règles de routage, de la même manière que pour les demandes de services internes.
Les étapes suivantes montrent comment créer une passerelle et configurer un site VirtualService
pour exposer un service de l'application d'exemple Bookinfo au trafic extérieur pour les chemins /productpage
et /login
.
Procédure
Créer une passerelle pour accepter le trafic.
Créez un fichier YAML et copiez-y le YAML suivant.
Exemple de passerelle gateway.yaml
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: info-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
Appliquer le fichier YAML.
$ oc apply -f gateway.yaml
Créer un objet
VirtualService
pour réécrire l'en-tête de l'hôte.Créez un fichier YAML et copiez-y le YAML suivant.
Exemple de service virtuel
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: info spec: hosts: - "*" gateways: - info-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
Appliquer le fichier YAML.
$ oc apply -f vs.yaml
Vérifiez que la passerelle et le service virtuel ont été définis correctement.
Définir l'URL de la passerelle.
export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
Définissez le numéro de port. Dans cet exemple,
istio-system
est le nom du projet de plan de contrôle Service Mesh.export TARGET_PORT=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.port.targetPort}')
Tester une page qui a été explicitement exposée.
curl -s -I "$GATEWAY_URL/productpage"
Le résultat attendu est
200
.
2.7.3. Gestion du trafic entrant
Dans Red Hat OpenShift Service Mesh, la passerelle d'entrée permet aux fonctionnalités telles que la surveillance, la sécurité et les règles de routage de s'appliquer au trafic qui entre dans le cluster. Utilisez une passerelle Service Mesh pour exposer un service en dehors du service mesh.
2.7.3.1. Détermination de l'IP et des ports d'entrée
La configuration de l'entrée diffère selon que votre environnement supporte ou non un équilibreur de charge externe. Un équilibreur de charge externe est défini dans l'IP et les ports d'entrée du cluster. Pour déterminer si l'IP et les ports de votre cluster sont configurés pour les équilibreurs de charge externes, exécutez la commande suivante. Dans cet exemple, istio-system
est le nom du projet de plan de contrôle Service Mesh.
$ oc get svc istio-ingressgateway -n istio-system
Cette commande renvoie les adresses NAME
, TYPE
, CLUSTER-IP
, EXTERNAL-IP
, PORT(S)
, et AGE
de chaque élément de votre espace de noms.
Si la valeur EXTERNAL-IP
est définie, votre environnement dispose d'un équilibreur de charge externe que vous pouvez utiliser comme passerelle d'entrée.
Si la valeur EXTERNAL-IP
est <none>
, ou perpétuellement <pending>
, votre environnement ne fournit pas d'équilibreur de charge externe pour la passerelle d'entrée. Vous pouvez accéder à la passerelle en utilisant le port de nœud du service.
2.7.3.1.1. Détermination des ports d'entrée avec un équilibreur de charge
Suivez ces instructions si votre environnement dispose d'un équilibreur de charge externe.
Procédure
Exécutez la commande suivante pour définir l'adresse IP et les ports d'entrée. Cette commande définit une variable dans votre terminal.
$ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
Exécutez la commande suivante pour définir le port d'entrée.
$ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
Exécutez la commande suivante pour définir le port d'entrée sécurisé.
$ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
Exécutez la commande suivante pour définir le port d'entrée TCP.
$ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
Dans certains environnements, l'équilibreur de charge peut être exposé en utilisant un nom d'hôte au lieu d'une adresse IP. Dans ce cas, la valeur EXTERNAL-IP
de la passerelle d'entrée n'est pas une adresse IP, mais un nom d'hôte. Il s'agit plutôt d'un nom d'hôte, et la commande précédente ne parvient pas à définir la variable d'environnement INGRESS_HOST
.
Dans ce cas, utilisez la commande suivante pour corriger la valeur de INGRESS_HOST
:
$ export INGRESS_HOST=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
2.7.3.1.2. Détermination des ports d'entrée sans répartiteur de charge
Si votre environnement ne dispose pas d'un équilibreur de charge externe, déterminez les ports d'entrée et utilisez un port de nœud à la place.
Procédure
Définir les ports d'entrée.
$ export INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
Exécutez la commande suivante pour définir le port d'entrée sécurisé.
$ export SECURE_INGRESS_PORT=$(oc -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
Exécutez la commande suivante pour définir le port d'entrée TCP.
$ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')
2.7.4. Création automatique d'itinéraires
Les routes OpenShift pour les passerelles Istio sont automatiquement gérées dans Red Hat OpenShift Service Mesh. Chaque fois qu'une passerelle Istio est créée, mise à jour ou supprimée dans le service mesh, une route OpenShift est créée, mise à jour ou supprimée.
2.7.4.1. Activation de la création automatique d'itinéraires
Un composant du plan de contrôle de Red Hat OpenShift Service Mesh appelé Istio OpenShift Routing (IOR) synchronise la route de la passerelle. Activez IOR dans le cadre du déploiement du plan de contrôle.
Si la passerelle contient une section TLS, la route OpenShift sera configurée pour prendre en charge TLS.
-
Dans la ressource
ServiceMeshControlPlane
, ajoutez le paramètreior_enabled
et définissez-le àtrue
. Par exemple, voir l'extrait de ressource suivant :
spec: istio: gateways: istio-egressgateway: autoscaleEnabled: false autoscaleMin: 1 autoscaleMax: 5 istio-ingressgateway: autoscaleEnabled: false autoscaleMin: 1 autoscaleMax: 5 ior_enabled: true
2.7.4.2. Sous-domaines
Red Hat OpenShift Service Mesh crée la route avec le sous-domaine, mais OpenShift Container Platform doit être configuré pour l'activer. Les sous-domaines, par exemple *.domain.com
, sont pris en charge mais pas par défaut. Configurez une politique de wildcard OpenShift Container Platform avant de configurer un wildcard host Gateway. Pour plus d'informations, voir la section "Liens".
Si la passerelle suivante est créée :
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: gateway1 spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - www.info.com - info.example.com
Ensuite, les routes OpenShift suivantes sont créées automatiquement. Vous pouvez vérifier que les routes sont créées avec la commande suivante.
oc -n <control_plane_namespace> get routes
Résultats attendus
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD gateway1-lvlfn info.example.com istio-ingressgateway <all> None gateway1-scqhv www.info.com istio-ingressgateway <all> None
Si la passerelle est supprimée, Red Hat OpenShift Service Mesh supprime les routes. Cependant, les routes créées manuellement ne sont jamais modifiées par Red Hat OpenShift Service Mesh.
2.7.5. Comprendre les entrées de service
Une entrée de service ajoute une entrée au registre de service que Red Hat OpenShift Service Mesh maintient en interne. Après avoir ajouté l'entrée de service, les proxys Envoy envoient du trafic au service comme s'il s'agissait d'un service dans votre maillage. Les entrées de service vous permettent d'effectuer les opérations suivantes :
- Gérer le trafic pour les services qui s'exécutent en dehors du maillage de services.
- Redirection et transfert du trafic vers des destinations externes (telles que les API consommées sur le web) ou vers des services de l'infrastructure existante.
- Définir des politiques de relance, de temporisation et d'injection d'erreur pour les destinations externes.
- Exécutez un service de maillage dans une machine virtuelle (VM) en ajoutant des VM à votre maillage.
Ajoutez des services d'un cluster différent au maillage pour configurer un maillage multicluster Red Hat OpenShift Service Mesh sur Kubernetes.
Exemples de saisie de services
L'exemple suivant est une entrée de service mesh-external qui ajoute la dépendance externe ext-resource
au registre de services Red Hat OpenShift Service Mesh :
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: - ext-svc.example.com ports: - number: 443 name: https protocol: HTTPS location: MESH_EXTERNAL resolution: DNS
Spécifiez la ressource externe à l'aide du champ hosts
. Vous pouvez le qualifier complètement ou utiliser un nom de domaine préfixé par un joker.
Vous pouvez configurer des services virtuels et des règles de destination pour contrôler le trafic vers une entrée de service de la même manière que vous configurez le trafic pour tout autre service dans le maillage. Par exemple, la règle de destination suivante configure la route du trafic pour utiliser TLS mutuel afin de sécuriser la connexion au service externe ext-svc.example.com
qui est configuré à l'aide de l'entrée de service :
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ext-res-dr spec: host: ext-svc.example.com trafficPolicy: tls: mode: MUTUAL clientCertificate: /etc/certs/myclientcert.pem privateKey: /etc/certs/client_private_key.pem caCertificates: /etc/certs/rootcacerts.pem
2.7.6. Utilisation des services virtuels
Vous pouvez acheminer des requêtes dynamiquement vers plusieurs versions d'un microservice via Red Hat OpenShift Service Mesh avec un service virtuel. Avec les services virtuels, vous pouvez :
- Adresser plusieurs services d'application par le biais d'un seul service virtuel. Si votre maillage utilise Kubernetes, par exemple, vous pouvez configurer un service virtuel pour gérer tous les services dans un espace de noms spécifique. Un service virtuel vous permet de transformer une application monolithique en un service composé de microservices distincts avec une expérience consommateur transparente.
- Configurer des règles de trafic en combinaison avec des passerelles pour contrôler le trafic entrant et sortant.
2.7.6.1. Configuration des services virtuels
Les demandes sont acheminées vers les services au sein d'un maillage de services virtuels. Chaque service virtuel consiste en un ensemble de règles de routage qui sont évaluées dans l'ordre. Red Hat OpenShift Service Mesh fait correspondre chaque demande donnée au service virtuel à une destination réelle spécifique au sein du maillage.
Sans services virtuels, Red Hat OpenShift Service Mesh distribue le trafic en utilisant l'équilibrage de charge des moindres demandes entre toutes les instances de service. Avec un service virtuel, vous pouvez spécifier le comportement du trafic pour un ou plusieurs noms d'hôte. Les règles de routage dans le service virtuel indiquent à Red Hat OpenShift Service Mesh comment envoyer le trafic pour le service virtuel vers les destinations appropriées. Les destinations de routage peuvent être des versions du même service ou des services entièrement différents.
Procédure
Créez un fichier YAML à l'aide de l'exemple suivant pour acheminer les requêtes vers différentes versions de l'exemple de service d'application Bookinfo en fonction de l'utilisateur qui se connecte à l'application.
Exemple VirtualService.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3
Exécutez la commande suivante pour appliquer
VirtualService.yaml
, oùVirtualService.yaml
est le chemin d'accès au fichier.$ oc apply -f <VirtualService.yaml>
2.7.6.2. Référence de configuration du service virtuel
Paramètres | Description |
---|---|
spec: hosts: |
Le champ |
spec: http: - match: |
La section |
spec: http: - match: - destination: |
Le champ |
2.7.7. Comprendre les règles de destination
Les règles de destination sont appliquées après l'évaluation des règles de routage des services virtuels, de sorte qu'elles s'appliquent à la destination réelle du trafic. Les services virtuels acheminent le trafic vers une destination. Les règles de destination configurent ce qu'il advient du trafic à cette destination.
Par défaut, Red Hat OpenShift Service Mesh utilise une politique d'équilibrage de charge des moindres demandes, où l'instance de service dans le pool avec le plus petit nombre de connexions actives reçoit la demande. Red Hat OpenShift Service Mesh prend également en charge les modèles suivants, que vous pouvez spécifier dans les règles de destination pour les requêtes vers un service ou un sous-ensemble de services particulier.
- Aléatoire : Les demandes sont transmises de manière aléatoire aux instances du pool.
- Pondéré : Les demandes sont transmises aux instances du pool en fonction d'un pourcentage spécifique.
- Moins de demandes : Les demandes sont transmises aux instances ayant le moins de demandes.
Exemple de règle de destination
L'exemple de règle de destination suivant configure trois sous-ensembles différents pour le service de destination my-svc
, avec des politiques d'équilibrage de charge différentes :
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: my-svc trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN - name: v3 labels: version: v3
Ce guide fait référence à l'application Bookinfo pour fournir des exemples de routage dans une application d'exemple. Installez l'application Bookinfo pour découvrir comment fonctionnent ces exemples de routage.
2.7.8. Tutoriel de routage de Bookinfo
L'exemple d'application Service Mesh Bookinfo se compose de quatre microservices distincts, chacun ayant plusieurs versions. Après l'installation de l'exemple d'application Bookinfo, trois versions différentes du microservice reviews
s'exécutent simultanément.
Lorsque vous accédez à la page de l'application Bookinfo /product
dans un navigateur et que vous la rafraîchissez plusieurs fois, il arrive que la critique de livre contienne des étoiles et d'autres fois non. Sans version de service explicite par défaut, Service Mesh achemine les requêtes vers toutes les versions disponibles, l'une après l'autre.
Ce tutoriel vous aide à appliquer des règles qui acheminent tout le trafic vers v1
(version 1) des microservices. Par la suite, vous pourrez appliquer une règle pour acheminer le trafic en fonction de la valeur d'un en-tête de requête HTTP.
Prérequis :
- Déployez l'application d'exemple Bookinfo pour travailler avec les exemples suivants.
2.7.8.1. Application d'un service virtuel
Dans la procédure suivante, le service virtuel achemine tout le trafic vers v1
de chaque microservice en appliquant des services virtuels qui définissent la version par défaut des microservices.
Procédure
Appliquer les services virtuels.
$ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/info/networking/virtual-service-all-v1.yaml
Pour vérifier que vous avez appliqué les services virtuels, affichez les itinéraires définis à l'aide de la commande suivante :
$ oc get virtualservices -o yaml
Cette commande renvoie une ressource de
kind: VirtualService
au format YAML.
Vous avez configuré Service Mesh pour router vers la version v1
des microservices Bookinfo, y compris le service reviews
version 1.
2.7.8.2. Test de la nouvelle configuration de l'itinéraire
Testez la nouvelle configuration en actualisant le site /productpage
de l'application Bookinfo.
Procédure
Définissez la valeur du paramètre
GATEWAY_URL
. Vous pouvez utiliser cette variable pour trouver l'URL de votre page produit Bookinfo ultérieurement. Dans cet exemple, istio-system est le nom du projet de plan de contrôle.export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
Exécutez la commande suivante pour récupérer l'URL de la page produit.
echo "http://$GATEWAY_URL/productpage"
- Ouvrez le site Bookinfo dans votre navigateur.
La partie de la page consacrée aux avis s'affiche sans étoiles, quel que soit le nombre d'actualisations. Cela est dû au fait que vous avez configuré Service Mesh pour acheminer tout le trafic du service de commentaires vers la version reviews:v1
et que cette version du service n'accède pas au service de classement par étoiles.
Votre maillage de services achemine désormais le trafic vers une version d'un service.
2.7.8.3. Itinéraire basé sur l'identité de l'utilisateur
Modifiez la configuration de l'itinéraire de manière à ce que tout le trafic provenant d'un utilisateur spécifique soit acheminé vers une version de service spécifique. Dans ce cas, tout le trafic provenant d'un utilisateur nommé jason
sera acheminé vers le service reviews:v2
.
Service Mesh n'a pas de compréhension spéciale et intégrée de l'identité de l'utilisateur. Cet exemple est rendu possible par le fait que le service productpage
ajoute un en-tête personnalisé end-user
à toutes les demandes HTTP sortantes adressées au service de révision.
Procédure
Exécutez la commande suivante pour activer le routage basé sur l'utilisateur dans l'application d'exemple Bookinfo.
$ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/info/networking/virtual-service-reviews-test-v2.yaml
Exécutez la commande suivante pour confirmer la création de la règle. Cette commande renvoie toutes les ressources de
kind: VirtualService
au format YAML.$ oc get virtualservice reviews -o yaml
-
Sur le site
/productpage
de l'application Bookinfo, connectez-vous en tant qu'utilisateurjason
sans mot de passe. - Actualiser le navigateur. Les étoiles apparaissent à côté de chaque avis.
-
Connectez-vous en tant qu'autre utilisateur (choisissez le nom que vous voulez). Actualisez le navigateur. Les étoiles ont disparu. Le trafic est maintenant acheminé vers
reviews:v1
pour tous les utilisateurs sauf Jason.
Vous avez configuré avec succès l'application d'exemple Bookinfo pour acheminer le trafic en fonction de l'identité de l'utilisateur.
2.7.9. Ressources supplémentaires
Pour plus d'informations sur la configuration d'une politique de wildcard OpenShift Container Platform, voir Utiliser des routes wildcard.