Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux

Les vacances sont terminées et nous sommes de retour avec notre deuxiÚme article de la série Istio Service Mesh.

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux

Le sujet d’aujourd’hui est le disjoncteur, qui traduit en gĂ©nie Ă©lectrique russe signifie « disjoncteur », dans le langage courant – « disjoncteur ». Seulement dans Istio, cette machine ne dĂ©connecte pas un circuit en court-circuit ou surchargĂ©, mais des conteneurs dĂ©fectueux.

Comment cela devrait fonctionner idéalement

Lorsque les microservices sont gĂ©rĂ©s par Kubernetes, par exemple au sein de la plateforme OpenShift, ils Ă©voluent automatiquement en fonction de la charge. Étant donnĂ© que les microservices s'exĂ©cutent dans des pods, il peut y avoir plusieurs instances d'un microservice conteneurisĂ© sur un point de terminaison, et Kubernetes acheminera les requĂȘtes et Ă©quilibrera la charge entre elles. Et – idĂ©alement – ​​tout cela devrait fonctionner parfaitement.

Nous rappelons que les microservices sont petits et Ă©phĂ©mĂšres. L’éphĂ©mĂšre, qui signifie ici la facilitĂ© d’apparaĂźtre et de disparaĂźtre, est souvent sous-estimĂ©e. La naissance et la mort d'une autre instance d'un microservice dans un pod sont des choses tout Ă  fait attendues, OpenShift et Kubernetes gĂšrent cela bien, et tout fonctionne trĂšs bien - mais encore une fois en thĂ©orie.

Comment ça marche vraiment

Imaginez maintenant qu'une instance spĂ©cifique d'un microservice, c'est-Ă -dire un conteneur, soit devenue inutilisable : soit elle ne rĂ©pond pas (erreur 503), soit, ce qui est plus dĂ©sagrĂ©able, elle rĂ©pond, mais trop lentement. En d’autres termes, il devient problĂ©matique ou ne rĂ©pond pas aux demandes, mais il n’est pas automatiquement supprimĂ© du pool. Que faut-il faire dans ce cas ? RĂ©essayer ? Dois-je le supprimer du schĂ©ma de routage ? Et que signifie « trop lent Â» : combien y en a-t-il en nombre et qui les dĂ©termine ? Peut-ĂȘtre juste faire une pause et rĂ©essayer plus tard ? Si oui, combien de temps plus tard ?

Qu'est-ce que l'éjection de pool dans Istio

Et ici, Istio vient Ă  la rescousse avec ses machines de protection par disjoncteur, qui suppriment temporairement les conteneurs dĂ©fectueux du pool de ressources de routage et d'Ă©quilibrage de charge, en mettant en Ɠuvre la procĂ©dure d'Ă©jection du pool.

À l'aide d'une stratĂ©gie de dĂ©tection des valeurs aberrantes, Istio dĂ©tecte les modules de courbe qui ne sont pas alignĂ©s et les supprime du pool de ressources pendant une durĂ©e spĂ©cifiĂ©e, appelĂ©e fenĂȘtre de veille.

Pour montrer comment cela fonctionne dans Kubernetes sur la plateforme OpenShift, commençons par une capture d'Ă©cran de microservices fonctionnant normalement Ă  partir de l'exemple du rĂ©fĂ©rentiel DĂ©mos des dĂ©veloppeurs Red Hat. Ici, nous avons deux pods, v1 et v2, chacun exĂ©cutant un conteneur. Lorsque les rĂšgles de routage Istio ne sont pas utilisĂ©es, Kubernetes utilise par dĂ©faut un routage circulaire Ă©quilibrĂ© :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux

Se préparer à un crash

Avant d'effectuer Pool Ejection, vous devez crĂ©er une rĂšgle de routage Istio. Disons que nous souhaitons rĂ©partir les requĂȘtes entre les pods dans un rapport 50/50. De plus, nous augmenterons le nombre de conteneurs v2 de un Ă  deux, comme ceci :

oc scale deployment recommendation-v2 --replicas=2 -n tutorial

Nous définissons maintenant une rÚgle de routage afin que le trafic soit réparti entre les pods dans un rapport 50/50.

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
Voici Ă  quoi ressemble le rĂ©sultat de cette rĂšgle :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
On peut trouver à redire au fait que cet écran n'est pas 50/50, mais 14:9, mais avec le temps, la situation s'améliorera.

Faire un bug

DĂ©sactivons maintenant l'un des deux conteneurs v2 afin d'avoir un conteneur v1 sain, un conteneur v2 sain et un conteneur v2 dĂ©fectueux :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux

Réparer le problÚme

Nous avons donc un conteneur dĂ©fectueux et il est temps de procĂ©der Ă  l'Ă©jection de la piscine. À l'aide d'une configuration trĂšs simple, nous exclurons ce conteneur dĂ©faillant de tout schĂ©ma de routage pendant 15 secondes dans l'espoir qu'il reviendra Ă  un Ă©tat sain (soit redĂ©marrage, soit restauration des performances). Voici Ă  quoi ressemble cette configuration et les rĂ©sultats de son travail :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
Comme vous pouvez le constater, le conteneur v2 dĂ©faillant n'est plus utilisĂ© pour le routage des requĂȘtes car il a Ă©tĂ© supprimĂ© du pool. Mais aprĂšs 15 secondes, il reviendra automatiquement Ă  la piscine. En fait, nous venons de montrer comment fonctionne Pool Ejection.

Commençons par construire l'architecture

Pool Ejection, combinĂ© aux capacitĂ©s de surveillance d'Istio, vous permet de commencer Ă  crĂ©er un cadre de remplacement automatique des conteneurs dĂ©fectueux afin de rĂ©duire, voire d'Ă©liminer, les temps d'arrĂȘt et les pannes.
 
La NASA a une devise forte - L'Ă©chec n'est pas une option, dont l'auteur est considĂ©rĂ© comme le directeur de vol GĂšne Kranz. Cela peut ĂȘtre traduit en russe par « L’échec n’est pas une option », et le sens ici est que tout peut fonctionner si vous avez suffisamment de volontĂ©. Cependant, dans la vraie vie, les Ă©checs ne surviennent pas par hasard, ils sont inĂ©vitables, partout et en tout. Et comment les gĂ©rer dans le cas des microservices ? À notre avis, il vaut mieux s'appuyer non pas sur la volontĂ©, mais sur les capacitĂ©s des conteneurs, Kubernetes, Red Hat OpenShiftEt Istio.

Istio, comme nous l'Ă©crivions plus haut, met en Ɠuvre le concept de disjoncteurs, qui a fait ses preuves dans le monde physique. Et tout comme un disjoncteur Ă©lectrique coupe une section problĂ©matique d'un circuit, le logiciel Circuit Breaker d'Istio ouvre la connexion entre un flux de requĂȘtes et un conteneur de problĂšmes lorsque quelque chose ne va pas avec le point de terminaison, par exemple lorsque le serveur tombe en panne ou commence Ă  fonctionner. ralentir.

De plus, dans le second cas, les problÚmes ne font que s'aggraver, car les freins d'un conteneur non seulement provoquent une cascade de retards dans les services qui y accÚdent et, par conséquent, réduisent les performances du systÚme dans son ensemble, mais génÚrent également des demandes adressées à un service déjà lent, ce qui ne fait qu'aggraver la situation .

Disjoncteur en théorie

Circuit Breaker est un proxy qui contrĂŽle le flux de requĂȘtes vers un point de terminaison. Lorsque ce point cesse de fonctionner ou, selon les paramĂštres spĂ©cifiĂ©s, commence Ă  ralentir, le proxy rompt la connexion avec le conteneur. Le trafic est ensuite redirigĂ© vers d’autres conteneurs, simplement en raison de l’équilibrage de charge. La connexion reste ouverte pendant une fenĂȘtre de veille donnĂ©e, disons deux minutes, puis est considĂ©rĂ©e comme semi-ouverte. Une tentative d'envoi de la requĂȘte suivante dĂ©termine l'Ă©tat ultĂ©rieur de la connexion. Si tout va bien avec le service, la connexion revient en Ă©tat de fonctionnement et se ferme Ă  nouveau. Si le problĂšme persiste avec le service, la connexion est dĂ©connectĂ©e et la fenĂȘtre de veille est rĂ©activĂ©e. Voici Ă  quoi ressemble un diagramme d'Ă©tat simplifiĂ© d'un disjoncteur :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
Il est important de noter ici que tout cela se produit au niveau, pour ainsi dire, de l'architecture du systÚme. Ainsi, à un moment donné, vous devrez apprendre à vos applications à fonctionner avec Circuit Breaker, par exemple en fournissant une valeur par défaut en réponse ou, si possible, en ignorant l'existence du service. Un modÚle de cloison est utilisé pour cela, mais cela dépasse le cadre de cet article.

Disjoncteur en pratique

Par exemple, nous exécuterons deux versions de notre microservice de recommandation sur OpenShift. La version 1 fonctionnera correctement, mais dans la v2, nous intégrerons un délai pour simuler les ralentissements sur le serveur. Pour visualiser les résultats, utilisez l'outil siÚge:

siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
Tout semble fonctionner, mais Ă  quel prix ? À premiĂšre vue, nous avons une disponibilitĂ© de 100 %, mais y regardez de plus prĂšs : la durĂ©e maximale de la transaction peut atteindre 12 secondes. Il s’agit clairement d’un goulot d’étranglement qui doit ĂȘtre Ă©largi.

Pour ce faire, nous utiliserons Istio pour Ă©liminer les appels aux conteneurs lents. Voici Ă  quoi ressemble la configuration correspondante en utilisant Circuit Breaker :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux
La derniĂšre ligne avec le paramĂštre httpMaxRequestsPerConnection signale que la connexion avec doit ĂȘtre dĂ©connectĂ©e lorsque l'on tente de crĂ©er une autre - une deuxiĂšme - connexion en plus de celle existante. Étant donnĂ© que notre conteneur simule un service lent, de telles situations se produiront pĂ©riodiquement, puis Istio renverra une erreur 503, mais voici ce que Siege affichera :

Istio Circuit Breaker : dĂ©sactivation des conteneurs dĂ©fectueux

OK, nous avons le disjoncteur, quelle est la prochaine Ă©tape ?

Nous avons donc implĂ©mentĂ© l'arrĂȘt automatique sans toucher du tout au code source des services eux-mĂȘmes. À l'aide du disjoncteur et de la procĂ©dure d'Ă©jection de pool dĂ©crite ci-dessus, nous pouvons retirer les conteneurs de frein du pool de ressources jusqu'Ă  ce qu'ils reviennent Ă  la normale et vĂ©rifier leur Ă©tat Ă  une frĂ©quence spĂ©cifiĂ©e - dans notre exemple, il s'agit de deux minutes (paramĂštre sleepWindow).

Notez que la capacité d'une application à répondre à une erreur 503 est toujours définie au niveau du code source. Il existe de nombreuses stratégies pour utiliser le disjoncteur, selon la situation.

Dans le prochain article : Nous parlerons du traçage et de la surveillance déjà intégrés ou facilement ajoutés à Istio, ainsi que de la maniÚre d'introduire intentionnellement des erreurs dans le systÚme.

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster