Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.

Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.
Pour maîtriser Kubernetes, il est nécessaire de connaître les différentes méthodes de mise à l'échelle des ressources de cluster : selon les développeurs du système, c'est l'une des principales tâches de Kubernetes. Nous avons préparé un aperçu détaillé des mécanismes d'automatisation horizontale et verticale de la mise à l'échelle et de la redimension des clusters, ainsi que des recommandations sur la manière de les utiliser efficacement.

L'article Kubernetes Autoscaling 101 : Cluster Autoscaler, Horizontal Autoscaler et Vertical Pod Autoscaler a été traduit par l'équipe qui a mis en œuvre l'automatisation de la mise à l'échelle dans Kubernetes aaS de Mail.ru.

Pourquoi il est important de réfléchir à la mise à l'échelle

Kubernetes — un outil pour la gestion des ressources et l'orchestration. Bien sûr, il est intéressant de jouer avec les fonctionnalités impressionnantes de déploiement, de surveillance et de gestion des pods (le module pod est un groupe de conteneurs, lancé en réponse à une demande).

Cependant, il est également important de réfléchir à des questions telles que :

  1. Comment mettre à l'échelle les modules et les applications ?
  2. Comment maintenir les conteneurs en état de fonctionnement et efficaces ?
  3. Comment réagir aux changements constants dans le code et aux charges de travail des utilisateurs ?

Configurer des clusters Kubernetes pour un équilibrage des ressources et des performances peut être une tâche complexe, nécessitant une expertise sur le fonctionnement interne de Kubernetes. La charge de travail sur votre application ou vos services peut fluctuer au cours de la journée ou même en une heure, c'est pourquoi l'équilibrage devrait être considéré comme un processus continu.

Niveaux de mise à l'échelle automatique de Kubernetes

Une mise à l'échelle automatique efficace nécessite une coordination entre deux niveaux :

  1. Le niveau des pods, comprenant la mise à l'échelle horizontale (Horizontal Pod Autoscaler, HPA) et la mise à l'échelle verticale (Vertical Pod Autoscaler, VPA). C'est la mise à l'échelle des ressources existantes pour vos conteneurs.
  2. Le niveau du cluster, géré par le système de mise à l'échelle automatique des clusters (Cluster Autoscaler, CA), qui augmente ou diminue le nombre de nœuds dans le cluster.

Le module de mise à l'échelle automatique horizontale (HPA)

Comme son nom l'indique, le HPA ajuste le nombre de replicas des pods. Comme déclencheurs pour modifier le nombre de replicas, la plupart des DevOps utilisent la charge CPU et la mémoire. Cependant, il est également possible de mettre à l'échelle le système sur la base des métriques personnalisées, leurs combinaisons ou même métriques externes.

Diagramme de haut niveau du fonctionnement du HPA :

  1. HPA vérifie en continu les valeurs des métriques spécifiées lors de l'installation, avec un intervalle par défaut de 30 secondes.
  2. HPA tente d'augmenter le nombre de modules si un seuil spécifié est atteint.
  3. HPA met à jour le nombre de réplicas au sein du contrôleur de déploiement/réplication.
  4. Le contrôleur de déploiement/réplication déploie ensuite tous les modules supplémentaires nécessaires.

Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.
HPA lance le processus de déploiement des modules lorsqu'un seuil de métrique est atteint.

Lors de l'utilisation de HPA, tenez compte des éléments suivants :

  • L'intervalle de vérification par défaut de HPA est de 30 secondes. Il est fixé par le paramètre horizontal-pod-autoscaler-sync-period dans le gestionnaire de contrôleur.
  • L'erreur relative par défaut est de 10%.
  • Après la dernière augmentation du nombre de modules, HPA attend la stabilisation des métriques pendant trois minutes. Cet intervalle est défini par le paramètre horizontal-pod-autoscaler-upscale-delay.
  • Après la dernière diminution du nombre de modules, HPA attend la stabilisation pendant cinq minutes. Cet intervalle est défini par le paramètre horizontal-pod-autoscaler-downscale-delay.
  • HPA fonctionne mieux avec des objets de déploiement plutôt qu'avec des contrôleurs de réplication. Le scaling horizontal est incompatible avec la mise à jour continue (rolling update), qui manipule directement les contrôleurs de réplication. Lors d'un déploiement, le nombre de réplicas dépend directement des objets de déploiement.

Mise à l'échelle verticale des pods

La mise à l'échelle verticale (VPA) alloue plus (ou moins) de temps processeur ou de mémoire aux pods existants. Elle convient aux pods avec état (stateful) ou sans état (stateless), mais est principalement conçue pour les services stateful. Cependant, vous pouvez également appliquer VPA à des modules sans état si vous avez besoin d'ajuster automatiquement la quantité de ressources initialement allouées.

VPA réagit également aux événements OOM (out of memory, manque de mémoire). Pour modifier le temps processeur et la mémoire, un redémarrage des pods est nécessaire. Lors du redémarrage, VPA respecte le budget de répartition (pods distribution budget, PDB), afin de garantir le nombre minimum nécessaire de modules.

Vous pouvez définir un volume minimal et maximal de ressources pour chaque module. Par exemple, vous pouvez limiter la mémoire allouée à un maximum de 8 Go. Cela est utile si les nœuds actuels ne peuvent pas allouer plus de 8 Go de mémoire par conteneur. Les spécifications détaillées et le mécanisme de fonctionnement sont décrits dans la wiki officielle de VPA.

De plus, le VPA dispose d'une fonction intéressante de recommandations (VPA Recommender). Elle suit l'utilisation des ressources et les événements OOM de tous les modules afin de proposer de nouvelles valeurs de mémoire et de temps processeur sur la base d'un algorithme intelligent prenant en compte des métriques historiques. Il existe également une interface API qui prend en entrée un descripteur de pod et fournit les valeurs de ressources recommandées.

Il convient de noter que le VPA Recommender ne suit pas la « limite » des ressources. Cela peut entraîner une monopolisation des ressources à l'intérieur des nœuds. Il est préférable d'établir une valeur limite au niveau de l'espace de noms pour éviter une consommation excessive de mémoire ou de temps processeur.

Schéma de fonctionnement de haut niveau du VPA :

  1. Le VPA vérifie en continu les valeurs des métriques spécifiées à l'installation, à intervalles par défaut de 10 secondes.
  2. Si le seuil défini est atteint, le VPA tente de modifier la quantité de ressources allouées.
  3. Le VPA met à jour le nombre de ressources au sein du contrôleur de déploiement/réplication.
  4. Lors du redémarrage des modules, toutes les nouvelles ressources sont appliquées aux instances créées.

Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.
Le VPA ajoute la quantité nécessaire de ressources

Prenez en compte les éléments suivants lors de l'utilisation du VPA :

  • Le mise à l'échelle nécessite un redémarrage obligatoire du pod. Cela est nécessaire pour éviter une instabilité après les modifications. Pour plus de fiabilité, les modules se redémarrent et se distribuent sur les nœuds en fonction des nouvelles ressources allouées.
  • Le VPA et le HPA ne sont pas encore compatibles entre eux et ne peuvent pas fonctionner sur les mêmes pods. Si vous appliquez les deux mécanismes de mise à l'échelle dans un cluster, assurez-vous que les paramètres ne leur permettent pas d'être activés sur les mêmes objets.
  • VPA configure les demandes de conteneurs en ressources uniquement en fonction de leur utilisation passée et actuelle. Il ne fixe pas de limites d'utilisation des ressources. Des problèmes peuvent survenir avec le fonctionnement incorrect des applications qui commencent à consommer de plus en plus de ressources, ce qui entraînera l'arrêt de ce pod par Kubernetes.
  • VPA est encore en phase de développement précoce. Soyez prêt à ce que le système subisse des changements dans un avenir proche. Vous pouvez lire sur les limitations connues et les plans de développement. Ainsi, il est prévu de mettre en œuvre la coopération entre VPA et HPA, ainsi que le déploiement de modules avec une politique de mise à l'échelle verticale automatisée pour eux (par exemple, une étiquette spéciale ‘requires VPA’).

Mise à l'échelle automatique du cluster Kubernetes

Le Cluster Autoscaler (CA) ajuste le nombre de nœuds en fonction du nombre de pods en attente. Le système vérifie périodiquement l'existence de pods en attente et augmente la taille du cluster si davantage de ressources sont nécessaires, tout en respectant les limites imposées. Le CA interagit avec le fournisseur de cloud, lui demandant des nœuds supplémentaires ou libérant ceux qui ne sont pas utilisés. La première version publique du CA a été présentée dans Kubernetes 1.8.

Schéma de fonctionnement de haut niveau du CA :

  1. Le CA vérifie l'existence de pods en attente à un intervalle par défaut de 10 secondes.
  2. Si un ou plusieurs pods sont en attente en raison d'un manque de ressources disponibles dans le cluster pour les allouer, il tente de préparer un ou plusieurs nœuds supplémentaires.
  3. Lorsque le fournisseur de cloud alloue le nœud nécessaire, celui-ci rejoint le cluster et est prêt à servir les pods.
  4. Le planificateur Kubernetes répartit les pods en attente sur le nouveau nœud. Si certains pods restent toujours en attente après cela, le processus se répète - et de nouveaux nœuds sont ajoutés au cluster.

Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.
Allocation automatique des nœuds de cluster dans le cloud

Prenez en compte ce qui suit lors de l'utilisation du CA :

Comment les systèmes d'auto-scaling Kubernetes interagissent entre eux

Pour une harmonie parfaite, il convient d'appliquer l'auto-scaling à la fois au niveau des pods (HPA/VPA) et au niveau du cluster. Ils interagissent relativement facilement entre eux :

  1. HPA ou VPA mettent à jour les répliques de pods ou les ressources allouées aux pods existants.
  2. Si des nœuds sont insuffisants pour le scaling prévu, CA détecte la présence de pods en attente.
  3. CA alloue de nouveaux nœuds.
  4. Les modules sont répartis sur les nouveaux nœuds.

Trois niveaux d'auto-scaling dans Kubernetes : comment les utiliser efficacement.
Système d'échelle conjointe des systèmes Kubernetes

Erreurs typiques dans l'auto-scaling Kubernetes

Il existe plusieurs problèmes typiques que les DevOps rencontrent lorsqu'ils essaient d'appliquer l'auto-scaling.

HPA et VPA dépendent des métriques et de certaines données historiques. Si les ressources allouées sont insuffisantes, les modules seront réduits et ne pourront pas générer de métriques. Dans ce cas, l'auto-scaling ne se produira jamais.

L'opération de mise à l'échelle elle-même est sensible au temps. Nous souhaitons que les modules et le cluster se mettent à l'échelle rapidement — avant que les utilisateurs ne remarquent des problèmes ou des pannes. Il faut donc prendre en compte le temps moyen de mise à l'échelle des pods et du cluster.

Le scénario idéal — 4 minutes :

  1. 30 secondes. Mise à jour des métriques cibles : 30−60 secondes.
  2. 30 secondes. HPA vérifie les valeurs des métriques : 30 secondes.
  3. Moins de 2 secondes. Les modules pod sont créés et passent à l'état d'attente : 1 seconde.
  4. Moins de 2 secondes. CA voit les modules en attente et envoie des appels pour préparer les nœuds : 1 seconde.
  5. 3 minutes. Le fournisseur cloud alloue les nœuds. K8s attend qu'ils soient prêts : jusqu'à 10 minutes (cela dépend de plusieurs facteurs).

Le pire scénario (plus réaliste) est de 12 minutes :

  1. 30 secondes. Mise à jour des métriques cibles.
  2. 30 secondes. HPA vérifie les valeurs des métriques.
  3. Moins de 2 secondes. Les modules pod sont créés et passent en état d'attente.
  4. Moins de 2 secondes. CA voit les modules en attente et envoie des appels pour préparer les nœuds.
  5. 10 minutes. Le fournisseur cloud alloue les nœuds. K8s attend qu'ils soient prêts. Le temps d'attente dépend de plusieurs facteurs, tels que la latence du fournisseur, la latence du système d'exploitation, le fonctionnement des outils auxiliaires.

Ne confondez pas les mécanismes de mise à l'échelle des fournisseurs cloud avec notre CA. Cette dernière fonctionne à l'intérieur du cluster Kubernetes, tandis que le mécanisme du fournisseur cloud fonctionne sur la base de la distribution des nœuds. Il ne sait pas ce qui se passe avec vos pods ou applications. Ces systèmes fonctionnent en parallèle.

Comment gérer la mise à l'échelle dans Kubernetes

  1. Kubernetes est un outil de gestion des ressources et d'orchestration. Les opérations de gestion des pods et des ressources du cluster sont une étape clé dans la maîtrise de Kubernetes.
  2. Comprenez la logique de mise à l'échelle des pods en tenant compte de HPA et de VPA.
  3. CA doit être utilisé uniquement si vous comprenez bien les besoins de vos pods et conteneurs.
  4. Pour une configuration optimale du cluster, il est nécessaire de comprendre comment les différents systèmes de mise à l'échelle fonctionnent ensemble.
  5. Lorsque vous évaluez le temps de mise à l'échelle, gardez à l'esprit les meilleurs et pires scénarios.

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