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

Effectué

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.

Rappelez-vous, dans l’exemple de suivi de drones, du développement par votre équipe d’un nouveau service de modélisation prédictive qui traite les informations de plans de vol dans des conditions météorologiques extrêmes et crée des itinéraires de vol optimaux. 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 ensuite configurer le cluster pour prendre en charge plusieurs pools de nœuds et permettre aux clusters de mettre à l’échelle les nœuds dans les pools de nœuds. Ensuite, vous ajoutez un deuxième pool de nœuds pour prendre des charges de travail utilisateur avec un nombre de nœuds dynamiques. Enfin, vous effectuez une mise à l’échelle sur zéro du nombre de nœuds pour réduire le coût des nœuds utilisés 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 réutilisez les valeurs créées ici tout au long des exercices de ce module. Enregistrez la sortie pour l’utiliser ultérieurement.

  3. Choisissez une région pour héberger votre groupe de ressources. Les fonctionnalités des exercices d’après ne sont pas disponibles dans toutes les régions. C’est pourquoi nous vous recommandons d’utiliser eastus comme région. Si vous choisissez d’utiliser une valeur différente, changez la valeur de REGION_NAME.

    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 le terminal Cloud Shell et sélectionnez Coller ou utilisez le raccourci clavier Maj+Inser (⌘+V sur macOS).

    Vous pouvez vérifier chaque valeur en exécutant la commande echo, par exemple echo $REGION_NAME.

  4. Notez votre AKS_CLUSTER_NAME. Tout au long des exercices, vous utilisez cette valeur pour les paramètres de nettoyage et de configuration de votre cluster.

    echo $AKS_CLUSTER_NAME
    
  5. Créez un groupe de ressources nommé rg-akscostsaving. Vous 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

Avec le groupe de ressources créé, vous pouvez créer des clusters AKS au sein du groupe. La première étape consiste à obtenir la version de Kubernetes dans la région que vous avez sélectionnée. Cette version est définie pour configurer votre cluster.

  1. Pour obtenir la version de Kubernetes, exécutez la commande az aks get-versions. La requête suivante retourne une version de Kubernetes qui n’est pas une préversion. Stockez cette valeur dans une variable Bash appelé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 "values[?isPreview==null].version | [-1]" \
        --output tsv)
    echo $VERSION
    
  2. Exécutez la commande az aks create pour créer le cluster AKS. Le cluster s’exécute avec deux nœuds dans le pool de nœuds système. Cette commande peut prendre quelques minutes.

    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
    

    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.

    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. Rappelez-vous de la description précédente que 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 automatiquement attribué.

Ajouter un pool de nœuds

  1. Votre cluster a un seul pool de nœuds. Ajoutez un deuxième pool de nœuds en exécutant la commande az aks nodepool add. Exécutez 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

Vous exécutez la commande az aks nodepool scale pour effectuer une mise à l’échelle manuelle des nœuds d’un pool de nœuds.

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 définie sur 0 et que la valeur enableAutoScaling est définie sur null. Pour planifier des charges de travail, vous devez augmenter manuellement le nombre de nœuds pour ce pool de nœuds parce que la création de nœuds ne se produit pas automatiquement par défaut.

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. Exécutez 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. Exécutez la commande az aks get-credentials pour configurer le contexte 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. Répertoriez les nœuds de vos pools de nœuds.

    kubectl get nodes
    

    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.