Ajouter un pool de nœuds Azure Spot à un cluster Azure Kubernetes Service (AKS)

Dans cet article, vous ajoutez un pool de nœuds Spot secondaire à un cluster Azure Kubernetes Service (AKS) existant.

Un pool de nœuds spot est un pool de nœuds associé à un groupe de machines virtuelles identiques spot d’Azure. Avec les machines virtuelles Spot dans votre cluster AKS, vous pouvez tirer parti de la capacité Azure inutilisée avec des économies significatives. La quantité de capacité inutilisée disponible varie en fonction de nombreux facteurs, notamment la taille des nœuds, la région et l’heure de la journée.

Lorsque vous déployez un pool de nœuds Spot, Azure alloue les nœuds Spot s’il existe une capacité disponible et déploie un groupe identique Spot qui sauvegarde le pool de nœuds Spot dans un seul domaine par défaut. Il n’existe aucun contrat de niveau de service pour les nœuds Spot. Il n’existe aucune garantie de haute disponibilité. Si Azure a besoin de récupérer de la capacité, l’infrastructure Azure exclut les nœuds spot.

Les nœuds spot sont idéaux pour les charges de travail qui peuvent gérer les interruptions, les arrêts prématurés ou les évictions. Par exemple, les charges de travail telles que les travaux de traitement par lots, les environnements de développement et de test ainsi que les charges de calcul importantes peuvent se révéler de bons candidats pour la planification sur un pool de nœuds spot.

Avant de commencer

  • Cet article suppose une compréhension élémentaire des concepts de Kubernetes et d’Azure Load Balancer. Pour plus d’informations, consultez Concepts de base de Kubernetes pour AKS (Azure Kubernetes Service).
  • Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
  • Lorsque vous créez un cluster pour utiliser un pool de nœuds Spot, le cluster en question doit utiliser Virtual Machine Scale Sets pour les pools de nœuds et l’équilibreur de charge de référence SKU Standard. Vous devez également ajouter un autre pool de nœuds après avoir créé votre cluster, qui est couvert par ce tutoriel.
  • Pour les besoins de cet article, vous devez exécuter Azure CLI version 2.14 ou ultérieure. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

Limites

Les limitations suivantes s’appliquent lorsque vous créez et gérez les clusters AKS avec un pool de nœuds Spot :

  • Un pool de nœuds Spot ne peut pas être un pool de nœuds par défaut, il ne peut être utilisé qu’en tant que pool secondaire.
  • Vous ne pouvez pas mettre à jour le plan de contrôle et les pools de nœuds en même temps. Vous devez les mettre à niveau séparément, ou supprimer le pool de nœuds Spot pour mettre à niveau le plan de contrôle et les pools de nœuds restants en même temps.
  • Un pool de nœuds Spot doit utiliser Virtual Machine Scale Sets.
  • Vous ne pouvez pas changer ScaleSetPriority ou SpotMaxPrice après la création.
  • Lors de la définition de SpotMaxPrice, la valeur doit être -1 ou une valeur positive allant jusqu’à cinq décimales.
  • Un pool de nœuds spot a l’étiquette kubernetes.azure.com/scalesetpriority:spot, la teinte kubernetes.azure.com/scalesetpriority=spot:NoSchedule et les pods système présentent une anti-affinité.
  • Vous devez ajouter une tolérance et une affinité correspondantes pour planifier des charges de travail sur un pool de nœuds Spot.

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

Lors de l’ajout d’un pool de nœuds Spot à un cluster existant, il doit s’agir d’un cluster avec plusieurs pools de nœuds activés. Lorsque vous créez un cluster AKS avec plusieurs pools de nœuds activés, vous créez un pool de nœuds avec un priority de Regular par défaut. Pour ajouter un pool de nœuds Spot, vous devez spécifier Spot comme valeur pour priority. Pour plus d’informations sur la création d’un cluster AKS avec plusieurs pools de nœuds, consultez Utiliser plusieurs pools de nœuds.

  • Créez un pool de nœuds avec une priority de Spot à l’aide de la commande az aks nodepool add.

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

Dans la commande précédente, l'option priority de Spot fait de la réserve de nœuds une réserve de nœuds Spot. Le paramètre eviction-policy est défini sur Delete, qui est la valeur par défaut. Lorsque vous affectez à eviction-policy la valeur Delete, les nœuds du groupe identique sous-jacent du pool de nœuds sont supprimés lorsqu’ils sont éliminés.

Vous pouvez également définir la politique d'éviction sur Deallocate, ce qui signifie que les nœuds du groupe identique sous-jacent sont définis sur l’état stopped-deallocated lors de l’éviction. Les nœuds dans l’état stopped-deallocated sont comptabilisés dans votre quota de calcul, et peuvent provoquer des problèmes de mise à l’échelle ou de mise à niveau du cluster. Les valeurs de priority et de eviction-policy ne peuvent être définies que pendant la création du pool de nœuds. Ces valeurs ne peuvent pas être mises à jour ultérieurement.

La commande précédente active également la mise à l’échelle automatique de cluster, qu’il est recommandée d’utiliser avec des pools de nœuds spot. En fonction des charges de travail en cours d’exécution dans votre cluster, la mise à l’échelle automatique de cluster augmente ou diminue le nombre de nœuds. Pour les pools de nœuds Spot, la mise à l’échelle automatique de cluster augmente le nombre de nœuds après une éviction, si des nœuds supplémentaires sont toujours nécessaires. Si vous modifiez le nombre maximal de nœuds dont un pool de nœuds peut disposer, vous devez également ajuster la valeur de maxCount qui est associée à la mise à l’échelle automatique de cluster. Si vous n’utilisez pas de mise à l’échelle automatique de cluster, en cas d’éviction, le pool Spot finira par diminuer jusqu’à 0 et nécessitera une opération manuelle pour recevoir des nœuds Spot supplémentaires.

Important

Planifiez uniquement les charges de travail sur les pools de nœuds Spot capables de gérer les interruptions, tels que les travaux de traitement par lots et les environnements de test. Nous vous recommandons de configurer des teintes et des tolérances sur votre pool de nœuds spot pour vous assurer que seules les charges de travail pouvant gérer les évictions de nœuds sont planifiées sur un pool de nœuds spot. Par exemple, la commande ci-dessus ajoute une teinte de kubernetes.azure.com/scalesetpriority=spot:NoSchedule, de telle sorte que seuls les pods avec une tolérance correspondante sont planifiés sur ce nœud.

Vérifier le pool de nœuds Spot

  • Vérifiez que votre pool de nœuds a été ajouté à l’aide de la commande az aks nodepool show et en confirmant que scaleSetPriority est Spot.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

Planifier l’exécution d’un pod sur le nœud Spot

Pour planifier l’exécution d’un pod sur un nœud Spot, vous pouvez ajouter une tolérance et une affinité de nœud qui correspondent à la teinte appliquée à votre nœud Spot.

L’exemple suivant montre une partie d’un fichier YAML qui définit une tolérance qui correspond à la teinte kubernetes.azure.com/scalesetpriority=spot:NoSchedule et une affinité de nœuds qui correspond à l’étiquette kubernetes.azure.com/scalesetpriority=spot utilisée à l’étape précédente avec les règles d’affinité de nœuds requiredDuringSchedulingIgnoredDuringExecution et preferredDuringSchedulingIgnoredDuringExecution :

spec:
  containers:
  - name: spot-example
  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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Lorsqu’un pod avec cette tolérance et cette affinité de nœuds est déployé, Kubernetes planifie le pod sur les nœuds avec la teinte et l’étiquette appliquées. Dans cet exemple, les règles suivantes s'appliquent :

  • Le nœud doit avoir une étiquette avec la clé kubernetes.azure.com/scalesetpriority, et la valeur de cette étiquette doit être spot.
  • Il est préférable que le nœud ait une étiquette avec la clé another-node-label-key, et la valeur de cette étiquette doit être another-node-label-value.

Pour plus d'informations, voir Attribuer des pods à des nœuds.

Mettre à niveau un pool de nœuds Spot

Lors de la mise à niveau d’un pool de nœuds Spot, AKS émet en interne un cordon et un avis d’éviction, mais aucun drain n’est appliqué. Il n’existe aucun nœud d’augmentation disponible pour les mises à niveau du pool de nœuds Spot. En dehors de ces modifications, le comportement lors de la mise à niveau des pools de nœuds Spot est cohérent avec d’autres types de pool de nœuds.

Pour plus d’informations sur la mise à niveau, consultez Mettre à niveau un cluster AKS.

Prix maximal pour un pool Spot

Les tarifs des instances Spot sont variables, en fonction de la région et de la référence SKU. Pour plus d’informations, consultez les informations sur les prix pour Linux et Windows.

En raison de la variabilité des tarifs, vous avez la possibilité de définir un prix maximal en dollars américains (USD) ayant jusqu’à cinq décimales. Par exemple, la valeur 0,98765 correspond à un prix maximal de 0,98765 dollars US par heure. Si vous définissez -1 comme prix maximal, l’instance n’est pas supprimée en fonction du prix. Tant que la capacité et le quota sont disponibles, le prix de l’instance sera le prix le plus bas du prix actuel d’une instance Spot ou d’un instance standard.

Étapes suivantes

Dans cet article, vous avez appris à ajouter un pool de nœuds Spot à un cluster AKS. Pour plus d’informations sur la façon de contrôler les pods entre les pools de nœuds, consultez Bonnes pratiques relatives aux fonctionnalités avancées du planificateur dans AKS.