Exercice : configurer plusieurs nœuds et activer la mise à l’échelle de zéro sur un cluster AKS

Le service Azure Kubernetes vous permet de créer des pools de nœuds différents pour faire correspondre des charges de travail spécifiques aux nœuds en cours d’exécution dans chaque pool de nœuds.

Reprenons l’exemple de suivi de drones. Votre équipe a développé un nouveau service de modélisation prédictive qui traite les informations de trajectoire de vol dans des conditions météorologiques extrêmes et crée des trajectoires de vol optimales. Ce service requiert la prise en charge de machines virtuelles basées sur GPU et ne s’exécute que certains jours de la semaine. L’équipe veut s’assurer qu’aucune machine virtuelle n’est utilisée quand le service ne s’exécute pas.

Ici, vous allez créer un cluster Kubernetes géré par Azure Kubernetes Service (AKS). Vous allez configurer le cluster pour prendre en charge plusieurs pools de nœuds et vous assurer que le cluster vous permet de mettre à l’échelle les nœuds dans les pools de nœuds. Ensuite, vous allez ajouter un deuxième pool de nœuds pour prendre les charges de travail utilisateur. Enfin, vous allez mettre à l’échelle de zéro le nombre de nœuds dans le deuxième pool de nœuds pour réduire le coût du nœud utilisé dans votre cluster AKS.

Créer un groupe de ressources

  1. Connectez-vous à Azure Cloud Shell à l’aide de votre compte Azure. Sélectionnez la version Bash de Cloud Shell.

  2. Vous allez réutiliser certaines valeurs des exercices de ce module. Par exemple, vous devez choisir une région dans laquelle créer un groupe de ressources. Il se peut que certaines fonctionnalités que vous allez ajouter dans des exercices ultérieurs ne soient pas disponibles dans la région que vous sélectionnez. Dès lors, nous vous recommandons de sélectionner USA Est. Si vous choisissez une autre valeur, n’oubliez pas de noter la valeur à utiliser avec les exercices de ce module.

    Exécutez les commandes suivantes pour inscrire vos variables :

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    Conseil

    Vous pouvez utiliser le bouton Copier pour copier des commandes dans le Presse-papiers. Pour coller, cliquez avec le bouton droit sur une nouvelle ligne dans la fenêtre Cloud Shell et sélectionnez Coller, ou utilisez le raccourci clavier Maj+Inser (⌘+V sur macOS).

    Vous pouvez vérifier chaque valeur à l’aide de la commande echo, par exemple echo $REGION_NAME.

  3. Notez le nom de votre nouveau cluster. Vous allez utiliser cette valeur ultérieurement, lorsque vous nettoierez les ressources, et dans les paramètres de configuration du cluster.

    echo $AKS_CLUSTER_NAME
    
  4. Créez un groupe de ressources nommé rg-akscostsaving. Déployez toutes les ressources créées dans ces exercices dans ce groupe de ressources. Un groupe de ressources unique facilite le nettoyage des ressources une fois le module terminé.

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

Créer le cluster AKS

Une fois le groupe de ressources en place, vous pouvez créer le cluster AKS. La première étape consiste à obtenir la version la plus récente, hors préversion, de Kubernetes dans la région que vous avez sélectionnée. Vous allez utiliser cette version lors la configuration du cluster.

  1. Pour obtenir la version la plus récente, hors préversion, de Kubernetes, utilisez la commande az aks get-versions. Stockez la valeur retournée par la commande dans une variable Bash nommée VERSION. Pour récupérer et stocker le numéro de version, exécutez la commande suivante :

    VERSION=$(az aks get-versions \
        --location $REGION_NAME \
        --query 'orchestrators[?!isPreview] | [-1].orchestratorVersion' \
        --output tsv)
    
  2. Exécutez la commande az aks create présentée plus loin dans cette étape pour créer le cluster AKS. Le cluster exécutera la dernière version de Kubernetes avec deux nœuds dans le pool de nœuds système. Cette commande peut prendre quelques minutes.

    La commande az aks create possède plusieurs paramètres qui permettent une configuration précise de votre cluster Kubernetes. Il existe deux paramètres importants pour la configuration de la prise en charge correcte dans votre cluster de la mise à l’échelle et de pools de nœuds multiples :

    Paramètre et valeur Description
    --load-balancer-sku standard La prise en charge de l’équilibreur de charge par défaut dans AKS est basic. L’équilibreur de charge basic n’est pas pris en charge lorsque vous utilisez des pools de nœuds multiples. Définissez la valeur sur standard.
    --vm-set-type VirtualMachineScaleSets Dans AKS, l’utilisation des fonctionnalités de mise à l’échelle implique des groupes de machines virtuelles identiques. Ce paramètre active la prise en charge des groupes identiques.
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    Notez que deux nœuds sont configurés dans le pool de nœuds par défaut à l’aide du paramètre --node-count 2. Comme nous l’avons vu précédemment, les services système essentiels s’exécutent dans ce pool de nœuds système. Il est important que les clusters de production utilisent au moins --node-count 3 pour garantir la fiabilité des opérations du cluster. Nous n’utilisons ici que deux nœuds compte tenu des coûts dans cet exercice.

  3. Exécutez la commande az aks nodepool list pour répertorier les pools de nœuds de votre nouveau cluster :

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Voici un exemple de sortie de la commande :

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Notez que le mode du pool de nœuds est défini sur System et que le name est attribué automatiquement.

Ajouter un pool de nœuds

  1. Votre cluster a un seul pool de nœuds. Ajoutez un deuxième pool de nœuds à l’aide de la commande az aks nodepool add. Utilisez la commande de cette étape pour créer un pool de nœuds utilisateur avec trois nœuds et le nom batchprocpl. Gardez à l’esprit que les noms de pools de nœuds doivent commencer par une lettre minuscule et ne contenir que des caractères alphanumériques. Les noms de pools de nœuds sont limités à 12 caractères pour les pools de nœuds Linux et à six caractères pour les pools de nœuds Windows.

    Exécutez la commande suivante :

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. Exécutez la commande az aks nodepool list pour afficher le nouveau pool de nœuds dans votre nouveau cluster :

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Voici un exemple de sortie de la commande :

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Notez que le mode du pool de nœuds est défini sur User et que le name est batchprocpl.

Mettre à l’échelle de zéro le nombre de nœuds du pool

Utilisez la commande az aks nodepool scale pour mettre à l’échelle manuellement les nœuds d’un pool.

Exécutez la commande az aks nodepool scale et utilisez le paramètre --node-count pour définir la valeur 0 pour le nombre de nœuds.

Voici un exemple de la commande :

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

Voici un exemple de sortie de la commande :

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

Notez que la valeur du paramètre count du pool de nœuds est 0 et que la valeur enableAutoScaling est null dans le résultat retourné. Vous devez augmenter manuellement le nombre de nœuds pour ce pool de nœuds lorsque vous avez besoin de planifier des charges de travail ici, car la création de nœuds ne se produit pas automatiquement.

Configurer le contexte Kubernetes

Dans la sortie de la commande précédente, le nombre de pools de nœuds a la valeur 0. Vous pouvez vérifier les nœuds disponibles dans le cluster en exécutant la commande kubectl get nodes.

  1. Vous utilisez kubectl pour interagir avec le serveur d’API de votre cluster. Vous devez configurer un contexte de cluster Kubernetes pour autoriser kubectl à se connecter. Le contexte contient l’adresse du cluster, un utilisateur et un espace de noms. Utilisez la commande az aks get-credentials pour configurer le contexte du Kubernetes dans Cloud Shell.

    Récupérez les informations d’identification du cluster en exécutant la commande :

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    Voici un exemple de sortie de la commande.

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. Exécutez la commande kubectl get nodes pour répertorier les nœuds dans vos pools de nœuds.

    Voici un exemple de sortie de la commande :

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    Notez que, même si la commande az aks nodepool list répertorie deux pools de nœuds, il n’y a que deux nœuds disponibles dans le cluster, qui proviennent tous deux du pool nodepool1.

Pour optimiser les coûts sur AKS lorsque vous gérez des demandes de charge de travail directement, une bonne stratégie consiste à :

  • Mettre à l’échelle manuellement le nombre de nœuds dans les pools de nœuds.
  • Mettre à l’échelle les pools de nœuds utilisateur coûteux et basés sur NV à zéro.

Examinons une stratégie dans laquelle vous devez mettre à l’échelle des nœuds, mais ne contrôlez pas directement la demande.