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 destolerationSeconds
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
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écifiersku=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
Mettre à jour un pool de nœuds pour ajouter une répulsion de nœud
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écifiersku=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
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écutezaz --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
ouaz 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
Inscrivez l’indicateur de fonctionnalité
NodeInitializationTaintsPreview
à l’aide de la commandeaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Quelques minutes sont nécessaires pour que l’état s’affiche Registered (Inscrit).
Vérifiez l’état de l’inscription en utilisant la commande
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
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
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écifiersku=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
Mettre à jour un cluster pour ajouter une répulsion d’initialisation de nœud
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écifiersku=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"
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 lesnodeTaints
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 lesnodeInitializationTaints
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 lesTaints
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
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.
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 sousTaints
:[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
Étapes suivantes
- En savoir plus sur des exemples de cas d’usage pour les répulsions et les tolérances.
- En savoir plus sur les meilleures pratiques relatives aux fonctionnalités avancées du planificateur AKS.
- En savoir plus sur les étiquettes Kubernetes dans la documentation sur les étiquettes Kubernetes.
Azure Kubernetes Service