Utiliser des répulsions de nœud dans un cluster Azure Kubernetes Service (AKS)

Cet article décrit comment utiliser des répulsions de nœud dans un cluster Azure Kubernetes Service (AKS)

Vue d’ensemble

Le mécanisme de planification d’AKS est chargé de placer des pods sur des nœuds et il est basé sur le planificateur Kubernetes en amont, kube-scheduler. Vous pouvez contraindre un pod à s’exécuter sur des nœuds particuliers en attachant les pods à un ensemble de nœuds via l’affinité de nœud ou en demandant au nœud de repousser un ensemble de pods en utilisant des répulsions de nœud, qui interagissent avec le planificateur AKS.

Les répulsions de nœud fonctionnent en marquant un nœud afin que le planificateur évite de placer certains pods sur les nœuds marqués. Vous pouvez placer des tolérances sur un pod pour permettre au planificateur de planifier ce pod sur un nœud avec une répulsion correspondante. Les répulsions et les tolérances fonctionnent ensemble pour vous aider à contrôler la façon dont le planificateur place les pods sur des nœuds. Pour plus d’informations, consultez les exemple de cas d’usage des répulsions et des tolérances.

Les répulsions sont des paires clé-valeur avec un effet. Il existe trois valeurs pour le champ d’effet lors de l’utilisation de répulsions de nœud : NoExecute, NoSchedule et PreferNoSchedule.

  • NoExecute : les pods déjà en cours d’exécution sur le nœud sont immédiatement évincés s’ils n’ont pas une tolérance correspondante. Si un pod a une tolérance correspondante, il peut être évincé si des tolerationSeconds sont spécifiées.
  • NoSchedule : seuls des pods avec une tolérance correspondante sont placés sur ce nœud. Les pods existants ne sont pas évincés.
  • PreferNoSchedule : le planificateur évite de placer des pods qui n’ont pas une tolérance correspondante.

Options des répulsions de nœud

Il existe deux types de répulsion de nœud qui peuvent être appliquées à vos nœuds AKS : les répulsions de nœud et les répulsions d’initialisation de nœud.

  • Les répulsions de nœud sont destinées à rester en permanence sur le nœud pour planifier les pods avec une affinité de nœud. Les répulsions de nœud peuvent être ajoutées, mises à jour ou supprimées complètement seulement avec l’API AKS.
  • Les répulsions d’initialisation de nœud sont placées sur le nœud au moment du démarrage et sont destinées à être utilisées temporairement, comme dans des scénarios où vous avez besoin de plus de temps pour configurer vos nœuds. Vous pouvez supprimer les répulsions d’initialisation de nœud en utilisant l’API Kubernetes ; elles ne sont pas garanties pendant la durée du cycle de vie du nœud. Elles apparaissent seulement une fois qu’un nœud fait l’objet d’un scale-up ou qu’il est mis à niveau/réinitialisé. Les nouveaux nœuds conservent la répulsion d’initialisation de nœud après une mise à l’échelle. Les répulsions d’initialisation de nœud apparaissent sur tous les nœuds après une mise à niveau. Si vous voulez supprimer complètement les répulsions d’initialisation, vous pouvez le faire en utilisant l’API AKS après avoir supprimé les répulsions des nœuds avec l’API Kubernetes. Une fois que vous avez supprimé les répulsions d’initialisation de la spécification du cluster en utilisant l’API AKS, les nœuds nouvellement créés le sont sans ces répulsions d’initialisation. Si la répulsion d’initialisation est encore présente sur des nœuds existants, vous pouvez la supprimer définitivement en effectuant une opération de mise à niveau de l’image de nœud.

Remarque

Les répulsions et les étiquettes de nœud appliquées en utilisant l’API de pool de nœuds AKS ne sont pas modifiables depuis l’API Kubernetes, et vice-versa. Les modifications apportées aux répulsions système ne sont pas autorisées.

Ceci ne s’applique pas aux répulsions d’initialisation de nœud.

Utiliser des répulsions de nœud

Prérequis

Cet article suppose que vous disposez d’un cluster AKS. Si vous avez besoin d’un cluster AKS, vous pouvez en créer un en utilisant Azure CLI, Azure PowerShell ou le Portail Azure.

Créer un pool de nœuds avec une répulsion de nœud

  1. Créez un pool de nœuds avec une répulsion en utilisant la commande az aks nodepool add et utilisez le paramètre --node-taints afin de spécifier sku=gpu:NoSchedule pour la répulsion.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 1 \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Vérifiez l’état du pool de nœuds.

  3. Vérifiez que la répulsion est définie sur le nœud.

Mettre à jour un pool de nœuds pour ajouter une répulsion de nœud

  1. Mettez à jour un pool de nœuds pour ajouter une répulsion de nœud en utilisant la commande az aks nodepool update et utilisez le paramètre --node-taints afin de spécifier sku=gpu:NoSchedule pour la répulsion.

    az aks nodepool update \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Vérifiez l’état du pool de nœuds.

  3. Vérifiez que la répulsion a été définie sur le nœud.

Utiliser des répulsions d’initialisation de nœud (préversion)

Important

Les fonctionnalités d’évaluation AKS sont disponibles en libre-service et font l’objet d’un abonnement. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Les préversions AKS sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

Conditions préalables et limitations

  • La version 3.0.0b3 ou ultérieure d’Azure CLI doit être installée et configurée. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
  • Vous pouvez appliquer des répulsions d’initialisation seulement via la création ou la mise à niveau du cluster lors de l’utilisation de l’API AKS. Si vous utilisez des modèles ARM, vous pouvez spécifier des répulsions d’initialisation de nœud lors de la création et de la mise à jour du pool de nœuds.
  • Vous ne pouvez pas appliquer de répulsions d’initialisation à des pools de nœuds Windows en utilisant Azure CLI.

Obtenir les informations d’identification de votre cluster

  • Obtenez les informations d’identification de votre cluster AKS à l’aide de la commande az aks get-credentials.

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

Installez l’extension Azure CLI aks-preview.

  • Inscrivez ou mettez à jour l’extension aks-preview à l’aide de la commande az extension add ou az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Inscrire l’indicateur de fonctionnalité NodeInitializationTaintsPreview

  1. Inscrivez l’indicateur de fonctionnalité NodeInitializationTaintsPreview à l’aide de la commande az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Quelques minutes sont nécessaires pour que l’état s’affiche Registered (Inscrit).

  2. Vérifiez l’état de l’inscription en utilisant la commande az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Quand l’état reflète Inscrit, actualisez l’inscription du fournisseur de ressources Microsoft.ContainerService à l’aide de la commande az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Créer un cluster avec une répulsion d’initialisation de nœud

  1. Créez un cluster avec une répulsion d’initialisation de nœud en utilisant la commande az aks create et le paramètre --node-initialization-taints afin de spécifier sku=gpu:NoSchedule pour la répulsion.

    Important

    Les répulsions d’initialisation de nœud que vous spécifiez s’appliquent à tous les pools de nœuds du cluster. Pour appliquer la répulsion d’initialisation à un nœud spécifique, vous pouvez utiliser un modèle ARM au lieu de l’interface CLI.

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. Vérifiez l’état du pool de nœuds.

  3. Vérifiez que la répulsion est définie sur le nœud.

Mettre à jour un cluster pour ajouter une répulsion d’initialisation de nœud

  1. Mettez à jour un cluster pour ajouter une répulsion d’initialisation de nœud en utilisant la commande az aks update et le paramètre --node-initialization-taints afin de spécifier sku=gpu:NoSchedule pour la répulsion.

    Important

    Lors de la mise à jour d’un cluster avec une répulsion d’initialisation de nœud, les répulsions s’appliquent à tous les pools de nœuds du cluster. Vous pouvez voir les mises à jour des répulsions d’initialisation de nœud sur le nœud après une opération de réinitialisation.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Vérifiez l’état du pool de nœuds.

  3. Vérifiez que la répulsion est définie sur le nœud.

Vérifier l’état du pool de nœuds

  • Après avoir appliqué la répulsion ou la répulsion d’initialisation de nœud, vérifiez l’état du pool de nœuds en utilisant la commande az aks nodepool list.

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    Si vous avez appliqué des répulsions de nœud, l’exemple de sortie suivant montre que le pool de nœuds <node-pool-name> crée (Creating) des nœuds avec les nodeTaints spécifiés :

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

    Si vous avez appliqué des répulsions d’initialisation de nœud, l’exemple de sortie suivant montre que le pool de nœuds <node-pool-name> crée (Creating) des nœuds avec les nodeInitializationTaints spécifiés :

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeInitializationTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

Vérifier que la répulsion est définie sur le nœud

  • Vérifiez les répulsions de nœud et les répulsions d’initialisation de nœud dans la configuration des nœuds en utilisant la commande kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Si vous avez appliqué des répulsions de nœud, l’exemple de sortie suivant montre que le pool de nœuds <node-pool-name> a les Taints spécifiés :

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

Supprimer des répulsions de nœud

Supprimer une répulsion de nœud spécifique

  • Supprimez des répulsions de nœud en utilisant la commande az aks nodepool update. L’exemple de commande suivant supprime la répulsion de nœud "sku=gpu:NoSchedule" du pool de nœuds.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --node-taints "sku=gpu:NoSchedule"
    

Supprimer toutes les répulsions de nœud

  • Supprimez toutes les répulsions de nœud d’un pool de nœuds en utilisant la commande az aks nodepool update. L’exemple de commande suivant supprime toutes les répulsions de nœud du pool de nœuds.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NODE_POOL_NAME \
    --node-taints ""
    

Supprimer des répulsions d’initialisation de nœud

Vous disposez des options suivantes pour supprimer les répulsions d’initialisation de nœud sur le nœud :

  • Supprimer temporairement les répulsions d’initialisation de nœud en utilisant l’API Kubernetes. Si vous les supprimez de cette façon, les répulsions réapparaissent après la mise à l’échelle ou la mise à niveau des nœuds. Les nouveaux nœuds conservent la répulsion d’initialisation de nœud après une mise à l’échelle. Les répulsions d’initialisation de nœud apparaissent sur tous les nœuds après une mise à niveau.
  • Supprimer définitivement les répulsions d’initialisation de nœud en supprimant les répulsions du nœud avec l’API Kubernetes, puis en supprimant la répulsion avec l’API AKS. Une fois que les répulsions d’initialisation sont supprimées des spécifications du cluster en utilisant l’API AKS, les nœuds nouvellement créés après des opérations de réinitialisation n’ont plus de répulsions d’initialisation.

Quand vous supprimez toutes les occurrences de répulsions d’initialisation des réplicas du pool de nœuds, la répulsion d’initialisation existante va réapparaître après une mise à niveau avec les nouvelles répulsions d’initialisation.

Supprimer temporairement des répulsions d’initialisation de nœud

  • Supprimez temporairement les répulsions d’initialisation de nœud en utilisant la commande kubectl taint nodes.

    Cette commande supprime la répulsion seulement sur le nœud spécifié. Si vous voulez supprimer la répulsion de chaque nœud du pool de nœuds, vous devez exécuter la commande pour chaque nœud dont vous voulez supprimer la répulsion.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Une fois qu’elles sont supprimées, les répulsions d’initialisation de nœud réapparaissent après la mise à l’échelle ou la mise à niveau des nœuds.

Supprimer définitivement des répulsions d’initialisation de nœud

  1. Suivez les étapes de Supprimer temporairement des répulsions d’initialisation de nœud pour supprimer la répulsion d’initialisation de nœud en utilisant l’API Kubernetes.

  2. Supprimez la répulsion du nœud en utilisant l’API AKS avec la commande az aks update. Cette commande supprime la répulsion d’initialisation de nœud pour chaque nœud du cluster.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints ""
    

Vérifier que la répulsion a été supprimée du nœud

  • Vérifiez les répulsions de nœud et les répulsions d’initialisation de nœud dans la configuration des nœuds en utilisant la commande kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Si vous avez supprimé une répulsion de nœud, l’exemple de sortie suivant montre que le pool de nœuds <node-pool-name> n’a plus la répulsion qui a été supprimée sous Taints :

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

Étapes suivantes