Évaluation de la consommation CPU pour Istio et Linkerd

Évaluation de la consommation CPU pour Istio et Linkerd

Introduction

Nous avons Shopify nous avons commencé à déployer Istio en tant que service mesh. En principe, tout va bien, sauf une chose : c'est cher.

Dans les benchmarks publiés pour Istio, il est dit :

Avec Istio 1.1, le proxy consomme environ 0,6 vCPU (cƓurs virtuels) pour 1000 requĂȘtes par seconde.

Pour la premiĂšre rĂ©gion du service mesh (avec 2 proxies de chaque cĂŽtĂ© de la connexion), nous aurons 1200 cƓurs juste pour les proxies, sur la base d'un million de requĂȘtes par seconde. Selon le calculateur de coĂ»ts de Google, cela revient Ă  environ 40 $/mois/cƓur pour la configuration n1-standard-64, c'est-Ă -dire que cette rĂ©gion nous coĂ»tera plus de 50 000 dollars par mois pour 1 million de requĂȘtes par seconde.

Ivan Sim (Ivan Sim) a comparĂ© visuellement les latences du service mesh l'annĂ©e derniĂšre et a promis la mĂȘme chose pour la mĂ©moire et le processeur, mais cela n'a pas fonctionnĂ© :

Apparemment, values-istio-test.yaml augmentera considĂ©rablement les demandes de CPU. Si j'ai bien calculĂ©, il faut environ 24 cƓurs de processeur pour le panneau de contrĂŽle et 0,5 CPU pour chaque proxy. Je n'en ai pas autant. Je rĂ©pĂ©terai les tests quand on me donnera plus de ressources.

Je voulais voir par moi-mĂȘme Ă  quel point les performances d'Istio ressemblent Ă  une autre service mesh open-source : Linkerd.

Installation du service mesh

Tout d'abord, j'ai installé dans le cluster SuperGloo:

$ supergloo init
installation de la version 0.3.12 de supergloo
utilisation de l'uri de chart https://storage.googleapis.com/supergloo-helm/charts/supergloo-0.3.12.tgz
configmap/sidecar-injection-resources créé
serviceaccount/supergloo créé
serviceaccount/discovery créé
serviceaccount/mesh-discovery créé
clusterrole.rbac.authorization.k8s.io/discovery créé
clusterrole.rbac.authorization.k8s.io/mesh-discovery créé
clusterrolebinding.rbac.authorization.k8s.io/supergloo-role-binding créé
clusterrolebinding.rbac.authorization.k8s.io/discovery-role-binding créé
clusterrolebinding.rbac.authorization.k8s.io/mesh-discovery-role-binding créé
deployment.extensions/supergloo créé
deployment.extensions/discovery créé
deployment.extensions/mesh-discovery créé
installation réussie !

J'ai utilisé SuperGloo parce qu'il simplifie considérablement le déploiement initial du service mesh. Je n'ai presque rien eu à faire. En production, nous n'utilisons pas SuperGloo, mais pour une tùche comme celle-ci, il est parfait. J'ai dû exécuter littéralement quelques commandes pour chaque service mesh. J'ai utilisé deux clusters pour l'isolation - un pour Istio et un pour Linkerd.

L'expĂ©rience a Ă©tĂ© menĂ©e sur Google Kubernetes Engine. J'ai utilisĂ© Kubernetes 1.12.7-gke.7 et un pool de nƓuds n1-standard-4 avec l'autoscaling des nƓuds (minimum 4, maximum 16).

Ensuite, j'ai installé les deux service meshes depuis la ligne de commande.

D'abord Linkerd :

$ supergloo install linkerd --name linkerd
+---------+--------------+---------+---------------------------+
| INSTALL |     TYPE     | STATUS  |          DETAILS          |
+---------+--------------+---------+---------------------------+
| linkerd | Linkerd Mesh | Pending | enabled: true             |
|         |              |         | version: stable-2.3.0     |
|         |              |         | namespace: linkerd        |
|         |              |         | mtls enabled: true        |
|         |              |         | auto inject enabled: true |
+---------+--------------+---------+---------------------------+

Ensuite Istio :

$ supergloo install istio --name istio --installation-namespace istio-system --mtls=true --auto-inject=true
+---------+------------+---------+---------------------------+
| INSTALL |    TYPE    | STATUS  |          DETAILS          |
+---------+------------+---------+---------------------------+
| istio   | Istio Mesh | Pending | enabled: true             |
|         |            |         | version: 1.0.6            |
|         |            |         | namespace: istio-system   |
|         |            |         | mtls enabled: true        |
|         |            |         | auto inject enabled: true |
|         |            |         | grafana enabled: true     |
|         |            |         | prometheus enabled: true  |
|         |            |         | jaeger enabled: true      |
+---------+------------+---------+---------------------------+

Le crash-loop a duré plusieurs minutes, puis les panneaux de contrÎle se sont stabilisés.

(Remarque : SuperGloo ne prend pour l'instant en charge que Istio 1.0.x. J'ai répété l'expérience avec Istio 1.1.3, mais je n'ai remarqué aucune différence significative.)

Configuration de l'injection automatique Istio

Pour qu'Istio installe le sidecar Envoy, nous utilisons un injecteur de sidecar — MutatingAdmissionWebhook. Nous n'en parlerons pas dans cet article. Je dirai seulement que c'est un contrîleur qui surveille l'accùs de tous les nouveaux pod et ajoute dynamiquement le sidecar ainsi que l'initContainer, qui est responsable des tñches iptables.

Nous chez Shopify avons écrit notre propre contrÎleur d'accÚs pour l'injection de sidecar, mais dans cette comparaison, j'ai pris le contrÎleur fourni avec Istio. Le contrÎleur par défaut injecte les sidecar lorsque le namespace a un label istio-injection: enabled:

$ kubectl label namespace irs-client-dev istio-injection=enabled
namespace/irs-client-dev labeled

$ kubectl label namespace irs-server-dev istio-injection=enabled
namespace/irs-server-dev labeled

Configuration de l'injection automatique Linkerd

Pour configurer l'injection de sidecar Linkerd, nous utilisons des annotations (je les ai ajoutées manuellement via kubectl edit):

metadata:
  annotations:
    linkerd.io/inject: enabled

$ k edit ns irs-server-dev 
namespace/irs-server-dev edited

$ k get ns irs-server-dev -o yaml
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    linkerd.io/inject: enabled
  name: irs-server-dev
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

Simulateur de tolérance aux pannes Istio

Nous avons développé un simulateur de tolérance aux pannes Istio pour expérimenter avec le trafic unique de Shopify. Nous avions besoin d'un outil capable de créer une topologie arbitraire représentant une partie spécifique du graphe de notre service avec une configuration dynamique pour modéliser des charges de travail spécifiques.

L'infrastructure de Shopify subit une forte pression pendant les ventes flash. Dans ce contexte, Shopify recommande aux vendeurs d'organiser plus souvent ce genre de ventes. De gros clients nous préviennent parfois d'une vente flash planifiée. D'autres la mettent en place de maniÚre inattendue à tout moment de la journée ou de la nuit.

Nous souhaitions que notre simulateur de tolérance aux pannes modélise des flux de travail correspondant à des topologies et charges de travail qui avaient précédemment provoqué des surcharges de l'infrastructure de Shopify. L'objectif principal de l'utilisation d'un service mesh est d'assurer la fiabilité et la tolérance aux pannes au niveau du réseau, et il est crucial que le service mesh gÚre efficacement les charges qui avaient autrefois perturbé le fonctionnement des services.

Au cƓur du simulateur de tolĂ©rance aux pannes se trouve un nƓud de travail qui agit comme un nƓud de service mesh. Ce nƓud de travail peut ĂȘtre configurĂ© statiquement au dĂ©marrage ou dynamiquement via une API REST. Nous utilisons la configuration dynamique des nƓuds de travail pour crĂ©er des flux de travail sous forme de tests de rĂ©gression.

Voici un exemple de ce processus :

  • Nous lançons 10 serveurs en tant que bar service qui renvoie une rĂ©ponse 200/OK en 100 ms.
  • Nous lançons 10 clients — chacun envoie 100 requĂȘtes par seconde Ă  bar.
  • Toutes les 10 secondes, nous retirons 1 serveur et surveillons les erreurs 5xx du cĂŽtĂ© client.

À la fin du processus, nous examinons les journaux et les mĂ©triques pour vĂ©rifier si le test a Ă©tĂ© rĂ©ussi. Cela nous permet d'analyser les performances de notre service mesh et de rĂ©aliser un test de rĂ©gression pour Ă©valuer nos hypothĂšses sur la tolĂ©rance aux pannes.

(Remarque : Nous envisageons d'ouvrir le code source du simulateur de tolĂ©rance aux pannes Istio, mais nous ne sommes pas encore prĂȘts Ă  le faire.)

Simulateur de tolérance aux pannes Istio pour le benchmarking de service mesh

Nous configurons plusieurs nƓuds de travail pour le simulateur :

  • irs-client-loadgen: 3 rĂ©pliques, chacune envoyant 100 requĂȘtes par seconde vers irs-client.
  • irs-client: 3 rĂ©pliques, qui reçoivent la requĂȘte, attendent 100 ms et redirigent la requĂȘte vers irs-server.
  • irs-server: 3 rĂ©pliques, qui retournent 200/OK en 100 ms.

Avec cette configuration, nous pouvons mesurer un flux de trafic stable entre 9 points de terminaison. Les sidecars Ă  irs-client-loadgen et irs-server reçoivent 100 requĂȘtes par seconde, et irs-client — 200 (entrantes et sortantes).

Nous suivons l'utilisation des ressources via DataDog, car nous n'avons pas de cluster Prometheus.

Résultats

Panneaux de contrĂŽle

Tout d'abord, nous avons examiné la consommation du CPU.

Évaluation de la consommation CPU pour Istio et Linkerd
Le tableau de bord Linkerd ~22 milliards

Évaluation de la consommation CPU pour Istio et Linkerd
Le tableau de bord Istio : ~750 milliards

Le tableau de bord Istio utilise environ 35 fois plus de ressources processeur, que Linkerd. Bien sĂ»r, tout est configurĂ© par dĂ©faut, et beaucoup de ressources processeur sont consommĂ©es par istio-telemetry (il peut ĂȘtre dĂ©sactivĂ© en renonçant Ă  certaines fonctionnalitĂ©s). MĂȘme sans ce composant, cela reste plus de 100 milliards, c'est-Ă -dire 4 fois plus, que Linkerd.

Proxy sidecar

Ensuite, nous avons vĂ©rifiĂ© l'utilisation du proxy. Il devrait y avoir une dĂ©pendance linĂ©aire par rapport au nombre de requĂȘtes, mais pour chaque sidecar, il y a certains frais gĂ©nĂ©raux qui influencent la courbe.

Évaluation de la consommation CPU pour Istio et Linkerd
Linkerd : ~100 milliards pour irs-client, ~50 milliards pour irs-client-loadgen

Les rĂ©sultats semblent logiques, car le proxy client reçoit deux fois plus de trafic que le proxy loadgen : pour chaque requĂȘte sortante de loadgen, il y a une requĂȘte entrante et sortante pour le client.

Évaluation de la consommation CPU pour Istio et Linkerd
Istio/Envoy : ~155 milliards pour irs-client, ~75 milliards pour irs-client-loadgen

Nous voyons des résultats similaires pour les sidecars d'Isto.

Mais dans l’ensemble, le proxy Istio/Envoy consomme environ 50% de ressources processeur en plus, que Linkerd.

Nous voyons le mĂȘme schĂ©ma du cĂŽtĂ© serveur :

Évaluation de la consommation CPU pour Istio et Linkerd
Linkerd : ~50 milliards pour irs-server

Évaluation de la consommation CPU pour Istio et Linkerd
Istio/Envoy : ~80 milliards pour irs-server

Du cÎté serveur, le sidecar Istio/Envoy consomme environ 60% de ressources processeur en plus, que Linkerd.

Conclusion

Le proxy Istio Envoy consomme plus de 50% de CPU que Linkerd, sur notre charge de travail simulée. Le tableau de bord Linkerd consomme beaucoup moins de ressources que l'Isto, surtout en ce qui concerne les composants de base.

Nous réfléchissons encore à la façon de réduire ces coûts. Si vous avez des idées, partagez-les !

Source : habr.com

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