À propos de l'autoscaling des clusters


Cette page explique comment Google Kubernetes Engine (GKE) redimensionne automatiquement les pools de nœuds de votre cluster standard en fonction des demandes de vos charges de travail. Lorsque la demande est élevée, l'autoscaler de cluster ajoute des nœuds au pool de nœuds. Pour savoir comment configurer l'autoscaler de cluster, consultez la page Procéder à l'autoscaling d'un cluster.

Avec les clusters Autopilot, vous n'avez pas à vous soucier du provisionnement des nœuds, ni de la gestion des pools de nœuds, car les nœuds sont soumis à un provisionnement automatique et les pools de nœuds font l'objet d'un scaling automatique afin de répondre aux exigences de vos charges de travail.

Pourquoi utiliser l'autoscaler de cluster

L'autoscaler de cluster de GKE redimensionne automatiquement le nombre de nœuds dans un pool de nœuds donné, en fonction des exigences de vos charges de travail. Lorsque la demande est faible, l'autoscaler de cluster redimensionne les pools à la taille minimale que vous avez définie. Cela permet d'augmenter la disponibilité de vos charges de travail lorsque vous en avez besoin, tout en contrôlant les coûts. Vous n'avez pas besoin d'ajouter ou de supprimer manuellement des nœuds, ni de surprovisionner vos pools de nœuds. À la place, il suffit de spécifier une taille minimale et une taille maximale pour le pool de nœuds, après quoi le reste est automatique.

Si des ressources sont supprimées ou déplacées lors de l'autoscaling de votre cluster, vos charges de travail peuvent être temporairement interrompues. Par exemple, si votre charge de travail comprend un contrôleur avec une seule instance dupliquée, le pod de cette instance dupliquée peut être reprogrammé sur un nœud différent si son nœud actuel est supprimé. Avant d'activer l'autoscaler de cluster, concevez vos charges de travail de manière à tolérer des perturbations potentielles ou assurez-vous que les pods critiques ne sont pas interrompus.

Vous pouvez augmenter les performances de l'autoscaler de cluster avec le streaming d'images, qui diffuse à distance les données d'image requises à partir des images de conteneurs éligibles, tout en mettant en cache simultanément l'image localement pour permettre aux charges de travail de nouveaux nœuds de démarrer plus rapidement.

Comment fonctionne l'autoscaler de cluster

L'autoscaler de cluster fonctionne par pool de nœuds. Lorsque vous configurez un pool de nœuds avec l'autoscaler de cluster, vous spécifiez une taille minimale et maximale pour le pool de nœuds.

L'autoscaler de cluster augmente ou diminue automatiquement la taille du pool de nœuds en ajoutant ou en supprimant des instances de machine virtuelle (VM) dans le groupe d'instances géré Compute Engine sous-jacent pour le pool de nœuds. L'autoscaler de cluster prend ces décisions de scaling en fonction des demandes de ressources (plutôt qu'en fonction de l'utilisation réelle des ressources) des pods exécutés sur les nœuds de ce pool. Il vérifie régulièrement l'état des pods et des nœuds, et prend les mesures suivantes :

  • Si les pods ne peuvent pas être programmés, car il n'y a pas assez de nœuds dans le pool de nœuds, l'autoscaler de cluster en ajoute, jusqu'à atteindre la taille maximale du pool de nœuds.
  • Si les nœuds sont sous-utilisés et que tous les pods peuvent être programmés, même avec moins de nœuds dans le pool, l'autoscaler de cluster supprime des nœuds, jusqu'à atteindre la taille minimale du pool de nœuds. Si des pods d'un nœud ne peuvent pas être déplacés vers d'autres nœuds du cluster, l'autoscaler de cluster ne tente pas de réduire la capacité de ce nœud. Si les pods peuvent être déplacés vers d'autres nœuds, mais que le nœud ne peut pas être drainé correctement après un délai d'inactivité (actuellement de 10 minutes), le nœud est automatiquement arrêté. Le délai de grâce n'est pas configurable pour les clusters GKE. Pour en savoir plus sur le fonctionnement du scaling à la baisse, consultez la documentation sur l'autoscaler de cluster.

Si vos pods ont demandé trop peu de ressources (ou n'ont pas changé les valeurs par défaut qui pourraient être insuffisantes) et si vos nœuds connaissent des manques, l'autoscaler de cluster ne corrigera pas la situation. Vous pouvez vous assurer que l'autoscaler de cluster fonctionne aussi précisément que possible en effectuant des demandes de ressources explicites pour toutes vos charges de travail.

Critères d'exploitation

L'autoscaler de cluster repose sur les hypothèses suivantes lors du redimensionnement d'un pool de nœuds :

  • Tous les pods répliqués peuvent être démarrés sur un autre nœud, provoquant éventuellement une brève interruption. Si vos services ne tolèrent pas les pannes, il est déconseillé d'utiliser l'autoscaler de cluster.
  • Les utilisateurs ou les administrateurs ne gèrent pas manuellement les nœuds. L'autoscaling peut remplacer les opérations de gestion manuelle des nœuds que vous effectuez.
  • Tous les nœuds d'un pool de nœuds unique ont le même ensemble de libellés.
  • L'autoscaler de cluster prend en compte le coût relatif des types d'instances dans les différents pools, et tente de développer le pool de nœuds le moins coûteux possible. Le coût réduit des pools de nœuds contenant des VM Spot est pris en compte.
  • L'autoscaler de cluster prend en compte les demandes de conteneur d'initialisation avant de programmer les pods. Les demandes de conteneur d'initialisation peuvent utiliser toutes les ressources non allouées disponibles sur les nœuds, ce qui peut empêcher la planification des pods. L'autoscaler de cluster suit les mêmes règles de calcul des demandes que Kubernetes. Pour en savoir plus, consultez la section Utiliser des conteneurs d'initialisation.
  • Les libellés ajoutés manuellement après la création initiale du cluster ou du pool de nœuds ne font l'objet d'aucun suivi. Les nœuds créés par l'autoscaler de cluster se voient attribuer des libellés spécifiés avec --node-labels au moment de la création du pool de nœuds.
  • Dans la version 1.21 ou antérieure de GKE, l'autoscaler de cluster prend en compte les informations de rejet des nœuds existants à partir d'un pool de nœuds pour représenter l'ensemble du pool de nœuds. À partir de la version 1.22 de GKE, l'autoscaler de cluster combine des informations à partir des nœuds existants du cluster et du pool de nœuds. L'autoscaler de cluster détecte les modifications manuelles des nœuds et du pool de nœuds pour effectuer un scaling à la hausse.

Équilibrer les zones

Si votre pool de nœuds contient plusieurs groupes d'instances gérées avec le même type d'instance, l'autoscaler de cluster tente de conserver la taille de ces groupes d'instances gérées lors de l'autoscaling. Cela peut contribuer à éviter une répartition inégale des nœuds entre les groupes d'instances gérés dans plusieurs zones d'un pool de nœuds. GKE ne tient pas compte de la règle d'autoscaling lors du scaling à la baisse.

Règle de localisation

À partir de la version 1.24.1-gke.800 de GKE, vous pouvez modifier la stratégie de localisation de l'autoscaler de cluster GKE. Vous pouvez contrôler la règle de distribution de l'autoscaler de cluster en spécifiant l'option location_policy avec l'une des valeurs suivantes :

  • BALANCED : l'autoscaler prend en compte les exigences de pod et la disponibilité des ressources dans chaque zone. Cela ne garantit pas que les groupes de nœuds similaires auront exactement les mêmes tailles, car l'autoscaler prend en compte de nombreux facteurs, y compris la capacité disponible dans une zone et des affinités de zone spécifiques des pods qui ont déclenché un scaling à la hausse.
  • ANY : l'autoscaler priorise l'utilisation des réservations inutilisées et tient compte des contraintes actuelles de ressources disponibles. Cette règle est recommandée si vous utilisez des VM spot ou si vous souhaitez utiliser des réservations de VM qui ne sont pas égales entre les zones.

Réservations

À partir de la version 1.27 de GKE, l'autoscaler de cluster prend toujours en compte les réservations lors de la prise de décisions de scaling à la hausse. Les pools de nœuds avec des réservations inutilisées correspondantes sont prioritaires sur le choix du pool de nœuds pour le scaling à la hausse, même s'il n'est pas le plus efficace. En outre, les réservations inutilisées sont toujours prioritaires lors de l'équilibrage de scalings à la hausse multizones.

Valeurs par défaut

Pour les pools de nœuds VM spot, la règle de distribution de l'autoscaler de cluster par défaut est ANY. Dans cette règle, les VM spot présentent un risque plus faible de préemption.

Pour les pools de nœuds non préemptifs, la règle de distribution de l'autoscaler de cluster par défaut est BALANCED.

Taille minimale et maximale du pool de nœuds

Lorsque vous créez un pool de nœuds, vous pouvez spécifier la taille minimale et maximale de chaque pool de nœuds de votre cluster. L'autoscaler de cluster prend des décisions de redimensionnement dans le cadre de ces contraintes de scaling. Pour mettre à jour la taille minimale, redimensionnez manuellement le cluster à une taille adaptée aux nouvelles contraintes, après avoir spécifié la nouvelle valeur minimale. L'autoscaler de cluster prend ensuite des décisions de redimensionnement en fonction des nouvelles contraintes.

Taille actuelle du pool de nœuds Action de l'autoscaler de cluster Contraintes de scaling
Inférieur au minimum que vous avez spécifié L'autoscaler de cluster effectue un scaling à la hausse pour provisionner les pods en attente. Le scaling à la baisse est désactivé. Le pool de nœuds n'évolue pas en dessous de la valeur spécifiée.
Compris entre les tailles minimale et maximale que vous avez spécifiées L'autoscaler de cluster évolue à la hausse ou à la baisse en fonction de la demande. Le pool de nœuds reste dans les limites de taille que vous avez spécifiées.
Supérieur à la valeur maximale que vous avez spécifiée L'autoscaler de cluster effectue un scaling à la baisse uniquement pour les nœuds qui peuvent être supprimés en toute sécurité. Le scaling à la hausse est désactivé. Le pool de nœuds n'évolue pas au-dessus de la valeur spécifiée.

Sur les clusters Standard, l'autoscaler de cluster ne réduit jamais automatiquement la capacité d'un cluster à zéro nœud. Un ou plusieurs nœuds doivent toujours être disponibles dans le cluster pour exécuter les pods système. De plus, si le nombre de nœuds actuel est égal à zéro en raison de la suppression manuelle des nœuds, l'autoscaler et le provisionnement automatique de nœuds peuvent effectuer un scaling à la hausse sur un cluster ne comptant aucun nœud.

Pour en savoir plus sur les décisions des autoscalers, consultez la section Limites de l'autoscaler de cluster.

Limites de l'autoscaling

Vous pouvez définir le nombre minimal et maximal de nœuds à utiliser par l'autoscaler de cluster lors du scaling d'un pool de nœuds. Utilisez les options --min-nodes et --max-nodes pour définir le nombre minimal et maximal de nœuds par zone.

À partir de la version 1.24 de GKE, vous pouvez utiliser les options --total-min-nodes et --total-max-nodes pour les nouveaux clusters. Ces options définissent le nombre minimal et maximal du nombre total de nœuds dans le pool de nœuds de toutes les zones.

Exemple de nœuds minimal et maximal

La commande suivante crée un cluster multizones d'autoscaling doté de six nœuds répartis sur trois zones, avec un minimum d'un nœud par zone et un maximum de quatre nœuds par zone :

gcloud container clusters create example-cluster \
    --num-nodes=2 \
    --zone=us-central1-a \
    --node-locations=us-central1-a,us-central1-b,us-central1-f \
    --enable-autoscaling --min-nodes=1 --max-nodes=4

Dans cet exemple, la taille totale du cluster peut être comprise entre trois et douze nœuds, répartis sur les trois zones. Si l'une des zones échoue, la taille totale du cluster peut être comprise entre deux et huit nœuds.

Exemple de nombre total de nœuds

La commande suivante, disponible dans GKE 1.24 ou version ultérieure, crée initialement un cluster multizones avec autoscaling sur six nœuds répartis sur trois zones, avec un minimum de trois nœuds et un maximum de douze nœuds dans le pool de nœuds dans toutes les zones :

gcloud container clusters create example-cluster \
    --num-nodes=2 \
    --zone=us-central1-a \
    --node-locations=us-central1-a,us-central1-b,us-central1-f \
    --enable-autoscaling --total-min-nodes=3 --total-max-nodes=12

Dans cet exemple, la taille totale du cluster peut être comprise entre 3 et 12 nœuds, quelle que soit la répartition entre les zones.

Profils d'autoscaling

La décision de supprimer un nœud représente un compromis entre l'optimisation de l'utilisation et la disponibilité des ressources. Supprimer les nœuds sous-exploités améliore l'utilisation des clusters, mais les nouvelles charges de travail peuvent se trouver contraintes d'attendre le provisionnement de nouvelles ressources avant de pouvoir s'exécuter.

Vous pouvez spécifier le profil d'autoscaling à utiliser pour prendre de telles décisions. Les profils disponibles sont les suivants :

  • balanced : profil par défaut pour les clusters Standard. Le profil balanced n'est pas disponible pour les clusters Autopilot.
  • optimize-utilization : donne la priorité à l'optimisation de l'utilisation plutôt qu'à la mise en réserve de ressources dans le cluster. Lorsque vous activez ce profil, l'autoscaler de cluster effectue un scaling à la baisse plus radical du cluster. GKE peut supprimer davantage de nœuds et supprimer les nœuds plus rapidement. GKE préfère planifier les pods dans les nœuds disposant déjà d'une allocation élevée de processeurs, de mémoire ou de GPU. Cependant, d'autres facteurs affectent la planification, tels que la répartition des pods appartenant au même Déploiement, StatefulSet ou Service sur les nœuds.

Le profil d'autoscaling optimize-utilization permet à l'autoscaler de cluster d'identifier et de supprimer les nœuds sous-utilisés. Pour effectuer cette optimisation, GKE définit le nom du programmeur dans la spécification du pod sur gke.io/optimize-utilization-scheduler. Les pods qui spécifient un programmeur personnalisé ne sont pas affectés.

La commande suivante active le profil d'autoscaling optimize-utilization dans un cluster existant :

gcloud container clusters update CLUSTER_NAME \
    --autoscaling-profile optimize-utilization

Prendre en compte la planification et l'interruption des pods

Lors de la réduction, l'autoscaler de cluster respecte les règles de planification et d'éviction définies sur les pods. Ces restrictions peuvent empêcher la suppression d'un nœud par l'autoscaler. La suppression d'un nœud peut être empêchée si ce nœud contient un pod remplissant l'une des conditions suivantes :

  • Les règles d'affinité ou d'anti-affinité du pod empêchent la replanification.
  • Le pod n'est pas géré par un contrôleur tel que Deployment, StatefulSet, Job ou ReplicaSet.
  • Le pod dispose d'un stockage en local et la version du plan de contrôle GKE est antérieure à la version 1.22. Dans les clusters GKE avec la version 1.22 ou ultérieure du plan de contrôle, les pods avec stockage local ne bloquent plus le scaling à la baisse.
  • Le pod comporte l'annotation "cluster-autoscaler.kubernetes.io/safe-to-evict": "false".
  • La suppression du nœud dépasse la valeur PodDisruptionBudget configurée.

Pour en savoir plus sur l'autoscaler de cluster et éviter les interruptions, consultez la section Questions fréquentes sur l'autoscaler de cluster :

Autoscaling des TPU dans GKE

GKE est compatible avec les TPU (Tensor Processing Units) pour accélérer les charges de travail de machine learning. Le pool de nœuds de tranche TPU à hôte unique et le pool de nœuds de tranche TPU multi-hôte sont tous deux compatibles avec l'autoscaling et le provisionnement automatique.

Avec l'option --enable-autoprovisioning sur un cluster GKE, GKE crée ou supprime des pools de nœuds de tranche TPU à hôte unique ou multi-hôte avec une version et une topologie de TPU qui répondent aux exigences des charges de travail en attente.

Lorsque vous utilisez --enable-autoscaling, GKE procède au scaling du pool de nœuds en fonction de son type, comme suit :

  • Pool de nœuds de tranche TPU à hôte unique : GKE ajoute ou supprime des nœuds TPU dans le pool de nœuds existant. Le pool de nœuds peut contenir un nombre de nœuds TPU compris entre zéro et la taille maximale du pool de nœuds, tel que déterminé par les options --max-nodes et --total-max-nodes. Lorsque le pool de nœuds effectue un scaling, tous les nœuds TPU du pool de nœuds ont le même type de machine et la même topologie. Pour en savoir plus sur la création d'un pool de nœuds de tranche TPU à hôte unique, consultez la section Créer un pool de nœuds.

  • Pool de nœuds de tranche TPU multi-hôte : GKE effectue un scaling du pool de nœuds de façon atomique, de zéro jusqu'au nombre de nœuds requis pour satisfaire la topologie TPU. Par exemple, pour un pool de nœuds TPU avec un type de machine ct5lp-hightpu-4t et une topologie 16x16, le pool de nœuds contient 64 nœuds. L'autoscaler GKE s'assure que ce pool de nœuds comporte exactement 0 ou 64 nœuds. Lors d'un nouveau scaling à la baisse, GKE supprime tous les pods planifiés et draine l'intégralité du pool de nœuds jusqu'à zéro. Pour en savoir plus sur la création d'un pool de nœuds de tranche TPU multi-hôte, consultez la section Créer un pool de nœuds.

Informations supplémentaires

Vous pouvez trouver plus d'informations sur l'autoscaler de cluster dans la section Questions fréquentes sur l'autoscaling du projet Kubernetes Open source.

Limites

L'autoscaler de cluster présente les limites suivantes :

Problèmes connus

  • Dans les versions antérieures à la version 1.22 du plan de contrôle GKE, l'autoscaler de cluster GKE arrête le scaling à la hausse de tous les pools de nœuds sur les clusters vides (zéro nœud). Ce comportement ne se produit pas dans GKE 1.22 et versions ultérieures.

Étape suivante