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

Cette page présente les rejets de nœuds sur Google Kubernetes Engine (GKE). Lorsque vous programmez le déploiement de charges de travail sur votre cluster, les rejets de nœuds vous aident à contrôler les nœuds sur lesquels vos charges de travail sont autorisées à s'exécuter.

Aperçu

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 de nœuds sont des paires clé-valeur associées à un effet. Voici les effets disponibles :

  • 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.

Notez que certains pods système (par exemple, kube-proxy et fluentd) tolèrent tous les rejets NoExecute et NoSchedule, et ne seront pas expulsés.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

Si le message d'erreur One of [--zone, --region] must be supplied: Please specify location s'affiche, effectuez les tâches ci-dessous.

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project project-id
  • Si vous travaillez avec des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone compute-zone
  • Si vous utilisez des clusters régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region compute-region
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update

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

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

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 est le nom du cluster à créer.
  • effect est PreferNoSchedule, NoSchedule ou NoExecute.
  • key et value forment une paire clé-valeur associée à effect.

Par exemple, la commande suivante applique un rejet avec la clé dedicated, la valeur experimental et l'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 au menu Google Kubernetes Engine de Cloud Console.

    Accéder au menu "Google Kubernetes Engine"

  2. Cliquez sur le bouton Créer un cluster.

  3. Configurez le cluster selon vos besoins.

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

  5. Dans la section Rejet des nœuds, cliquez sur le bouton Ajouter un rejet.

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

  7. Renseignez les champs Clé et Valeur avec la paire clé-valeur souhaitée.

  8. Ajoutez des rejets de nœuds supplémentaires si vous le souhaitez.

  9. Cliquez sur 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éation d'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 l'outil de ligne de commande gcloud, Cloud Console 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 est le nom du pool de nœuds à créer.
  • cluster-name est le nom du cluster dans lequel le pool de nœuds est créé.
  • effect est PreferNoSchedule, NoSchedule ou NoExecute.
  • key et value forment une paire clé-valeur associée à effect.

Par exemple, la commande suivante applique un rejet avec la clé dedicated, la valeur experimental et l'effet NoSchedule :

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

Cette commande applique un rejet avec la clé special, la valeur gpu et l'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 au menu Google Kubernetes Engine de Cloud Console.

    Accéder au menu "Google Kubernetes Engine"

  2. Cliquez sur le bouton Modifier du cluster (icône en forme de crayon).

  3. Dans le menu Pools de nœuds, cliquez sur Ajouter un pool de nœuds.

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

  5. Dans la section Effet, sélectionnez l'effet souhaité.

  6. Renseignez les champs Clé et Valeur avec la paire clé-valeur souhaitée.

  7. Ajoutez des rejets de nœuds supplémentaires si vous le souhaitez.

  8. Cliquez sur Enregistrer pour fermer la fenêtre de modification du pool de nœuds.

  9. Cliquez sur 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

Exemple :

kubectl taint nodes node1 key=value:NoSchedule

Vous pouvez également ajouter des rejets aux nœuds possédant un libellé spécifique :

kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule

Pour plus d'informations, reportez-vous à la section relative aux rejets et tolérances dans la documentation Kubernetes.

Inspection des rejets d'un nœud

Pour voir les rejets d'un nœud, vous pouvez utiliser 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 la description du nœud renvoyée, recherchez le champ Taints :

    Taints: key=value:effect
    

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 une clé dedicated dans le nœud foo :

kubectl taint nodes foo dedicated-

Avantages de la fonctionnalité de rejets de nœuds GKE

L'utilisation des rejets de nœuds avec des clusters et des pool de nœuds présente plusieurs avantages par rapport à la configuration manuelle de rejets à l'aide de 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.

Étapes suivantes