4 votes

Comment gérer les changements de rupture dans un Service Mesh ?

Je construis un exemple d'application microservice avec Kubernetes afin de découvrir les meilleures pratiques et certains modèles pour de futurs projets. J'utilise Istio comme maillage de services pour gérer le trafic est-ouest et j'ai une compréhension de base des concepts (VirtualServices, DestinationRules, ...). Le maillage de services me permet de pousser facilement de nouvelles versions d'un microservice et de rediriger le trafic vers la nouvelle instance (en utilisant par exemple la distribution pondérée). Lorsque l'on a à l'esprit le versionnage sémantique, cela fonctionne très bien pour les applications suivantes Patch y Minor les mises à jour, car elles n'ont, en théorie, pas modifié le contrat existant et peuvent donc remplacer le service existant. Maintenant, je me demande comment traiter correctement les changements de service, donc une Major mise à jour de la version.

Il est difficile de trouver des informations à ce sujet, mais avec le peu d'informations que j'ai obtenues, je pense maintenant à deux approches :

  1. Chaque version majeure d'un service (par ex. user-service ) reçoit son propre VirtualService de sorte que les clients puissent l'adresser correctement (par un nom de service différent, par ex. user-service-v1 ). Istio est ensuite utilisé pour acheminer correctement le trafic pour une version majeure (par ex. 1.* ) aux différents services disponibles (par ex. user-service v1.3.1 y user-service v1.4.0 ).

  2. J'en utilise un en général VirtualService pour un microservice spécifique (donc par ex. user-service ). Ce site VirtualService contient de nombreuses définitions de routage à utiliser, par exemple un en-tête envoyé par le client (par ex. x-major-version=1 ) pour faire correspondre la demande à une destination.

Dans l'ensemble, il n'y a pas trop de différence entre les deux méthodes. Le client doit évidemment préciser à quelle version majeure il veut parler, soit en définissant un en-tête, soit en résolvant un nom de service différent. Les méthodes décrites présentent-elles des limitations qui les rendent supérieures l'une à l'autre ? Ou existe-t-il d'autres options qui me manquent totalement ? Toute aide et tout conseil sont les bienvenus !

2voto

Jakub Points 5979

TLDR

Outre ce que j'ai mentionné dans les commentaires, après une vérification plus détaillée du sujet, je choisirais approche 2 avec un total de Service virtuel pour un microservice spécifique avec déploiement des canaris y miroir .

Approche 1

Comme mentionné dans documentation

Dans les situations où il n'est pas pratique de définir l'ensemble complet de règles ou de politiques de routage pour un hôte particulier dans une seule ressource VirtualService ou DestinationRule, il peut être préférable de spécifier de manière incrémentielle la configuration de l'hôte dans plusieurs ressources. Pilot fusionnera de telles règles de destination et fusionnera de tels services virtuels s'ils sont liés à une passerelle.

Ainsi, en théorie vous pourriez opter pour l'approche numéro 1, mais je dirais qu'il y a trop de configuration avec cela et qu'il y a une meilleure idée pour faire cela.

Disons que vous avez une ancienne application dont le nom est v1.3.1 et une nouvelle application avec le nom v1.4.0 Ainsi, un service virtuel approprié ressemblerait à ce qui suit.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-vervice1
spec:
  hosts:
  - '*'
  http:
  - name: "v1.3.1"
    route:
    - destination:
        host: service1.namespace.svc.cluster.local

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-service2
spec:
  hosts:
  - '*'
  http:
  - name: "v1.4.0"
    route:
    - destination:
        host: service2.namespace.svc.cluster.local

Approche 2

Sur pratiquer J'opterais pour l'approche numéro 2, par exemple vous pouvez créer 2 versions de votre application, dans l'exemple ci-dessous c'est old y new et ensuite configurer le service virtuel et les règles de destination pour celui-ci.

La question qui se pose ici est : pourquoi ? Parce que c'est plus facile à gérer, du moins pour moi, et qu'il est facile d'utiliser le déploiement canari et la mise en miroir ici, plus d'informations à ce sujet ci-dessous.

Disons que vous avez déployé une nouvelle application, vous ne voulez pas envoyer 1% du trafic entrant ici, en plus vous pouvez utiliser le miroir, ainsi chaque requête qui va vers l'ancien service sera reflétée vers le nouveau service à des fins de test.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: vs-vervice
spec:
  hosts:
  - '*'
  http:
  - name: "old"
    route:
    - destination:
        host: service.namespace.svc.cluster.local
        subset: v1
      weight: 99
    mirror:
      host: service.namespace.svc.cluster.local
      subset: v2
    mirror_percent: 100
  - name: "new"
    route:
    - destination:
        host: service.namespace.svc.cluster.local
        subset: v2
      weight: 1

---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: service.namespace.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1  <--- label on old pod
  - name: v2
    labels:
      version: v2  <--- label on new pod

Test d'une nouvelle application

Le client doit évidemment préciser à quelle version majeure il souhaite s'adresser, soit en définissant un en-tête, soit en résolvant un nom de service différent.

En fait, cela dépend de la configuration, si vous utilisez l'option ci-dessus avec l'option new y old alors c'est à cela que sert le déploiement canari, par exemple la distribution pondérée. Vous pouvez spécifier le pourcentage du trafic qui doit être envoyé à la nouvelle version de votre application. Bien sûr, vous pouvez spécifier des en-têtes ou des préfixes dans votre service virtuel afin que les utilisateurs puissent utiliser une version plus ancienne ou plus récente de votre application.

Déploiement de Canary

Comme indiqué aquí

L'un des avantages du projet Istio est qu'il fournit le contrôle nécessaire au déploiement de services canariens. L'idée derrière le déploiement canari (ou rollout) est d'introduire une nouvelle version d'un service en la testant d'abord en utilisant un petit pourcentage du trafic utilisateur, puis si tout va bien, d'augmenter, éventuellement progressivement par incréments, le pourcentage tout en supprimant l'ancienne version. Si quelque chose ne va pas en cours de route, on abandonne et on revient à la version précédente. Dans sa forme la plus simple, le trafic envoyé à la version canari est un pourcentage de demandes choisi au hasard, mais dans des schémas plus sophistiqués, il peut être basé sur la région, l'utilisateur ou d'autres propriétés de la demande.

En fonction de votre niveau d'expertise dans ce domaine, vous vous demanderez peut-être pourquoi la prise en charge du déploiement canari par Istio est même nécessaire, étant donné que des plateformes comme Kubernetes offrent déjà un moyen de procéder au déploiement de versions et au déploiement canari. Problème résolu, non ? Eh bien, pas exactement. Bien que cette méthode de déploiement fonctionne dans des cas simples, elle est très limitée, en particulier dans les environnements en nuage à grande échelle recevant beaucoup de trafic (et surtout des quantités variables), où l'autoscaling est nécessaire.

istio

Avec Istio, l'acheminement du trafic et le déploiement des répliques sont deux fonctions totalement indépendantes. Le nombre de pods mettant en œuvre les services est libre d'augmenter ou de diminuer en fonction de la charge de trafic, de manière totalement orthogonale au contrôle de l'acheminement du trafic de la version. Cela fait de la gestion d'une version canari en présence d'une mise à l'échelle automatique un problème beaucoup plus simple. Les autoscalers peuvent, en fait, répondre aux variations de charge résultant des changements de routage du trafic, mais ils fonctionnent néanmoins de manière indépendante et pas différemment que lorsque les charges changent pour d'autres raisons.

Les règles de routage d'Istio offrent également d'autres avantages importants ; vous pouvez facilement contrôler des pourcentages de trafic à grain fin (par exemple, acheminer 1 % du trafic sans avoir besoin de 100 pods) et vous pouvez contrôler le trafic en utilisant d'autres critères (par exemple, acheminer le trafic pour des utilisateurs spécifiques vers la version canari). Pour illustrer, regardons le déploiement du service helloworld et voyons à quel point le problème devient simple.

Il existe un exemple .

Miroir

La deuxième chose souvent utilisée pour tester une nouvelle version de l'application est la mise en miroir du trafic.

Comme indiqué aquí

Avec Istio, vous pouvez utiliser la mise en miroir du trafic pour dupliquer le trafic vers un autre service. Vous pouvez intégrer une règle de mise en miroir du trafic dans un pipeline de déploiement canari, ce qui vous permet d'analyser le comportement d'un service avant de lui envoyer du trafic en direct.

Si vous recherchez les meilleures pratiques, je vous recommande de commencer par ceci tutoriel sur medium, car c'est très bien expliqué ici.

Comment fonctionne le Traffic Mirroring

La mise en miroir du trafic fonctionne selon les étapes suivantes :

  • Vous déployez une nouvelle version de l'application et mettez en route le trafic trafic.

  • L'ancienne version répond aux demandes comme auparavant mais envoie également une copie asynchrone à la nouvelle version.

  • La nouvelle version traite le trafic mais ne répond pas à l'utilisateur.

  • L'équipe des opérations surveille la nouvelle version et signale tout problème à l'équipe de développement.

enter image description here

Comme l'application traite le trafic en direct, cela permet à l'équipe de découvrir des problèmes qu'elle ne trouverait généralement pas dans un environnement de pré-production. Vous pouvez utiliser des outils de surveillance, tels que Prometheus et Grafana, pour enregistrer et surveiller les résultats de vos tests.

De plus, il existe un exemple avec nginx qui montre parfaitement comment cela doit fonctionner.

Il convient de mentionner que si vous utilisez des API d'écriture, comme la commande ou le paiement, alors le trafic en miroir signifiera écrire plusieurs fois des API comme la commande. Ce sujet est décrit en détail aquí par Christian Posta.


Faites-moi savoir s'il y a quelque chose de plus dont vous voulez discuter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X