Istio & Service Mesh – Contrôlez et tunez les flux entre vos micro services

Adapter votre projet existant pour être géré par Istio en service mesh

Considérons un projet simple dans l’exemple qui suit. Un micro service exposant une API REST sur un port. Cette API peut être mise à l’échelle, être exposée en interne et en externe. Je mets de coté l’aspect sécurité pour l’instant, nous y reviendrons dans une section ultérieure.

Cette API expose entre autre un endpoint /hello répondant une chaine de caractère. Nous appellerons ce endpoint en fin de configuration pour vérifier que tout est correct.

Architecture standard pour exposer une API

Pour rappel, pour que Istio gère votre application, un sidecar Envoy doit être injecté. Le premier point à vérifier est comment Istio doit être configuré pour gérer le namespace en tant que service mesh, cela peut différer d’une distribution Kubernetes à une autre.

Différentes étapes sur différentes distributions Kubernetes

Avec Rancher par exemple, vous configurez l’injection sur un namespace et le sidecar est automatiquement ajouté.

L’option d’auto-injection du sidecar est disponible dans les paramètres du namespace

Avec Openshift, cela requiert deux étapes supplémentaires.

  • Configurer le namespace dans le composant « ServiceMeshMemberRoll » de l’opérateur RedHat Service Mesh au sein du namespace « istio-system »
  • Ajouter une annotation sur votre déploiement YAML pour demander l’injection du sidecar Envoy.
spec:
  replicas: 1 
  selector: 
    matchLabels: 
      app: workload1 
      version: 0.1 
  template: 
    metadata: 
      creationTimestamp: null 
      labels: 
        app: workload1 
        version: 0.1
      annotations: 
        sidecar.istio.io/inject: 'true' 

Les pods déployés doivent être identifiables facilement par des labels, à la fois pour la configuration de vos services via les attributs selector, mais aussi pour la visualisation de votre mesh. L’outil Kiali vous permet d’avoir une cartographie de votre service mesh et pour cela, il s’appuie sur deux labels :

  • app
  • version

Chaque déploiement de matière doit posséder ces deux attributs au minimum. Ils doivent être présent sur le Pod mais aussi le service associé pour le label « app ».

Si tout est bien configuré, vos pods devraient être re-déployés avec un nouveau conteneur nommé « istio-proxy » :

Le conteneur istio-proxy automatiquement ajouté à coté du conteneur applicatif nommé workload1

Vous pouvez également vérifier que l’application Kiali génère correctement le graphe de votre service mesh avec l’ensemble de vos applications actives. L’outil utilise le label « app » pour grouper les composants et le label « version » pour distinguer les différentes versions de votre application.

L’outil Kiali vous permet de visualiser votre mesh. Si vos applications figurent sur le graphe alors la configuration est complète.

Ajouter les trois briques de bases

Maintenant que votre projet fait partie d’un service mesh il reste à ajouter trois types d’objets apportés par Istio afin d’avoir la vision de l’interaction réseau entre un utilisateur et votre matière applicative.

Gateway, le point d’entrée depuis l’exterieur vers votre Service Mesh

Le premier élément de la chaine pour gérer un appel depuis l’extérieur est la Gateway. Kubernetes propose l’objet Ingress pour exposer des services internes au cluster vers l’extérieur. Istio propose le meme composant mais permettant l’exposition du service mesh à l’extérieur.

En prérequis, votre domaine devra pointer vers un node avec le NodePort utilisé par Istio pour l’entrée des flux (ou vers un Load Balancer qui redirigera vers le/les nodes et le port configuré) vers votre Service Mesh.
Pour les utilisateur d’OpenShift il vous faudra créer une route dans le namespace istio-system qui pointe vers le service istio-ingressgateway.

kind: Gateway
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: workshop-app-gateway
  namespace: workshop
spec:
  servers:
    - hosts:
        - myworkshop-app.abcdefab.net
      port:
        name: http
        number: 80
        protocol: HTTP
  selector:
    istio: ingressgateway

Le code ci dessus permet de définir une configuration de Gateway sur le service ingressgateway d’istio (via le selector) qui va écouter les appels dont le nom de domaine d’origine est « myworkshop-app.abcdefab.net« . Cette configuration ne s’occupe pas de diriger l’appel vers une quelconque matière applicative, simplement de déclarer un point d’entrée dans le service mesh.

Destination Rule, la configuration générale de votre service interne

Seconde brique à ajouter : la Destination Rule. Cet objet va permettre de définir un certain nombre de paramètre en fonction d’un nom d’hôte. Si le service Kubernetes déclaré pour contacter notre matière applicative s’appelle « workload1-service », l’objet Destination Rule va permettre de définir des règles qui seront exécutées dès lors qu’une connexion à « workload1-service » sera initiée.

Sur cet objet que nous verrons plus en détail dans une section ultérieure vous pourrez définir

  • La stratégie de LoadBalancing vers votre service
  • La configuration d’un Circuit Breaker pour protéger votre service
  • Le paramétrage du chiffrement des communications de votre service
  • La déclaration de sous ensemble de votre matière application, le plus courant étant le groupement par version
kind: DestinationRule
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: workload1-destination-rule
  namespace: workshop
spec:
  host: workload1-service
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
    - labels:
        version: v1
      name: v1

Sur cet exemple, l’objet « workload1-destination-rule » va concerner le service « workload1-service ». Nous déclarons que pour ce service, la stratégie de Load Banlancing doit être l’appel vers le pod le moins sollicité. Nous déclarons également qu’il existe un seul sous ensemble de pods nommé « v1 » dont le groupement se fera par le label « version » avec la valeur « v1 ».

Virtual Service, paramétrer les routes et le comportement de votre service

Le service virtuel va s’appuyer sur les deux éléments précédemment décrits pour vous permettre de personnaliser différents éléments de votre service kubernetes :

  • Règles de routages offrant la possibilité d’un Load Balancing manuel
  • Politique de retry
  • Timeout

D’autres elements sont disponibles sur les Virtual Service qui vous permettront de tester la résilience de votre chaine d’appel :

  • Injection de faute
  • Ajout d’un délais dans la réponse
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: workload1-virtual-service
  namespace: workshop
spec:
  hosts:
    - workload1-service
    - myworkshop-app.abcdefab.net
  gateways:
    - mesh
    - workshop-app-gateway
  http:
    - route:
        - destination:
            host: workload1-service
            subset: v1

La configuration ci dessus permet de déclarer un service virtual service permettant :

  • De traiter les appels à destination « workload1-service » ou « myworkshop-app.abcdefab.net » selon si l’appel est interne ou externe
  • Depuis la gateway interne « mesh » gérée de base par Istio ou depuis la gateway créée par nous même « workshop-app-gateway » qui écoute les appels vers « myworkshop-app.abcdefab.net »
  • De connecter ces appels au service voulu par une « route » par defaut
    • La destination sera « workload1-service »
    • Sur les pods du sous ensemble « v1 » défini dans l’objet Destination Rule
Après adaptation, les briques Istio complètent le service Kubernetes et remplacent l’Ingress de base avec un objet Gateway spécifique. Chaque pod possède un proxy gérant les appels

Votre projet devrait maintenant être prêt. Vous pouvez vérifier qu’en faisant un appel depuis l’extérieur vers votre service, le graphique de l’application Kiali vous permet de visualiser les flux. De même via un autre pod déployé dans un namespace différent, l’appel est bien tracé.

Animation de trafic dans Kiali sur une application gérée par Istio
Appel depuis l’extérieur, pris en charge par la Gateway Istio créée plus haut
Appel interne au cluster, pris en charge par la Gateway interne « Mesh » par défaut d’Istio,
Print Friendly, PDF & Email

Une réponse sur “Istio & Service Mesh – Contrôlez et tunez les flux entre vos micro services”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.