Dans cet article, nous allons voir ensemble comment configurer un cluster Azure Kubernetes Services (AKS) pour utiliser un nodepool d’instances de type Spot.
L’intérêt de ces instances est de pouvoir bénéficier de puissance de calcul non utilisée par le fournisseur de Cloud et ainsi profiter d’un tarif avantageux sur ces instances.
Concept
Avec AKS, si vous voulez utiliser des instances Spot vous devez provisionner un nodepool de type Spot. Il n’est donc pas possible de créer un nodepool “classique” et d’y instancier des VM de type Spot (usage qui pourrait être hyper intéressant pourtant !). Tout le nodepool doit être de type spot. Prudence donc …
Comme précisé en introduction la disponibilité des machines Spot est liée à la capacité inutilisée dans Azure (d’où le coût au rabais). En revanche, dès qu’Azure a besoin de récupérer cette capacité de calcul, vos nodes de type spot seront supprimés. Je vous conseille donc d’être très prudent sur ce que vous déployez sur ce type de nodes.
Les instances spot sont idéales pour les applications qui peuvent gérer les interruptions et les arrêts aléatoires.
Pour ce type de nodes, bien sûr on oublie la notion de haute disponibilité :
- Pas d’Availability Zones ni d’Availability Set car le nodepool sera déployé dans un domaine de panne unique.
- Pas de notion de SLA (logique) car la puissance allouée à nos VM peut être récupérée à tout moment par Azure.
Quelques points d’attention complémentaires :
- Un pool de nœuds spot ne peut pas être le pool de nœuds par défaut du cluster. Après avoir créé votre cluster, vous devrez ajouter un pool de nœuds supplémentaire de type spot.
- Vous ne pouvez pas mettre à jour la version de Kubernetes sur un pool de nœuds spot. Pour cela vous devrez créer un nouveau nodepool puis supprimer l’ancien.
- Un pool de nœuds spot doit être basé sur les Virtual Machine Scale Sets et donc un load balancer sku Standard.
Implémentation
La commande ci-dessous ajoute un nodepool de type Spot à un cluster AKS existant.
az aks nodepool add --resource-group rg-aks --cluster-name akscluster --name spotnodepool --priority Spot --eviction-policy Delete --spot-max-price -1 --enable-cluster-autoscaler --min-count 1 --max-count 3 --no-wait
Ma commande active sur ce nodepool l’autoscaling des nodes du cluster. En effet, si vous ne l’utilisez pas, en cas d’éviction, le nodepool spot finira par se réduire progressivement jusqu’à ne plus contenir d’instance.
À noter également que vous ne pouvez pas modifier “priority” ou “SpotMaxPrice” après la création du nodepool (nous verrons juste après à quoi elle correspond).
Un pool de nœuds spot aura le rejet kubernetes.azure.com/scalesetpriority=spot:NoSchedule de positionné. Vous devrez donc ajouter la tolérance correspondante pour déployer des pods sur ces nodes :
spec:
containers:
- name: spot-example
tolerations:
- key: "kubernetes.azure.com/scalesetpriority"
operator: "Equal"
value: "spot"
effect: "NoSchedule"
...
Pricing
Lorsque vous souhaitez une instance spot vous avez la possibilité de renseigner un prix maximal (USD) avec jusque 5 décimales. Par exemple, la valeur 0,6789 correspond à un prix maximal de 0,6789 USD/heure. Au-delà de ce tarif, votre VM est supprimée (–eviction-policy Delete). Si vous définissez -1 comme prix maximal, l’instance n’est pas supprimée en fonction du prix. Le prix de l’instance sera le prix actuel de Spot ou le prix d’une VM standard, comme si vous elle était créée hors utilisation de Spot.
En conclusion, je conseillerai un usage mesuré et bien préparé de ce type d’instances malgré ces avantages tarifaires ! Leur volatilité reste un frein à une utilisation pour des besoins critiques.
A bientôt !
Thomas
2 réponses sur “Utiliser des instances Spot avec AKS”