Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Meilleures pratiques Kubernetes. Création de petits conteneurs
Meilleures pratiques Kubernetes. Organisation de Kubernetes avec des espaces de noms
Les développeurs de Xenoblade Chronicles: Definitive Edition dans le dernier numéro du magazine Weekly Famitsu.

Pour chaque ressource Kubernetes, il est possible de configurer deux types de demandes : Requests et Limits. La premiĂšre dĂ©crit les exigences minimales en matiĂšre de ressources libres sur le nƓud nĂ©cessaires pour exĂ©cuter un conteneur ou un pod, la seconde limite strictement les ressources accessibles au conteneur.

Lorsque Kubernetes planifie un pod, il est trĂšs important que les conteneurs disposent de ressources suffisantes pour fonctionner normalement. Si vous prĂ©voyez de dĂ©ployer une grande application sur un nƓud avec des ressources limitĂ©es, il est tout Ă  fait possible qu'elle ne fonctionne pas en raison d'un manque de mĂ©moire ou de puissance processeur sur le nƓud. Dans cet article, nous examinerons comment rĂ©soudre les problĂšmes de manque de puissance de calcul en utilisant des demandes de ressources et des limites.

Les demandes Requests et les limites Limits sont des mĂ©canismes que Kubernetes utilise pour gĂ©rer des ressources telles que le processeur et la mĂ©moire. Les Requests garantissent que le conteneur obtienne la ressource demandĂ©e. Si un conteneur demande une ressource, Kubernetes ne le planifiera que sur le nƓud capable de la fournir. Les limites Limits contrĂŽlent que les ressources demandĂ©es par le conteneur ne dĂ©passent jamais une certaine valeur.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Un conteneur peut accroĂźtre ses capacitĂ©s de calcul uniquement jusqu'Ă  une certaine limite, aprĂšs quoi il sera restreint. Voyons comment cela fonctionne. Il existe donc deux types de ressources : le processeur et la mĂ©moire. Le planificateur Kubernetes utilise des donnĂ©es concernant ces ressources pour dĂ©terminer oĂč exĂ©cuter vos pods. Une spĂ©cification typique des ressources pour un pod ressemble Ă  ceci.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Chaque conteneur dans un pod peut dĂ©finir ses propres demandes et limites, le tout de maniĂšre additive. Les ressources CPU sont spĂ©cifiĂ©es en milli-cores. Si votre conteneur nĂ©cessite deux cƓurs complets pour fonctionner, vous dĂ©finissez la valeur Ă  2000m. Si le conteneur a seulement besoin de la puissance d'un quart de cƓur, la valeur sera de 250m. Gardez Ă  l'esprit que si vous assignez une valeur de ressources CPU supĂ©rieure au nombre de cƓurs du nƓud le plus puissant, le lancement de votre pod ne sera pas planifiĂ© du tout. Une situation similaire se produira si vous avez un pod nĂ©cessitant quatre cƓurs, alors que le cluster Kubernetes ne se compose que de deux machines virtuelles principales.

À moins que votre application ne soit spĂ©cifiquement conçue pour tirer parti de plusieurs cƓurs (on pense Ă  des programmes tels que des calculs scientifiques complexes et des opĂ©rations sur des bases de donnĂ©es), la meilleure pratique consiste Ă  dĂ©finir les demandes de CPU Ă  1 ou moins, suivie du lancement d'un plus grand nombre de rĂ©pliques pour la scalabilitĂ©. Cette approche donnera au systĂšme plus de flexibilitĂ© et de fiabilitĂ©.

Quand il s'agit des limites de CPU, les choses deviennent plus intĂ©ressantes, car il est considĂ©rĂ© comme une ressource compressible. Si votre application commence Ă  atteindre la limite de puissance CPU, Kubernetes commencera Ă  ralentir votre conteneur en utilisant le throttling CPU — une rĂ©duction de la frĂ©quence du processeur. Cela signifie que le CPU sera artificiellement limitĂ©, offrant potentiellement Ă  l'application de moins bonnes performances, mais le processus ne sera pas arrĂȘtĂ© ou expulsĂ©.

Les ressources mĂ©moire sont dĂ©finies en octets. En gĂ©nĂ©ral, la valeur dans les paramĂštres est mesurĂ©e en mĂ©bibytes (MiB), mais vous pouvez dĂ©finir n'importe quelle valeur, des octets aux pĂ©taoctets. Ici, la mĂȘme situation se produit qu'avec le CPU — si vous demandez une quantitĂ© de mĂ©moire dĂ©passant la mĂ©moire disponible sur vos nƓuds, l'exĂ©cution de ce pod ne sera pas planifiĂ©e. Toutefois, contrairement aux ressources CPU, la mĂ©moire n'est pas compressible, car il n'y a aucun moyen de limiter son utilisation. Ainsi, l'exĂ©cution du conteneur sera arrĂȘtĂ©e dĂšs qu'il dĂ©passera la mĂ©moire qui lui a Ă©tĂ© allouĂ©e.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Il est important de se rappeler que vous ne pouvez pas configurer des demandes qui dĂ©passent la taille des ressources que vos nƓuds peuvent fournir. Les caractĂ©ristiques des ressources partagĂ©es pour les machines virtuelles GKE peuvent ĂȘtre trouvĂ©es dans les liens placĂ©s sous cette vidĂ©o.

Dans un monde idéal, les configurations de conteneurs par défaut seraient largement suffisantes pour que les flux de travail se déroulent sans accroc. Mais le monde réel n'est pas tel, les gens peuvent facilement oublier de configurer l'utilisation des ressources ou des hackers peuvent définir des demandes et des limites qui dépassent les capacités réelles de l'infrastructure. Pour éviter de telles scénarios, il est possible de configurer des quotas de ressources ResourceQuota et des plages de limites LimitRange.

AprĂšs la crĂ©ation des espaces de noms, ils peuvent ĂȘtre bloquĂ©s Ă  l'aide de quotas. Par exemple, si vous avez des espaces de noms prod et dev, vous pouvez utiliser un modĂšle oĂč les quotas de production sont totalement absents alors que les quotas de dĂ©veloppement sont trĂšs stricts. Cela permet Ă  prod, en cas de pic de trafic soudain, de prendre toutes les ressources disponibles, bloquant complĂštement dev.

Un quota de ressources pourrait ressembler Ă  ceci. Dans cet exemple, il y a 4 sections – c'est 4 lignes de code infĂ©rieures.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Examinons chacun d'eux. Requests.cpu représente le nombre maximal combiné de demandes de puissance processeur qui peuvent provenir de tous les conteneurs d'un espace de noms. Dans cet exemple, vous pouvez avoir 50 conteneurs avec des demandes de 10m, cinq conteneurs avec des demandes de 100m, ou simplement un conteneur avec une demande de 500m. Tant que le nombre total de requests.cpu de cet espace de noms reste inférieur à 500m, tout ira bien.

La mémoire demandée requests.memory représente la taille maximale combinée des demandes de mémoire que peuvent avoir tous les conteneurs dans un espace de noms. Comme dans le cas précédent, vous pouvez avoir 50 conteneurs de 2 MiB, cinq conteneurs de 20 MiB ou un seul conteneur de 100 MiB, tant que le nombre total de mémoire demandée dans l'espace de noms reste inférieur à 100 mebibytes.

Limits.cpu est la valeur maximale combinée de la puissance processeur que peuvent utiliser tous les conteneurs d'un espace de noms. On peut considérer cela comme la limite des demandes de puissance processeur.

Enfin, limits.memory correspond Ă  la quantitĂ© maximale de mĂ©moire gĂ©nĂ©rale pouvant ĂȘtre utilisĂ©e par tous les conteneurs dans un espace de noms. Ce seuil concerne les demandes de mĂ©moire globales.
Ainsi, par dĂ©faut, les conteneurs d'un cluster Kubernetes fonctionnent avec des ressources de calcul illimitĂ©es. GrĂące aux quotas de ressources, les administrateurs de cluster peuvent limiter la consommation et la crĂ©ation de ressources sur la base de l'espace de noms. Dans cet espace de noms, un pod ou conteneur peut consommer autant de puissance CPU et de mĂ©moire que dĂ©fini par le quota de ressources. Cependant, il existe des prĂ©occupations quant Ă  la possibilitĂ© qu'un seul pod ou conteneur monopolise toutes les ressources disponibles. Pour Ă©viter cela, il est utilisĂ© un seuil de plage de limitation – une politique d'allocation des ressources (pour les pods ou conteneurs) dans l'espace de noms.

La plage de limites fournit des contraintes qui peuvent :

  • assurer une utilisation minimale et maximale des ressources de calcul pour chaque pod ou conteneur dans l'espace de noms;
  • forcer l'utilisation minimale et maximale de l'espace de stockage Storage Request pour chaque PersistentVolumeClaim dans l'espace de noms;
  • obliger Ă  Ă©tablir un rapport entre la demande Request et la limite Limit pour une ressource dans l'espace de noms;
  • dĂ©finir des Requests/Limits par dĂ©faut pour les ressources de calcul dans l'espace de noms et les appliquer automatiquement aux conteneurs lors de l'exĂ©cution.

Ainsi, vous pouvez crĂ©er une plage de limites dans votre espace de noms. Contrairement aux quotas, qui s'appliquent Ă  l'ensemble de l'espace de noms, la plage de limites est utilisĂ©e pour des conteneurs individuels. Cela peut empĂȘcher les utilisateurs de crĂ©er des conteneurs trĂšs petits ou, Ă  l'inverse, gĂ©ants dans l'espace de noms. La plage de limites Limit Range peut ressembler Ă  ceci.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Comme dans le cas précédent, ici, nous pouvons distinguer 4 sections. Examinons chacune d'elles.
Dans la section default, des limites par défaut sont définies pour les conteneurs dans le pod. Si vous définissez ces valeurs dans la plage de limites, tous les conteneurs pour lesquels ces valeurs n'ont pas été explicitement définies seront régis par les valeurs par défaut.

La section de la requĂȘte par dĂ©faut defaultRequest configure les requĂȘtes par dĂ©faut pour les conteneurs dans le pod. Encore une fois, si vous dĂ©finissez ces valeurs dans la plage limite, tous les conteneurs pour lesquels ces paramĂštres ne sont pas explicitement dĂ©finis utiliseront par dĂ©faut ces valeurs.

La section max indique les limites maximales qui peuvent ĂȘtre dĂ©finies pour les conteneurs dans le pod. Les valeurs dans la section default et les limites pour le conteneur ne peuvent pas ĂȘtre fixĂ©es au-dessus de cette limite. Il est important de noter que si une valeur max est dĂ©finie et que la section default est absente, la valeur maximale devient la valeur par dĂ©faut.

La section min indique les demandes minimales qui peuvent ĂȘtre dĂ©finies pour les conteneurs dans le pod. En mĂȘme temps, les valeurs dans la section default et les demandes pour le conteneur ne peuvent pas ĂȘtre dĂ©finies en dessous de cette limite.

Encore une fois, il est important de noter que si cette valeur est dĂ©finie, et que la valeur default n’est pas, la valeur minimale devient la demande par dĂ©faut.

En fin de compte, ces demandes de ressources sont utilisĂ©es par le planificateur Kubernetes pour exĂ©cuter vos charges de travail. Afin que vous puissiez configurer correctement vos conteneurs, il est trĂšs important de comprendre comment cela fonctionne. Supposons que vous souhaitiez exĂ©cuter plusieurs modules dans votre cluster. En supposant que les spĂ©cifications du pod sont valides, l'ordonnancement de Kubernetes utilisera un Ă©quilibre cyclique pour choisir le nƓud sur lequel exĂ©cuter la charge de travail.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Kubernetes vĂ©rifiera si Node 1 dispose de suffisamment de ressources pour satisfaire les demandes des conteneurs du pod, et si ce n'est pas le cas, il passera au nƓud suivant. Si aucun des nƓuds du systĂšme n'est capable de rĂ©pondre aux demandes, les pods passeront Ă  l'Ă©tat d'attente Pending state. GrĂące Ă  des fonctions telles que l'autoscaling des nƓuds dans Google Kubernetes Engine, GKE peut automatiquement dĂ©tecter l'Ă©tat d'attente et crĂ©er quelques nƓuds supplĂ©mentaires.

Si par la suite il y a une capacitĂ© excĂ©dentaire des nƓuds, la fonction d'autoscaling rĂ©duira leur nombre pour vous faire Ă©conomiser de l'argent. VoilĂ  pourquoi Kubernetes planifie les pods en fonction des demandes. Cependant, la limite peut ĂȘtre supĂ©rieure aux demandes, et dans certains cas, un nƓud peut effectivement Ă©puiser ses ressources. Nous appelons cela un Ă©tat de sur-engagement overcommitment state.

Meilleures pratiques Kubernetes. Configuration des demandes et des limites de ressources

Comme je l'ai déjà dit, en ce qui concerne le processeur, Kubernetes commencera à limiter les pods. Chaque pod recevra autant qu'il a demandé, mais s'il n'atteint pas la limite, le throttling sera appliqué.

En ce qui concerne les ressources mémoire, Kubernetes doit prendre des décisions sur les pods à supprimer et ceux à conserver, tant que vous ne libérez pas de ressources systÚme, sinon tout le systÚme s'effondrera.

Imaginons un scĂ©nario oĂč vous avez une machine qui a atteint sa limite de mĂ©moire – que fera Kubernetes dans ce cas ?

Kubernetes recherche les pods qui utilisent plus de ressources qu'ils n'en ont demandĂ©. Ainsi, si vos conteneurs n'ont aucune demande, cela signifie qu'ils utilisent par dĂ©faut plus que ce qu'ils ont demandĂ©, simplement parce qu'ils n'ont rien demandĂ© du tout ! Ces conteneurs deviennent de principaux candidats Ă  l'arrĂȘt. Les suivants sont les conteneurs qui ont satisfait toutes leurs demandes mais qui sont toujours en dessous de la limite maximale.

Donc, si Kubernetes trouve plusieurs pods qui ont dĂ©passĂ© les paramĂštres de leurs demandes, il les triera par prioritĂ©, puis supprimera les modules de prioritĂ© la plus basse. Si tous les modules ont la mĂȘme prioritĂ©, Kubernetes arrĂȘtera ceux des pods qui ont dĂ©passĂ© leurs demandes plus que les autres pods.

Dans de trÚs rares cas, Kubernetes peut interrompre les pods qui restent dans les limites de leurs demandes. Cela peut se produire lorsque des composants critiques du systÚme, tels que l'agent Kubelet ou Docker, commencent à consommer plus de ressources que ce qui a été réservé pour eux.
Ainsi, à un stade précoce des petites entreprises, un cluster Kubernetes peut trÚs bien fonctionner sans définir de demandes de ressources et de limites, mais à mesure que vos équipes et projets commencent à grandir, vous risquez de rencontrer des problÚmes dans ce domaine. Ajouter des demandes et des limites à vos modules et espaces de noms nécessite trÚs peu d'efforts supplémentaires et peut vous éviter de nombreux tracas.

Meilleures pratiques Kubernetes. ArrĂȘt correct Terminate

Lire la vidéo

Un peu de publicitĂ© 🙂

Merci de rester avec nous. Aimez-vous nos articles ? Voulez-vous voir plus de contenu intĂ©ressant ? Soutenez-nous en passants une commande ou en nous recommandant Ă  des amis, VPS cloud pour dĂ©veloppeurs Ă  partir de 4,99 $, un Ă©quivalent unique des serveurs d'entrĂ©e de gamme, conçu pour vous : Toute la vĂ©ritĂ© sur le VPS (KVM) E5-2697 v3 (6 cƓurs) 10 Go DDR4 480 Go SSD 1 Gbps Ă  partir de 19 $ ou comment bien diviser un serveur ? (options disponibles avec RAID1 et RAID10, jusqu'Ă  24 cƓurs et jusqu'Ă  40 Go DDR4).

Dell R730xd deux fois moins cher dans le data center Equinix Tier IV Ă  Amsterdam ? Uniquement chez nous 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64Go DDR4 4x960Go SSD 1Gbps 100 To Ă  partir de 199 $ aux Pays-Bas ! Dell R420 — 2x E5-2430 2.2GHz 6C 128Go DDR3 2x960Go SSD 1Gbps 100To — Ă  partir de 99 $ ! Lisez sur Comment construire une infrastructure de classe entreprise avec des serveurs Dell R730xd E5-2650 v4 coĂ»tant 9000 euros pour des clopinettes ?

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