Meilleures pratiques Kubernetes. DĂ©finition de requĂȘtes et de limites de ressources

Meilleures pratiques Kubernetes. Création de petits conteneurs
Kubernetes Best Practices. Organisation Kubernetes avec l'
espace de noms Kubernetes Best Practices. Vérification de la viabilité de Kubernetes à l'aide des tests de disponibilité et de validité

Pour chaque ressource Kubernetes, vous pouvez configurer deux types d'exigences - Demandes et limites. Le premier dĂ©crit les exigences minimales pour la disponibilitĂ© des ressources de nƓuds libres nĂ©cessaires pour exĂ©cuter un conteneur ou un foyer, le second limite strictement les ressources disponibles pour le conteneur.

Lorsque Kubernetes prĂ©voit un pod, il est trĂšs important que les conteneurs disposent de suffisamment de ressources pour un fonctionnement normal. Si vous prĂ©voyez de dĂ©ployer une grande application sur un nƓud avec des ressources limitĂ©es, il est fort possible que cela ne fonctionne pas car le nƓud manque de mĂ©moire ou manque de puissance processeur. Dans cet article, nous verrons comment vous pouvez rĂ©soudre les problĂšmes de manque de capacitĂ© informatique Ă  l'aide de demandes de ressources et de restrictions.

Les demandes et les limites sont des mécanismes que Kubernetes utilise pour gérer des ressources telles que le processeur et la mémoire. Les demandes sont le résultat duquel le conteneur est garanti de recevoir la ressource demandée. Si un conteneur demande une ressource, Kubernetes la planifie uniquement sur l'hÎte qui peut la fournir. Limits limite le contrÎle que les ressources demandées par le conteneur ne dépasseront jamais une certaine valeur.



Un conteneur ne peut augmenter la puissance de calcul que dans une certaine limite, aprĂšs quoi il sera limitĂ©. Voyons voir comment ça fonctionne. Il existe donc deux types de ressources - processeur et mĂ©moire. Le planificateur Kubernetes utilise les donnĂ©es de ces ressources pour dĂ©terminer oĂč exĂ©cuter vos pods. Une spĂ©cification de ressource de foyer typique ressemble Ă  ceci.



Chaque conteneur dans le pod peut dĂ©finir ses propres requĂȘtes et restrictions, qui sont toutes additives. Les ressources du processeur sont dĂ©finies en millimĂštres. Si votre conteneur de lancement a besoin de deux cƓurs complets, vous dĂ©finissez la valeur sur 2000 m. Si le conteneur n'a besoin que de 1/4 du noyau, la valeur est de 250 m. Gardez Ă  l'esprit que si vous attribuez une valeur de ressource processeur supĂ©rieure au nombre de cƓurs du plus grand nƓud, le lancement de votre foyer ne sera pas du tout prĂ©vu. Une situation similaire se produira si vous avez un sous-systĂšme qui a besoin de quatre cƓurs et que le cluster Kubernetes ne comprend que deux machines virtuelles principales.

Sauf si votre application est spĂ©cifiquement conçue pour tirer parti de plusieurs cƓurs (avec des programmes tels que le calcul scientifique complexe et les opĂ©rations de base de donnĂ©es qui vous viennent Ă  l'esprit), il est prĂ©fĂ©rable de dĂ©finir les demandes de processeur Ă  1 ou moins, puis d'exĂ©cuter plus de rĂ©pliques pour Ă©volutivitĂ©. Une telle solution donnera au systĂšme une plus grande flexibilitĂ© et fiabilitĂ©.

En ce qui concerne les limitations du processeur, les choses deviennent plus intéressantes car elles sont considérées comme une ressource compressible. Si votre application commence à approcher la limite de capacité du processeur, Kubernetes commencera à ralentir votre conteneur à l'aide de la limitation du processeur, ce qui réduira la fréquence du processeur. Cela signifie que le processeur sera artificiellement limité, offrant à l'application des performances potentiellement moins bonnes, mais le processus ne sera pas interrompu ni transmis.

Les ressources mĂ©moire sont dĂ©finies en octets. Habituellement, la valeur dans les paramĂštres est mesurĂ©e en mĂ©gaoctets Mib, mais vous pouvez spĂ©cifier n'importe quelle valeur, des octets aux pĂ©taoctets. Ici, la situation est la mĂȘme qu'avec le CPU - si vous placez une demande pour une quantitĂ© de mĂ©moire dĂ©passant la quantitĂ© de mĂ©moire sur vos nƓuds, l'exĂ©cution de ce pod ne sera pas planifiĂ©e. Mais contrairement aux ressources processeur, la mĂ©moire n'est pas compressĂ©e, car il n'y a aucun moyen de limiter son utilisation. Par consĂ©quent, l'exĂ©cution du conteneur sera arrĂȘtĂ©e dĂšs qu'il dĂ©passera les limites de la mĂ©moire qui lui est allouĂ©e.



Il est important de se rappeler que vous ne pouvez pas configurer des demandes qui dépassent la taille des ressources que vos sites peuvent fournir. Les caractéristiques des ressources partagées pour les machines virtuelles GKE se trouvent sur les liens situés sous cette vidéo.

Dans un monde idĂ©al, les paramĂštres de conteneur par dĂ©faut suffiront pour que les flux de travail se dĂ©roulent sans problĂšme. Mais le monde rĂ©el n'est pas comme ça, les gens peuvent facilement oublier de configurer l'utilisation des ressources ou les pirates Ă©tabliront des demandes et des restrictions qui dĂ©passeront les capacitĂ©s rĂ©elles de l'infrastructure. Pour empĂȘcher ces scĂ©narios de se dĂ©velopper, vous pouvez configurer les quotas de ressources ResourceQuota et les plages de restriction LimitRange.

AprĂšs avoir crĂ©Ă© un espace de noms, vous pouvez les bloquer avec des quotas. Par exemple, si vous avez des espaces de noms prod et dev, un modĂšle est utilisĂ© dans lequel il n'y a aucun quota de production et les quotas de dĂ©veloppement sont trĂšs stricts. Cela permet Ă  prod en cas de forte augmentation du trafic de prendre toutes les ressources disponibles pour lui-mĂȘme, bloquant complĂštement le dĂ©veloppement.

Un quota de ressources peut ressembler Ă  ceci. Dans cet exemple, il y a 4 sections - ce sont les 4 derniĂšres lignes de code.



Regardons chacun d'eux. Requests.cpu est le nombre maximal de demandes d'alimentation de processeur combinĂ©es pouvant provenir de tous les conteneurs d'espace de noms. Dans cet exemple, vous pouvez avoir 50 conteneurs avec des demandes de 10 m chacun, cinq conteneurs avec des demandes de 100 m ou juste un conteneur avec une demande de 500 m. Tant que le nombre total de requĂȘtes.cpu de cet espace de noms est infĂ©rieur Ă  500 m, tout ira bien.

Mémoire demandée request.memory est la quantité maximale de demandes de mémoire combinées que tous les conteneurs de l'espace de noms peuvent avoir. Comme dans le cas précédent, vous pouvez avoir 50 conteneurs de 2 Mo chacun, cinq conteneurs de 20 Mo chacun ou un seul conteneur de 100 Mo jusqu'à ce que la quantité totale de mémoire demandée dans l'espace de noms soit inférieure à 100 mégaoctets.

Limits.cpu est la valeur de puissance combinée maximale du processeur que tous les conteneurs d'espace de noms peuvent utiliser. Nous pouvons supposer que c'est la limite des demandes d'alimentation du processeur.

Enfin, limits.memory est la quantité maximale de mémoire partagée que tous les conteneurs de l'espace de noms peuvent utiliser. Il s'agit d'une limitation du nombre total de demandes de mémoire.
Ainsi, par dĂ©faut, les conteneurs d'un cluster Kubernetes fonctionnent avec des ressources informatiques illimitĂ©es. À l'aide de quotas de ressources, les administrateurs de cluster peuvent limiter la consommation de ressources et leur crĂ©ation en fonction de l'espace de noms. Dans l'espace de noms, le module de pod ou le conteneur peut consommer autant de CPU et de mĂ©moire que le quota de ressources d'espace de noms dĂ©termine. Cependant, on craint qu'un sous-conteneur ou un conteneur ne monopolise toutes les ressources disponibles. Pour Ă©viter cette situation, la plage limite Plage Plage est utilisĂ©e - la politique de restriction de la distribution des ressources (pour les pods ou les conteneurs) dans l'espace de noms.

La plage de limites fournit des limitations qui peuvent:

  • ;
  • Starage Request PersistentVolumeClaim ;
  • Request Limit ;
  • Requests/Limits .

De cette façon, vous pouvez crĂ©er une plage limite dans votre espace de noms. Contrairement au quota qui s'applique Ă  l'ensemble de l'espace de noms, la plage de limites est utilisĂ©e pour les conteneurs individuels. Cela peut empĂȘcher les utilisateurs de crĂ©er de trĂšs petits conteneurs, ou vice versa, Ă  l'intĂ©rieur de l'espace de noms. La plage limite peut ressembler Ă  ceci.



Comme dans le cas prĂ©cĂ©dent, 4 sections peuvent ĂȘtre distinguĂ©es ici. Jetons un coup d'Ɠil Ă  chacun.
Dans la section par défaut, les restrictions par défaut sont définies pour le conteneur dans l'ùtre. Si vous spécifiez ces valeurs dans la plage limite, tous les conteneurs pour lesquels ces valeurs n'ont pas été définies explicitement seront guidés par les valeurs par défaut.

Dans la section de requĂȘte par dĂ©faut, defaultRequest, les requĂȘtes par dĂ©faut pour le conteneur dans l'Ăątre sont configurĂ©es. 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 ces valeurs par dĂ©faut.

La section max indique les restrictions maximales pouvant ĂȘtre dĂ©finies pour le conteneur dans l'Ăątre. Les valeurs de la section par dĂ©faut et les restrictions pour le conteneur ne peuvent pas ĂȘtre dĂ©finies au-dessus de cette limite. Il est important de noter que si max est dĂ©fini et que la section par dĂ©faut est absente, la valeur maximale devient la valeur par dĂ©faut.

La section min indique les requĂȘtes minimales qui peuvent ĂȘtre dĂ©finies pour le conteneur dans l'Ăątre. Dans le mĂȘme temps, les valeurs de la section par dĂ©faut 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, la valeur par dĂ©faut ne l'est pas, alors la valeur minimale devient la requĂȘte par dĂ©faut.

Par consĂ©quent, ces demandes de ressources sont utilisĂ©es par le planificateur Kubernetes pour exĂ©cuter vos charges de travail. Pour 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 de l'Ăątre sont valides, le programme Kubernetes utilisera l'Ă©quilibrage cyclique pour sĂ©lectionner le nƓud pour la charge de travail.



Kubernetes vĂ©rifiera si le nƓud Node 1 a suffisamment de ressources pour rĂ©pondre aux demandes de conteneur de 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 en mesure de satisfaire les demandes, les pods passeront Ă  l'Ă©tat En attente. Avec les fonctionnalitĂ©s du moteur Google Kubernetes telles que la mise Ă  l'Ă©chelle automatique des nƓuds, GKE peut dĂ©terminer automatiquement l'Ă©tat d'attente et crĂ©er d'autres nƓuds supplĂ©mentaires.

Si par la suite il y a une capacitĂ© excĂ©dentaire de nƓuds, la fonction de mise Ă  l'Ă©chelle automatique rĂ©duira leur nombre afin de vous faire Ă©conomiser de l'argent. C'est pourquoi Kubernetes prĂ©voit des pods basĂ©s sur des requĂȘtes. Cependant, la limite peut ĂȘtre supĂ©rieure aux demandes et, dans certains cas, le nƓud peut en fait manquer de ressources. Nous appelons cet Ă©tat un Ă©tat de surengagement.



Comme je l'ai dit, si nous parlons d'un processeur, Kubernetes commencera Ă  limiter les pods. Chaque pod recevra autant qu'il a demandĂ©, mais si en mĂȘme temps il n'atteint pas la limite, alors la limitation commencera Ă  s'appliquer.

En ce qui concerne les ressources de mémoire, ici Kubernetes est obligé de prendre des décisions sur les pods à supprimer et ceux à conserver jusqu'à ce que vous libériez les ressources systÚme, sinon le systÚme entier plantera.

Imaginons un scénario dans lequel vous avez une machine qui n'a plus de mémoire - comment Kubernetes fera-t-il cela?

Kubernetes recherchera des pods qui utilisent plus de ressources que demandĂ©. Donc, si vos conteneurs n'ont pas du tout de requĂȘtes, cela signifie que par dĂ©faut, ils utilisent plus que ce qu'ils ont demandĂ©, simplement parce qu'ils n'ont rien demandĂ© du tout! Ces conteneurs deviennent les principaux candidats Ă  l'arrĂȘt. Les prochains candidats sont des conteneurs qui ont satisfait toutes leurs demandes, mais qui restent en dessous de la limite maximale.

Donc, si Kubernetes trouve plusieurs pods qui ont dĂ©passĂ© les paramĂštres de leurs requĂȘtes, 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 les pods qui dĂ©passent leurs demandes plus que le reste des pods.

Dans de trÚs rares cas, Kubernetes peut interrompre les foyers qui sont toujours à sa portée. Cela peut se produire lorsque des composants systÚme critiques tels que l'agent Kubelet ou Docker commencent à consommer plus de ressources que ce qui leur était réservé.
Ainsi, aux premiers stades des petites entreprises, le cluster Kubernetes peut fonctionner correctement sans dĂ©finir de demandes de ressources et de restrictions, mais au fur et Ă  mesure que vos Ă©quipes et vos projets commencent Ă  se dĂ©velopper, vous courez le risque de rencontrer des problĂšmes dans ce domaine. L'ajout de requĂȘtes et de restrictions Ă  vos modules et espaces de noms nĂ©cessite trĂšs peu d'efforts supplĂ©mentaires et peut vous Ă©viter beaucoup de tracas.

Meilleures pratiques Kubernetes. Correct Terminate Disable


Un peu de publicité :)


Merci de rester avec nous. Aimez-vous nos articles? Vous voulez voir des matĂ©riaux plus intĂ©ressants? Soutenez-nous en passant une commande ou en recommandant Ă  vos amis des VPS basĂ©s sur le cloud pour les dĂ©veloppeurs Ă  partir de 4,99 $ , un analogue unique de serveurs d'entrĂ©e de gamme que nous avons inventĂ©s pour vous: Toute la vĂ©ritĂ© sur les VPS (KVM) E5-2697 v3 (6 cƓurs) 10 Go DDR4 480 Go SSD 1 Gbit / s Ă  partir de 19 $ ou comment diviser le serveur? (les options sont disponibles avec RAID1 et RAID10, jusqu'Ă  24 cƓurs et jusqu'Ă  40 Go de DDR4).

Dell R730xd 2 fois moins cher au centre de données Equinix Tier IV à Amsterdam? Nous avons seulement 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV à partir de 199 $ aux Pays-Bas!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - à partir de 99 $! En savoir plus sur la création d'un bùtiment d'infrastructure. classe c utilisant des serveurs Dell R730xd E5-2650 v4 coûtant 9 000 euros pour un sou?

All Articles