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

Effectué

Les pools de nœuds utilisateur Spot vous permettent d’accéder à la capacité de calcul Azure inutilisée à des prix inférieurs grâce à la 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, utilisé l’autoscaler de cluster pour gérer la création du nœud et mis à l’échelle le nombre de nœuds manuellement.

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 du cluster varie en fonction des ressources nécessaires et n’est pas prévisible, de sorte que vous configurez des règles pour capturer les pics et les baisses. 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 az aks nodepool add commande 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 comme un 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 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
    

    N’oubliez pas que cette requête peut échouer en raison de restrictions de capacité dans l’emplacement que vous avez sélectionné.

  2. Exécutez la az aks nodepool show commande pour afficher les détails du nouveau pool de nœuds spot pour le 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
    }
    

    Quelques valeurs dans ce résultat sont distinctement différentes 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 définies.

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

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

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

    • Les nodeLabels et nodeTaints sont appliqués à 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 kubectl create namespace commande pour créer un espace de noms appelé costsavings pour l’application. Vous utiliserez cet espace de noms pour faciliter la sélection de vos charges de travail.

    kubectl create namespace costsavings
    

    Voici la sortie 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 les sections tolerations et affinity du fichier manifeste YAML de vos charges de travail. Avec le deuxième pool de traitement par lots configuré en tant que pool de nœuds spot, vous pouvez maintenant créer un fichier de déploiement pour planifier l’exécution des charges de travail.

  1. Créez un fichier manifeste pour le déploiement Kubernetes appelé spot-node-deployment.yaml à l’aide de l’éditeur intégré :

    code spot-node-deployment.yaml
    

    Conseil / Astuce

    Cloud Shell inclut un éditeur de fichiers intégré. L’éditeur Cloud Shell prend en charge les fonctionnalités telles que la mise en surbrillance du langage, la palette de commandes et l’Explorateur de fichiers. Pour la création et la modification de fichiers simples, démarrez l’éditeur en exécutant code . 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 pour la modification 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 appuyez sur Ctrl+Q pour fermer l’éditeur.

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

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

    Voici la sortie 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 le paramètre -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 ressemblerait à l’exemple suivant :

    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 batchprocpl2 pool de nœuds spot que vous avez créé précédemment.