Rechercher

1.14. Gérer le trafic dans votre maillage de services

download PDF

En utilisant Red Hat OpenShift Service Mesh, vous pouvez contrôler le flux de trafic et les appels API entre les services. 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. Vous pouvez gérer 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.

1.14.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.

1.14.1.1. Activation de l'injection de passerelle

Les configurations de passerelles s'appliquent aux proxys Envoy autonomes s'exécutant à la périphérie du maillage, plutôt qu'aux proxys Envoy sidecar s'exécutant aux côtés de vos charges de travail de service. Les passerelles étant des proxies Envoy, vous pouvez configurer Service Mesh pour injecter automatiquement des passerelles, de la même manière que vous pouvez injecter des sidecars.

En utilisant l'injection automatique pour les passerelles, vous pouvez déployer et gérer les passerelles indépendamment de la ressource ServiceMeshControlPlane et gérer les passerelles avec vos applications utilisateur. L'utilisation de l'injection automatique pour les déploiements de passerelles donne aux développeurs un contrôle total sur le déploiement de la passerelle tout en simplifiant les opérations. Lorsqu'une nouvelle mise à niveau est disponible ou qu'une configuration a changé, vous redémarrez les pods de passerelle pour les mettre à jour. De cette manière, le fonctionnement d'un déploiement de passerelle est identique à celui des sidecars.

Note

L'injection est désactivée par défaut pour l'espace de noms ServiceMeshControlPlane, par exemple l'espace de noms istio-system. La meilleure pratique en matière de sécurité consiste à déployer les passerelles dans un espace de noms différent de celui du plan de contrôle.

1.14.1.2. Déploiement de l'injection automatique de passerelle

Lors du déploiement d'une passerelle, vous devez accepter l'injection en ajoutant une étiquette d'injection ou une annotation à l'objet passerelle deployment. L'exemple suivant déploie une passerelle.

Conditions préalables

  • L'espace de noms doit être membre du maillage en le définissant dans le site ServiceMeshMemberRoll ou en créant une ressource ServiceMeshMember.

Procédure

  1. Définissez une étiquette unique pour la passerelle d'entrée Istio. Ce paramètre est nécessaire pour que la passerelle puisse sélectionner la charge de travail. Cet exemple utilise ingressgateway comme nom de la passerelle.

    apiVersion: v1
    kind: Service
    metadata:
      name: istio-ingressgateway
      namespace: istio-ingress
    spec:
      type: ClusterIP
      selector:
        istio: ingressgateway
      ports:
      - name: http
        port: 80
        targetPort: 8080
      - name: https
        port: 443
        targetPort: 8443
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway
      namespace: istio-ingress
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      template:
        metadata:
          annotations:
            inject.istio.io/templates: gateway
          labels:
            istio: ingressgateway
            sidecar.istio.io/inject: "true" 1
        spec:
          containers:
          - name: istio-proxy
            image: auto 2
    1
    Activez l'injection de la passerelle en définissant le champ sidecar.istio.io/inject sur "true".
    2
    Définissez le champ image sur auto pour que l'image soit automatiquement mise à jour à chaque démarrage du pod.
  2. Configurer les rôles pour autoriser la lecture des informations d'identification pour TLS.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: istio-ingressgateway-sds
      namespace: istio-ingress
    rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: istio-ingressgateway-sds
      namespace: istio-ingress
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: istio-ingressgateway-sds
    subjects:
    - kind: ServiceAccount
      name: default
  3. Autoriser l'accès à la nouvelle passerelle depuis l'extérieur du cluster, ce qui est nécessaire lorsque spec.security.manageNetworkPolicy est défini sur true.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: gatewayingress
      namespace: istio-ingress
    spec:
      podSelector:
        matchLabels:
          istio: ingressgateway
      ingress:
        - {}
      policyTypes:
      - Ingress
  4. Dimensionner automatiquement le pod lorsque le trafic entrant augmente. Cet exemple définit les répliques minimales à 2 et les répliques maximales à 5. Il crée également une autre réplique lorsque l'utilisation atteint 80 %.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewayhpa
      namespace: istio-ingress
    spec:
      maxReplicas: 5
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      minReplicas: 2
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: istio-ingressgateway
  5. Indiquez le nombre minimum de modules qui doivent être en cours d'exécution sur le nœud. Cet exemple garantit qu'une réplique est en cours d'exécution si un module est redémarré sur un nouveau nœud.

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewaypdb
      namespace: istio-ingress
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: ingressgateway

1.14.1.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.

1.14.1.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.

1.14.1.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

  1. 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}')
  2. 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}')
  3. 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}')
  4. 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}')
Note

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}')
1.14.1.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

  1. 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}')
  2. 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}')
  3. 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}')

1.14.1.4. 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

  1. Créer une passerelle pour accepter le trafic.

    1. 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:
          - "*"

    2. Appliquer le fichier YAML.

      $ oc apply -f gateway.yaml
  2. Créer un objet VirtualService pour réécrire l'en-tête de l'hôte.

    1. 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

    2. Appliquer le fichier YAML.

      $ oc apply -f vs.yaml
  3. Vérifiez que la passerelle et le service virtuel ont été définis correctement.

    1. Définir l'URL de la passerelle.

      export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
    2. 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}')
    3. Tester une page qui a été explicitement exposée.

      curl -s -I "$GATEWAY_URL/productpage"

      Le résultat attendu est 200.

1.14.2. Comprendre les itinéraires automatiques

Les routes OpenShift pour les passerelles sont automatiquement gérées dans 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.

1.14.2.1. Routes avec 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 une passerelle d'hôte wildcard.

Pour plus d'informations, voir Utilisation d'itinéraires avec caractères génériques.

1.14.2.2. Création d'itinéraires de sous-domaines

L'exemple suivant crée une passerelle dans l'application d'exemple Bookinfo, qui crée des itinéraires de sous-domaine.

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

La ressource Gateway crée les routes OpenShift suivantes. Vous pouvez vérifier que les routes sont créées en utilisant la commande suivante. Dans cet exemple, istio-system est le nom du projet de plan de contrôle Service Mesh.

$ oc -n istio-system 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 vous supprimez la passerelle, Red Hat OpenShift Service Mesh supprime les itinéraires. Cependant, les routes que vous avez créées manuellement ne sont jamais modifiées par Red Hat OpenShift Service Mesh.

1.14.2.3. Etiquettes d'itinéraire et annotations

Parfois, des étiquettes ou des annotations spécifiques sont nécessaires dans une route OpenShift. Par exemple, certaines fonctionnalités avancées des routes OpenShift sont gérées à l'aide d'annotations spéciales. Voir "Annotations spécifiques aux routes" dans la section suivante "Ressources supplémentaires".

Pour ce cas et d'autres cas d'utilisation, Red Hat OpenShift Service Mesh copiera toutes les étiquettes et annotations présentes dans la ressource de passerelle Istio (à l'exception des annotations commençant par kubectl.kubernetes.io) dans la ressource de route OpenShift gérée.

Si vous avez besoin de labels ou d'annotations spécifiques dans les routes OpenShift créées par Service Mesh, créez-les dans la ressource Istio gateway et ils seront copiés dans les ressources OpenShift route gérées par Service Mesh.

Ressources supplémentaires

1.14.2.4. Désactivation de la création automatique d'itinéraires

Par défaut, la ressource ServiceMeshControlPlane synchronise automatiquement les ressources de la passerelle Istio avec les routes OpenShift. Désactiver la création automatique de routes vous donne plus de flexibilité pour contrôler les routes si vous avez un cas particulier ou si vous préférez contrôler les routes manuellement.

1.14.2.4.1. Désactivation de la création automatique d'itinéraires dans certains cas

Si vous souhaitez désactiver la gestion automatique des routes OpenShift pour une passerelle Istio spécifique, vous devez ajouter l'annotation maistra.io/manageRoute: false à la définition des métadonnées de la passerelle. Red Hat OpenShift Service Mesh ignorera les passerelles Istio avec cette annotation, tout en conservant la gestion automatique des autres passerelles Istio.

1.14.2.4.2. Désactivation de la création automatique d'itinéraires dans tous les cas

Vous pouvez désactiver la gestion automatique des routes OpenShift pour toutes les passerelles de votre maillage.

Désactivez l'intégration entre les passerelles Istio et les routes OpenShift en définissant le champ ServiceMeshControlPlane gateways.openshiftRoute.enabled sur false. Par exemple, voir l'extrait de ressource suivant.

apiVersion: maistra.io/v1alpha1
kind: ServiceMeshControlPlane
metadata:
  namespace: istio-system
spec:
  gateways:
    openshiftRoute:
      enabled: false

1.14.3. 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.
Note

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

1.14.4. 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.

1.14.4.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

  1. 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

  2. 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>

1.14.4.2. Référence de configuration du service virtuel

ParamètresDescription
spec:
  hosts:

Le champ hosts répertorie l'adresse de destination du service virtuel à laquelle les règles de routage s'appliquent. Il s'agit de l'adresse ou des adresses utilisées pour envoyer des requêtes au service. Le nom d'hôte du service virtuel peut être une adresse IP, un nom DNS ou un nom court qui se résout en un nom de domaine pleinement qualifié.

spec:
  http:
  - match:

La section http contient les règles de routage du service virtuel qui décrivent les conditions de correspondance et les actions pour le routage du trafic HTTP/1.1, HTTP2 et gRPC envoyé à la destination spécifiée dans le champ hosts. Une règle de routage se compose de la destination où vous voulez que le trafic aille et de toutes les conditions de correspondance spécifiées. La première règle de routage de l'exemple comporte une condition qui commence par le champ "match". Dans cet exemple, ce routage s'applique à toutes les demandes de l'utilisateur jason. Ajoutez les champs headers, end-user et exact pour sélectionner les demandes appropriées.

spec:
  http:
  - match:
    - destination:

Le champ destination dans la section route spécifie la destination réelle pour le trafic qui correspond à cette condition. Contrairement à l'hôte du service virtuel, l'hôte de la destination doit être une destination réelle qui existe dans le registre de service Red Hat OpenShift Service Mesh. Il peut s'agir d'un service mesh avec des proxies ou d'un service non mesh ajouté à l'aide d'une entrée de service. Dans cet exemple, le nom d'hôte est un nom de service Kubernetes :

1.14.5. 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

1.14.6. Comprendre les politiques de réseau

Red Hat OpenShift Service Mesh crée et gère automatiquement un certain nombre de ressources NetworkPolicies dans le plan de contrôle Service Mesh et les espaces de noms des applications. Cela permet de s'assurer que les applications et le plan de contrôle peuvent communiquer entre eux.

Par exemple, si vous avez configuré votre cluster OpenShift Container Platform pour utiliser le plugin SDN, Red Hat OpenShift Service Mesh crée une ressource NetworkPolicy dans chaque projet membre. Cela permet l'entrée de tous les pods dans le maillage à partir des autres membres du maillage et du plan de contrôle. Cela limite également l'entrée aux seuls projets membres. Si vous avez besoin de l'entrée de projets non membres, vous devez créer une ressource NetworkPolicy pour autoriser ce trafic. Si vous supprimez un espace de noms de Service Mesh, cette ressource NetworkPolicy est supprimée du projet.

1.14.6.1. Désactivation de la création automatique de NetworkPolicy

Si vous souhaitez désactiver la création et la gestion automatiques des ressources NetworkPolicy, par exemple pour appliquer les politiques de sécurité de l'entreprise ou pour permettre un accès direct aux pods dans le maillage, vous pouvez le faire. Vous pouvez modifier le site ServiceMeshControlPlane et remplacer spec.security.manageNetworkPolicy par false.

Note

Lorsque vous désactivez spec.security.manageNetworkPolicy, Red Hat OpenShift Service Mesh ne créera pas d'objets any NetworkPolicy . L'administrateur système est responsable de la gestion du réseau et de la résolution des problèmes que cela pourrait causer.

Conditions préalables

  • Red Hat OpenShift Service Mesh Operator version 2.1.1 ou supérieure installée.
  • ServiceMeshControlPlane mis à jour à la version 2.1 ou supérieure.

Procédure

  1. Dans la console web d'OpenShift Container Platform, cliquez sur Operators Installed Operators.
  2. Sélectionnez le projet dans lequel vous avez installé le plan de contrôle Service Mesh, par exemple istio-system, dans le menu Project.
  3. Cliquez sur l'opérateur Red Hat OpenShift Service Mesh. Dans la colonne Istio Service Mesh Control Plane, cliquez sur le nom de votre ServiceMeshControlPlane, par exemple basic-install.
  4. Sur la page Create ServiceMeshControlPlane Details, cliquez sur YAML pour modifier votre configuration.
  5. Définissez le champ ServiceMeshControlPlane spec.security.manageNetworkPolicy sur false, comme indiqué dans cet exemple.

    apiVersion: maistra.io/v2
    kind: ServiceMeshControlPlane
    spec:
      security:
          manageNetworkPolicy: false
  6. Cliquez sur Save.

1.14.7. Configuration des side-cars pour la gestion du trafic

Par défaut, Red Hat OpenShift Service Mesh configure chaque proxy Envoy pour accepter le trafic sur tous les ports de sa charge de travail associée, et pour atteindre chaque charge de travail dans le maillage lors de la transmission du trafic. Vous pouvez utiliser une configuration sidecar pour effectuer les opérations suivantes :

  • Affiner l'ensemble des ports et des protocoles acceptés par un proxy Envoy.
  • Limiter l'ensemble des services que le proxy Envoy peut atteindre.
Note

Pour optimiser les performances de votre maillage de services, envisagez de limiter les configurations de proxy Envoy.

Dans l'application d'exemple Bookinfo, configurez un Sidecar pour que tous les services puissent atteindre d'autres services fonctionnant dans le même espace de noms et le même plan de contrôle. Cette configuration Sidecar est nécessaire pour utiliser les fonctionnalités de politique et de télémétrie de Red Hat OpenShift Service Mesh.

Procédure

  1. Créez un fichier YAML à l'aide de l'exemple suivant pour spécifier que vous souhaitez qu'une configuration sidecar s'applique à toutes les charges de travail d'un espace de noms particulier. Sinon, choisissez des charges de travail spécifiques à l'aide d'une adresse workloadSelector.

    Exemple sidecar.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: Sidecar
    metadata:
      name: default
      namespace: info
    spec:
      egress:
      - hosts:
        - "./*"
        - "istio-system/*"

  2. Exécutez la commande suivante pour appliquer sidecar.yaml, où sidecar.yaml est le chemin d'accès au fichier.

    $ oc apply -f sidecar.yaml
  3. Exécutez la commande suivante pour vérifier que le sidecar a été créé avec succès.

    $ oc get sidecar

1.14.8. Tutoriel sur le routage

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.

1.14.8.1. 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.

1.14.8.2. 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

  1. Appliquer les services virtuels.

    $ oc apply -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/info/networking/virtual-service-all-v1.yaml
  2. 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.

1.14.8.3. Test de la nouvelle configuration de l'itinéraire

Testez la nouvelle configuration en actualisant le site /productpage de l'application Bookinfo.

Procédure

  1. 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}')
  2. Exécutez la commande suivante pour récupérer l'URL de la page produit.

    echo "http://$GATEWAY_URL/productpage"
  3. 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.

1.14.8.4. 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

  1. 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
  2. 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
  3. Sur le site /productpage de l'application Bookinfo, connectez-vous en tant qu'utilisateur jason sans mot de passe.
  4. Actualiser le navigateur. Les étoiles apparaissent à côté de chaque avis.
  5. 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.

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.