Exercice : configurer des pools de nœuds spot avec l’autoscaler de cluster sur un cluster AKS

Effectué

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.

  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é.

  2. 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 sur true.

    • Les valeurs maxCount et minCount sont toutes deux définies.

    • La propriété scaleSetEvictionPolicy est définie sur Delete.

    • La propriété scaleSetPriority est définie sur Spot.

    • La propriété spotMaxPrice est définie sur -1.

    • Les valeurs nodeLabels et nodeTaints 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

  1. 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.

  1. 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écutez code spot-node-deployment.yaml. Cette commande ouvre l’éditeur sans l’explorateur de fichiers.

  2. 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"
    
  3. Appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour fermer l’éditeur.

  4. Exécutez la commande kubectl apply pour appliquer la configuration et déployer l’application dans l’espace de noms costsavings :

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    Voici le résultat de la commande précédente :

    pod/nginx created
    
  5. 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 commande kubectl 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 noms costsavings.

    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 spot batchprocpl2 que vous avez créé précédemment.