Contrôler la planification avec des rejets de nœuds


Cette page présente les rejets de nœuds sur Google Kubernetes Engine (GKE). Les rejets de nœuds vous aident à spécifier les nœuds sur lesquels les charges de travail doivent s'exécuter.

Les clusters Autopilot sont compatibles avec l'utilisation des rejets de nœuds pour la séparation des charges de travail uniquement. Pour obtenir des instructions, consultez la page Configurer la séparation des charges de travail dans GKE.

Présentation

Lorsque vous soumettez l'exécution d'une charge de travail dans un cluster, le programmeur détermine l'emplacement des pods associés à la charge de travail. Le programmeur peut placer un pod sur n'importe quel nœud répondant aux exigences du pod en matière de processeur, de mémoire et de ressources personnalisées.

Si votre cluster exécute différentes charges de travail, vous pouvez choisir de contrôler quelles charges de travail peuvent s'exécuter sur un pool de nœuds particulier.

Un rejet de nœud vous permet de marquer un nœud afin que le programmeur l'ignore ou empêche son utilisation pour certains pods. Les tolérances forment une fonctionnalité complémentaire qui vous permet de désigner les pods pouvant être utilisés sur des nœuds "rejetés".

Les rejets et les tolérances fonctionnent conjointement pour s'assurer que les pods ne sont pas programmés sur des nœuds inappropriés.

Les rejets de nœuds sont des paires clé-valeur associées à un effet. Le tableau suivant répertorie les effets disponibles :

Effet Description
NoSchedule Les pods qui ne tolèrent pas ce rejet ne sont pas programmés sur le nœud ; les pods existants ne sont pas expulsés du nœud.
PreferNoSchedule Kubernetes évite de programmer les pods qui ne tolèrent pas ce rejet sur le nœud.
NoExecute Si le pod est déjà en cours d'exécution sur le nœud, il est expulsé de celui-ci. Dans le cas contraire, il n'est pas programmé sur le nœud.

Avantages de la définition de rejets de nœuds dans GKE

Vous pouvez ajouter des rejets de nœuds aux clusters et aux nœuds dans GKE ou à l'aide de la commande kubectl taint. La spécification des rejets de nœuds dans GKE présente plusieurs avantages par rapport à kubectl :

  • Les rejets sont conservés lorsqu'un nœud est redémarré ou remplacé.
  • Les rejets sont créés automatiquement lorsqu'un nœud est ajouté à un pool ou à un cluster.
  • Les rejets sont créés automatiquement lors de l'autoscaling du cluster.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Créer un cluster avec des rejets de nœuds

Lorsque vous créez un cluster dans GKE, vous pouvez lui attribuer des rejets de nœuds. Cela attribue les rejets à tous les nœuds créés avec le cluster.

Si vous créez un cluster standard avec des rejets de nœuds ayant comme effet NoSchedule ou NoExecute, GKE ne peut pas planifier certains composants gérés par GKE, tels que kube-dns ou metrics-server sur le pool de nœuds par défaut créé par GKE lors de la création du cluster. GKE ne peut pas planifier ces composants, car ils ne présentent pas les tolérances correspondantes pour vos rejets de nœuds. Vous devez ajouter un nouveau pool de nœuds répondant à l'une des conditions suivantes :

  • Aucun rejet
  • Un rejet ayant l'effet PreferNoSchedule
  • Le rejet components.gke.io/gke-managed-components=true:NoSchedule

N'importe laquelle de ces conditions permet à GKE de planifier les composants gérés par GKE dans le nouveau pool de nœuds.

Pour obtenir des instructions, reportez-vous à la section Isoler des charges de travail sur des nœuds dédiés.

gcloud

Pour créer un cluster avec des rejets de nœuds, exécutez la commande suivante :

gcloud container clusters create CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du nouveau cluster
  • EFFECT : l'une des valeurs d'effet suivantes : PreferNoSchedule, NoSchedule ou NoExecute.
  • KEY=VALUE : paire clé-valeur associée à EFFECT.

Par exemple, la commande suivante applique un rejet avec une valeur-clé dedicated=experimental ayant pour effet PreferNoSchedule :

gcloud container clusters create example-cluster \
    --node-taints dedicated=experimental:PreferNoSchedule

Console

Pour créer un cluster avec des rejets de nœuds, procédez comme suit :

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Configurez le cluster selon vos besoins.

  4. Dans le volet de navigation, sous Pools de nœuds, développez le pool de nœuds que vous souhaitez modifier, puis cliquez sur Métadonnées.

  5. Dans la section Rejets de nœuds, cliquez sur Ajouter un rejet.

  6. Dans la liste déroulante Effet, sélectionnez l'effet souhaité.

  7. Saisissez la paire clé-valeur souhaitée dans les champs Clé et Valeur.

  8. Cliquez sur Create (Créer).

API

Lorsque vous créez un cluster à l'aide de l'API, incluez le champ nodeTaints sous nodeConfig. Exemple :

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Créer un pool de nœuds avec des rejets de nœuds

Lorsque vous appliquez un rejet à un nœud, seuls les pods tolérant ce rejet sont autorisés à s'exécuter sur le nœud. Dans un cluster GKE, vous pouvez appliquer un rejet à un pool de nœuds, ce qui l'applique à tous les nœuds du pool.

Pour créer un pool de nœuds avec des rejets de nœuds, vous pouvez utiliser Google Cloud CLI, la console Google Cloud ou l'API GKE.

gcloud

Pour créer un pool de nœuds avec des rejets de nœuds, exécutez la commande suivante :

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --node-taints KEY=VALUE:EFFECT

Remplacez les éléments suivants :

  • POOL_NAME : nom du pool de nœuds à créer
  • CLUSTER_NAME : nom du cluster dans lequel le pool de nœuds est créé.
  • EFFECT : l'une des valeurs d'effet suivantes : PreferNoSchedule, NoSchedule ou NoExecute.
  • KEY=VALUE : paire clé-valeur associée à EFFECT.

Par exemple, la commande suivante crée un pool de nœuds sur un cluster existant et applique un rejet avec une clé-valeur dedicated=experimental ayant un effet NoSchedule :

gcloud container node-pools create example-pool --cluster example-cluster \
    --node-taints dedicated=experimental:NoSchedule

Cette commande crée un pool de nœuds et applique un rejet avec la valeur/clé special=gpu, avec un effet NoExecute :

gcloud container node-pools create example-pool-2 --cluster example-cluster \
    --node-taints special=gpu:NoExecute

Console

Pour créer un pool de nœuds avec des rejets de nœuds, procédez comme suit :

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Sur la page Détails du cluster, cliquez sur Ajouter un pool de nœuds.

  4. Dans le volet de navigation, cliquez sur Métadonnées.

  5. Sous Rejets de nœuds, cliquez sur Ajouter un rejet.

  6. Sélectionnez l'effet souhaité dans la liste déroulante Effet.

  7. Saisissez la paire clé-valeur souhaitée dans les champs Clé et Valeur.

  8. Cliquez sur Create (Créer).

API

Lorsque vous créez un pool de nœuds à l'aide de l'API, incluez le champ nodeTaints sous nodeConfig. Exemple :

POST https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters/CLUSTER_ID/nodePools

{
  'nodePool': {
    'name': 'example-pool',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'dedicated',
          'Value': 'experimental',
          'effect': 'NoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

Configurer des pods pour tolérer un rejet

Vous pouvez configurer les pods de sorte qu'ils tolèrent un rejet en incluant le champ tolerations dans leur spécification. Voici une partie de spécification de pod.

Ce pod peut être programmé sur un nœud ayant le rejet dedicated=experimental:NoSchedule :

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

Ajouter un rejet à un nœud existant

Vous pouvez ajouter des rejets à un nœud existant à l'aide de la commande kubectl taint :

kubectl taint nodes NODE_NAME KEY=VALUE:EFFECT

Par exemple, la commande suivante applique un rejet avec une paire clé-valeur dedicated=experimental ayant un effet NoSchedule sur le nœud mynode :

kubectl taint nodes mynode dedicated=experimental:NoSchedule

Vous pouvez également ajouter des rejets aux nœuds qui possèdent un libellé spécifique en utilisant le sélecteur -l avec le libellé et la valeur spécifiés :

kubectl taint nodes -l LABEL=LABEL_VALUE KEY=VALUE:EFFECT

Par exemple, la commande suivante ajoute un rejet avec la clé dedicated-pool aux nœuds GKE du pool de nœuds my_pool :

kubectl taint nodes -l cloud.google.com/gke-nodepool=my_pool dedicated-pool=my_pool:NoSchedule

Inspecter les rejets d'un nœud

Pour afficher les rejets d'un nœud, utilisez l'outil de ligne de commande kubectl.

  1. Obtenez une liste de tous les nœuds de votre cluster en exécutant la commande suivante :

    kubectl get nodes
    
  2. Inspectez un nœud en exécutant la commande suivante :

    kubectl describe node NODE_NAME
    
  3. Dans le résultat, recherchez le champ Taints. Le résultat ressemble à ce qui suit :

    Taints:  dedicated-pool=mypool:NoSchedule
    

Supprimer un rejet d'un nœud

Vous pouvez utiliser kubectl taint pour supprimer des rejets. Vous pouvez supprimer les rejets par clé, par paire valeur-clé ou par paire effet-clé.

Par exemple, la commande suivante supprime tous les rejets avec la clé dedicated du nœud mynode :

kubectl taint nodes mynode dedicated-

Supprimer tous les rejets d'un pool de nœuds

Pour supprimer tous les rejets d'un pool de nœuds, exécutez la commande suivante :

gcloud beta container node-pools update POOL_NAME \
--node-taints="" \
--cluster=CLUSTER_NAME

Remplacez les éléments suivants :

  • POOL_NAME : nom du pool de nœuds à modifier.
  • CLUSTER_NAME : nom du cluster dans lequel le pool de nœuds est créé.

Étape suivante