Configurer plusieurs pools de nœuds à l’aide de pools de nœuds spot AKS avec l’autoscaler de cluster

Effectué

Azure fournit des instances de machine virtuelle Azure qui combinent scalabilité et réduction des coûts. Elles sont idéales pour les charges de travail pouvant être interrompues. Ces machines virtuelles accèdent à une capacité de calcul Azure inutilisée à prix réduit tout en prenant en charge des scénarios de calcul hautes performances.

La solution de suivi de drones de votre entreprise est déployée sur Azure Kubernetes Service (AKS) comme le sont de nombreux services et applications conteneurisés. L’un de ces services correspond à un service de traitement par lots qui planifie les trajectoires de vol des drones. Suite à une croissance soudaine de votre base de clients, le service de traitement par lots est submergé de demandes et ne peut plus suivre. Cette situation entraîne des retards et la frustration des clients.

La mise à l’échelle automatique du nombre de réplicas du service de traitement par lots permet le traitement des commandes en temps voulu. Toutefois, vous devez également déployer davantage de nœuds pour répondre aux besoins en ressources informatiques. En analysant les tendances d’utilisation dans Azure Monitor, vous remarquez que ces nœuds sont utilisés uniquement à des moments spécifiques et de manière non rentable. Le service de traitement par lots est sans état et n’enregistre aucune donnée de session client. Vous comprenez que vous pouvez réaliser des économies en :

  • Utilisant des instances de nœuds à faible coût.
  • Mettant automatiquement à l’échelle le nombre de nœuds du pool configuré pour le traitement par lots.

Examinons l’infrastructure sur laquelle repose cette solution économique dans AKS.

Qu’est-ce qu’une machine virtuelle spot dans Azure ?

Une machine virtuelle spot est une machine virtuelle qui vous permet d’accéder à une capacité de calcul Azure inutilisée en bénéficiant de remises conséquentes. Les machines virtuelles spot remplacent les machines virtuelles basse priorité existantes dans Azure. Vous pouvez utiliser des machines virtuelles spot pour exécuter des charges de travail telles que les suivantes :

  • scénarios informatiques hautes performances, traitement par lots ou applications de rendu visuel ;

  • applications sans état à grande échelle ;

  • environnements de développement/test, incluant des charges de travail d’intégration continue (CI) et de livraison continue (CD).

Disponibilité des machines virtuelles spot

La disponibilité des machines virtuelles spot dépend de facteurs tels que la capacité, la taille, la région et l’heure de la journée. Azure alloue des machines virtuelles uniquement si la capacité est disponible. Dès lors, il n’existe pas de contrat de niveau de service (SLA) pour ces types de machines virtuelles et elles n’offrent pas de garantie en termes de haute disponibilité.

Stratégie d’éviction des machines virtuelles spot

La stratégie d’éviction par défaut des machines virtuelles spot est Libérer. Azure écarte les machines virtuelles spot avec un préavis de 30 secondes, lorsque la capacité d’une région est limitée. Une machine virtuelle définie avec la stratégie Libérer, passe à l’état arrêté-libéré lorsqu’elle est écartée. Vous pouvez redéployer une machine virtuelle écartée lorsque la capacité spot redevient disponible. Une machine virtuelle libérée continue de suivre votre quota de processeur virtuel spot, et les frais relatifs aux disques alloués sous-jacents s’appliquent toujours.

Qu’est-ce qu’un groupe de machines virtuelles identiques spot ?

Un groupe de machines virtuelles identiques spot est un groupe de machines virtuelles identiques qui prend en charge des machines virtuelles spot Azure. Ces machines virtuelles se comportent de la même façon que les machines virtuelles spot classiques, à la différence près que vous lorsque vous utilisez la prise en charge des groupes de machines virtuelles identiques dans Azure, vous choisissez entre deux stratégies d’éviction :

  • Libérer : La stratégie Libérer fonctionne exactement comme décrit précédemment.

  • Supprimer : La stratégie Supprimer vous permet d’éviter le coût des disques et d’atteindre les limites de quota. Avec la stratégie d’éviction Supprimer, les machines virtuelles écartées sont supprimées en même temps que leurs disques sous-jacents. La fonctionnalité de mise à l’échelle automatique des groupes identiques peut maintenant tenter automatiquement de compenser l’éviction de machines virtuelles en créant de nouvelles machines virtuelles. Bien que la création de machines virtuelles ne soit pas garantie, les machines virtuelles écartées ne sont pas comptabilisées dans votre quota de processeur virtuel ou engendrent des coûts pour les disques sous-jacents.

    Une bonne pratique consiste à n’utiliser la fonctionnalité de mise à l’échelle automatique que lorsque vous définissez la stratégie d’éviction Supprimer sur le groupe identique.

Qu’est-ce qu’un pool de nœuds spot dans Azure Kubernetes Service (AKS) ?

Un pool de nœuds spot est un pool de nœuds utilisateur qui utilise un groupe de machines virtuelles identiques spot. AKS prend en charge les machines virtuelles spot lorsque vous :

  • Devez créer des pools de nœuds utilisateur.
  • Souhaitez bénéficier des avantages en matière de coûts offerts par la prise en charge des groupes de machines virtuelles identiques pour les machines virtuelles spot Azure.

Utilisez des pools de nœuds spot pour :

  • Tirer parti de la capacité inutilisée dans Azure.
  • Utiliser les fonctionnalités de groupe identique avec la stratégie d’éviction Supprimer.
  • Définir le prix maximum que vous souhaitez payer par heure.
  • Activer l’autoscaler de cluster Kubernetes AKS recommandé lors de l’utilisation de pools de nœuds spot.

Par exemple, pour prendre en charge le service de traitement par lots de l’application de suivi de drones, vous pouvez créer un pool de nœuds utilisateur spot et activer l’autoscaler de cluster. Vous configurez ensuite l’outil de mise à l’échelle horizontale de pod pour déployer plus de services de traitement par lots en réponse aux demandes de ressources.

À mesure que la demande de nœuds augmente, l’autoscaler de cluster peut mettre à l’échelle le nombre de nœuds du pool de nœuds spot. Si des évictions de nœud se produisent, l’autoscaler de cluster continue d’essayer de mettre à l’échelle le nombre de nœuds si des nœuds supplémentaires sont toujours nécessaires.

Limitations des pools de nœuds spot

Avant de décider d’ajouter un pool de nœuds utilisateur spot à votre cluster AKS, tenez compte des limitations suivantes :

  • Le groupe identique spot sous-jacent n’est déployé que sur un seul domaine d’erreur, et n’offre aucune garantie de haute disponibilité.
  • Le cluster AKS implique que la prise en charge de pool de nœuds multiples soit activée.
  • Vous ne pouvez utiliser les pools de nœuds spot qu’en tant que pools de nœuds utilisateur.
  • Vous ne pouvez pas mettre à niveau des pools de nœuds spot.
  • La création de machines virtuelles spot n’est pas garantie. La création de nœuds spot dépend de la capacité et de la disponibilité de quota dans la région Azure où est déployé le cluster.

Souvenez-vous que les pools de nœuds spot ne doivent être utilisés que pour des charges de travail qui peuvent être interrompues.

Important

Dans certains abonnements, tels que les abonnements parrainés, la possibilité de créer des machines virtuelles spot et des pools de nœuds spot est limitée. Vous ne serez peut-être pas en mesure de créer un pool de nœuds spot pour votre cluster.

Ajouter un pool de nœuds spots à un cluster AKS

Un pool de nœuds spot ne peut pas être un pool de nœuds système pour un cluster AKS. Vous devez au préalable créer votre cluster, puis utiliser la commande az aks nodepool add pour ajouter un nouveau pool de nœuds utilisateur.

Vous définissez plusieurs paramètres pour un nouveau pool de nœuds afin de le configurer en tant que pool de nœuds spot.

Priorité

Le paramètre --priority est défini sur Regular par défaut pour un nouveau pool de nœuds. Définissez la valeur sur Spot pour indiquer que le nouveau pool que vous créez est un pool de nœuds spot. Vous ne pourrez pas modifier cette valeur après la création.

Stratégie d’éviction

Un pool de nœuds spot doit utiliser un groupe de machines virtuelles identiques. Rappelez-vous que le pool de nœuds spot utilise un groupe identique spot. Définissez --eviction-policy sur Delete pour permettre au groupe identique de supprimer le nœud et le disque alloué sous-jacent utilisé par le nœud. Vous ne pouvez pas modifier cette valeur après la création.

Vous pouvez définir la stratégie d’éviction sur Deallocate, mais lorsque ces nœuds sont supprimés, ils comptent néanmoins toujours dans votre quota de calcul pour la mise à l’échelle ou la mise à niveau du cluster.

Prix maximal d’un nœud spot

Les pools de nœuds spot optimisent les coûts en plafonnant le montant maximal que vous pouvez débourser par nœud spot par heure. Pour définir ce montant, utilisez le paramètre --spot-max-price. Les nœuds spot nouvellement créés sont écartés une fois cette valeur atteinte.

Vous pouvez définir cette valeur sur n’importe quel nombre positif avec cinq décimales, ou la définir sur -1. La définition de la valeur de --spot-max-price sur -1 affecte votre pool de nœuds comme suit :

  • Les nœuds ne vont pas être écartés en fonction de leur prix.
  • Le coût des nouveaux nœuds est fonction du moins coûteux entre le prix actuel des nœuds spot et le prix d’un nœud standard.

Par exemple, si vous définissez la valeur sur 0,98765, le prix maximal d’un nœud est de 0.98765 USD par heure. Lorsque l’utilisation du nœud dépasse cette valeur, il est écarté.

Activer l’autoscaler de cluster

Nous vous recommandons d’activer l’autoscaler de cluster à l’aide du paramètre --enable-cluster-autoscaler. Si vous n’utilisez pas l’autoscaler de cluster, vous courez le risque que le nombre de nœuds chute à zéro dans le pool de nœuds à mesure que des nœuds sont écartés en raison de contraintes de capacité Azure.

Nombre minimal de nœuds

Définissez le nombre minimal de nœuds sur une valeur comprise entre 1 et 100 à l’aide du paramètre --min-count. Le nombre minimal de nœuds est requis lorsque vous activez l’autoscaler de cluster.

Nombre maximal de nœuds

Définissez le nombre maximal de nœuds sur une valeur comprise entre 1 et 100 à l’aide du paramètre --max-count. Le nombre maximal de nœuds est requis lorsque vous activez l’autoscaler de cluster.

Exemple de configuration

Voici un exemple de commande az aks nodepool add qui ajoute un pool de nœuds spot, avec un maximum de 3 et un minimum de 1. Notez l’utilisation de --enable-cluster-autoscaler pour activer les fonctionnalités de nœuds spot.

az aks nodepool add \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name spotpool01 \
    --enable-cluster-autoscaler \
    --max-count 3 \
    --min-count 1 \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --no-wait

Déployer des pods vers des pools de nœuds spot

Lors du déploiement de charges de travail dans Kubernetes, vous pouvez fournir des informations au planificateur pour spécifier les nœuds sur lesquels les charges de travail peuvent ou non s’exécuter. Vous contrôlez la planification de la charge de travail en configurant des rejets, une tolérance ou une affinité de nœud. Les nœuds spot sont configurés avec une étiquette et un rejet spécifiques.

Qu’est-ce qu’un rejet ?

Un rejet est appliqué à un nœud pour indiquer que seuls des pods spécifiques peuvent être planifiés sur celui-ci. Les nœuds spot sont configurés avec une étiquette définie sur kubernetes.azure.com/scalesetpriority:spot.

Qu’est-ce qu’une tolérance ?

La tolérance est une spécification appliquée à un pod pour autoriser, sans l’exiger, la planification d’un pod sur un nœud avec le rejet correspondant. Les nœuds spot sont configurés avec rejet de nœud défini sur kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Notes

Les rejets et les tolérances ne garantissent pas qu’un pod sera placé sur un nœud spécifique. Par exemple, si un nœud n’a pas de rejet, il est possible que le pod avec la tolérance soit planifié sur le nœud non rejeté. La spécification d’une affinité avec des rejets et des tolérances peut résoudre ce problème.

Qu’est-ce qu’une affinité de nœud ?

Une affinité de nœud vous permet de décrire les pods planifiés sur un nœud. Une affinité est spécifiée à l’aide d’étiquettes définies sur le nœud. Par exemple, dans AKS, les pods système sont configurés avec une anti-affinité concernant les nœuds spot afin d’éviter que les pods soient planifiés sur ces nœuds.

Définir une tolérance dans un fichier manifeste de pod

Vous spécifiez une tolérance de rejet de nœud en créant une entrée de dictionnaire tolerations dans le fichier manifeste de votre charge de travail. Dans ce dictionnaire, vous définissez les propriétés suivantes pour chaque rejet de nœud que la charge de travail doit tolérer dans cette section :

Propriété Description
key Identifie une paire clé-valeur de rejet de nœud spécifiée sur le nœud. Par exemple, sur un pool de nœuds spot, la paire clé-valeur est kubernetes.azure.com/scalesetpriority:spot. La clé est kubernetes.azure.com/scalesetpriority.
operator Permet que la tolérance corresponde à un rejet. L’opérateur par défaut est Equal. Vous pouvez également spécifier Exists pour la correspondance avec la tolérance. Toutefois, lorsque vous utilisez Exists, vous ne spécifiez pas la propriété suivante (value).
value Représente la partie valeur de la paire clé-valeur du rejet de nœud spécifiée sur le nœud. Par exemple, sur un pool de nœuds spot avec une paire clé-valeur de kubernetes.azure.com/scalesetpriority:spot, la valeur est spot.
effect Indique comment la planification d’un pod est gérée dans le système. Trois options sont disponibles : NoSchedule, PreferNoSchedule et NoExecute. NoSchedule veille à ce que le système ne puisse planifier le pod. PreferNoSchedule permet au système d’essayer de ne pas planifier le pod. NoExecute écarte les pods en cours d’exécution sur le nœud rejeté ou ne planifie pas du tout le pod.

Définir l’affinité de nœud dans un fichier manifeste pod

Vous spécifiez l’affinité en créant une entrée affinity dans votre fichier manifeste de charge de travail. Dans cette entrée, vous définissez les propriétés suivantes pour chaque étiquette de nœud à laquelle une charge de travail doit correspondre :

Propriété Description
nodeAffinity Décrit les règles de planification de l’affinité de nœud pour le pod.
requiredDuringSchedulingIgnoredDuringExecution Si les exigences d’affinité spécifiées par ce champ ne sont pas respectées au moment de la planification, le pod ne peut pas être planifié sur le nœud. Si les exigences d’affinité spécifiées par ce champ cessent d’être respectées à un moment donné de l’exécution du pod (par exemple, en raison d’une mise à jour), le système peut choisir de supprimer le pod de son nœud.
nodeSelectorTerms Liste des termes du sélecteur de nœud. Les termes retournés correspondent à n’importe quel filtre, plutôt que tous les filtres.
matchExpressions Une liste de spécifications de sélecteur de nœuds par étiquettes de nœud.
key La clé d’étiquette à laquelle s’applique le sélecteur. La clé est kubernetes.azure.com/scalesetpriority.
operator Représente la relation d’une clé avec un ensemble de valeurs. Les opérateurs valides sont In, NotIn, Exists, DoesNotExistGt et Lt
values Représente la partie valeur de la paire clé-valeur de l’étiquette de nœud spécifiée sur le nœud. Sur un pool de nœuds spot avec une paire clé-valeur de kubernetes.azure.com/scalesetpriority:spot, la valeur est spot.

Voici un exemple de charge de travail à laquelle une tolérance et une affinité ont été ajoutées pour les pools de nœuds spot.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"

Vérifiez vos connaissances

1.

Supposons que vous disposez d’un service sans état traitant les commandes en ligne et s’exécutant sur un cluster Azure Kubernetes Service (AKS). Vous décidez d’utiliser des pools de nœuds spot sur le cluster AKS afin d’optimiser les coûts de calcul de celui-ci. Comment ajoutez-vous des pools de nœuds spot à un cluster AKS ?

2.

En ce qui concerne le service décrit dans la question précédente, quelle stratégie d’éviction correspond à l’option la plus rentable pour configurer le pool de nœuds spot ?

3.

En ce qui concerne le service décrit dans les questions précédentes, comment s’assurer que des charges de travail sont planifiées sur les nœuds du pool de nœuds utilisateur spot ?