Exercice : configurer des pools de nœuds spot avec l’autoscaler de cluster sur un cluster AKS
Les pools de nœuds d’utilisateur spot vous permettent d’accéder à une capacité de calcul Azure inutilisée à prix réduit avec prise en charge des scénarios de calcul hautes performances.
Dans l’exercice précédent, vous avez créé un pool de nœuds utilisateur standard, vous avez utilisé l’autoscaler de cluster pour gérer la création de nœuds, et vous avez mis à l’échelle manuellement le nombre de nœuds.
L’étape suivante consiste à ajouter un pool de nœuds utilisateur spot avec une mise à l’échelle automatique pour réduire les coûts opérationnels de votre cluster. L’utilisation des clusters varie en fonction des ressources nécessaires et n’est pas prévisible : vous configurez donc des règles pour détecter les pics et les creux. La charge de travail est déployée avec affinité de nœud activée afin que le pod soit planifié sur des nœuds du pool de nœuds spot.
Créer un pool de nœuds spot
Vous devez créer un pool de nœuds distinct qui prend en charge le service de traitement par lots. Ce pool de nœuds est un pool de nœuds spot qui utilise la stratégie d’éviction Supprimer et applique un prix maximal de -1.
Exécutez la même commande
az aks nodepool add
que dans l’exercice précédent pour ajouter un nouveau pool de nœuds spot à votre cluster. Vous devez modifier le nom du pool de nœuds et ajouter quelques paramètres supplémentaires pour identifier ce pool de nœuds en tant que pool de nœuds spot.Entrez les valeurs suivantes pour définir les paramètres du pool de nœuds :
- Nom :
batchprocpl2
- Priorité :
Spot
- Stratégie d’éviction :
Delete
- Prix maximal de spot :
-1
Exécutez la commande suivante pour créer le pool de nœuds spot :
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2 \ --enable-cluster-autoscaler \ --max-count 3 \ --min-count 1 \ --priority Spot \ --eviction-policy Delete \ --spot-max-price -1 \ --node-vm-size Standard_DS2_v2 \ --no-wait
Gardez à l’esprit que cette demande peut échouer en raison de restrictions de capacité dans l’emplacement que vous avez sélectionné.
- Nom :
Exécutez la commande
az aks nodepool show
pour afficher les détails du nouveau pool de nœuds spot du service de traitement par lots :az aks nodepool show \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2
Voici un exemple de sortie de la commande.
{ "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 3, "enableAutoScaling": true, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2", "maxCount": 3, "maxPods": 110, "minCount": 1, "mode": "User", "name": "batchprocpl2", "nodeImageVersion": "AKSUbuntu-1604-2020.06.10", "nodeLabels": { "kubernetes.azure.com/scalesetpriority": "spot" }, "nodeTaints": [ "kubernetes.azure.com/scalesetpriority=spot:NoSchedule" ], "orchestratorVersion": "1.17.9", "osDiskSizeGb": 128, "osType": "Linux", "provisioningState": "Creating", "proximityPlacementGroupId": null, "resourceGroup": "akscostsavinggrp", "scaleSetEvictionPolicy": "Delete", "scaleSetPriority": "Spot", "spotMaxPrice": -1.0, "tags": null, "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }
Ce résultat contient quelques valeurs qui diffèrent clairement de ce que vous avez vu dans les pools de nœuds précédents. Examinons ces éléments :
La valeur de la propriété
enableAutoScaling
est définie surtrue
.Les valeurs
maxCount
etminCount
sont toutes deux définies.La propriété
scaleSetEvictionPolicy
est définie surDelete
.La propriété
scaleSetPriority
est définie surSpot
.La propriété
spotMaxPrice
est définie sur-1
.Les valeurs
nodeLabels
etnodeTaints
sont appliquées à ce pool de nœuds. Vous utilisez ces valeurs pour planifier des charges de travail sur les nœuds du pool de nœuds.
Configurer un espace de noms
Exécutez la commande
kubectl create namespace
pour créer un espace de noms appelécostsavings
pour l’application. Vous allez utiliser cet espace de noms pour faciliter la sélection de vos charges de travail.kubectl create namespace costsavings
Voici le résultat de la commande précédente :
namespace/costsavings created
Planifier un pod avec affinité de nœud spot
Vous pouvez planifier l’exécution d’un pod sur un nœud spot en ajoutant une tolérance et une affinité au fichier manifeste de déploiement du pod. Lorsque la tolérance et l’affinité de nœud correspondent au rejet et à l’étiquette appliqués à vos nœuds spot, le pod est planifié sur ces nœuds.
Les nœuds d’un pool de nœuds spot se voient attribuer un rejet égal à kubernetes.azure.com/scalesetpriority=spot:NoSchedule
et une étiquette égale à kubernetes.azure.com/scalesetpriority=spot
. Utilisez les informations de cette paire clé-valeur dans la section tolerations
et affinity
de votre fichier manifeste YAML des charges de travail. Avec le deuxième pool de traitement par lots configuré en tant que pool de nœuds spot, vous pouvez désormais créer un fichier de déploiement pour planifier des charges de travail à exécuter sur ce pool.
Créez un fichier manifeste pour le déploiement Kubernetes appelé
spot-node-deployment.yaml
avec l’éditeur intégré :code spot-node-deployment.yaml
Conseil
Cloud Shell comprend un éditeur de fichier intégré. L’éditeur Cloud Shell prend en charge des fonctionnalités comme le surlignage du langage, la palette de commandes et l’explorateur de fichiers. Pour créer et modifier des fichiers simples, démarrez l’éditeur en exécutant
code .
dans le terminal Cloud Shell. Cette action ouvre l’éditeur avec votre répertoire de travail actif défini dans le terminal. Pour ouvrir directement votre fichier manifeste à des fins d’édition rapide, exécutezcode spot-node-deployment.yaml
. Cette commande ouvre l’éditeur sans l’explorateur de fichiers.Collez le texte suivant dans le fichier :
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"
Appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour fermer l’éditeur.
Exécutez la commande
kubectl apply
pour appliquer la configuration et déployer l’application dans l’espace de nomscostsavings
:kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
Voici le résultat de la commande précédente :
pod/nginx created
Vous pouvez obtenir plus d’informations sur le pod en cours d’exécution en utilisant l’indicateur
-o wide
lors de l’exécution de la commandekubectl get pods
. Dans ce cas, vous pouvez voir le nœud sur lequel le pod est planifié. Veillez à interroger les pods dans l’espace de nomscostsavings
.kubectl get pods --namespace costsavings -o wide
La sortie doit ressembler à ce qui suit :
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 43s 10.244.3.3 aks-batchprocpl2-25254417-vmss000000 <none> <none>
Notez le nom du nœud,
aks-batchprocpl2-25254417-vmss000000
. Ce nœud fait partie du pool de nœuds spotbatchprocpl2
que vous avez créé précédemment.