Effectuer la maintenance de l'hôte pour les nœuds exécutant des charges de travail d'entraînement et d'inférence

Ce document explique comment effectuer la maintenance de l'hôte des instances Compute Engine sous-jacentes pour les nœuds des clusters Google Kubernetes Engine (GKE). Vous n'avez besoin de gérer activement cette maintenance que pour certains types d'instances Compute Engine qui ne migrent pas à chaud, y compris les instances avec GPU et TPU. Les stratégies décrites dans ce document fonctionnent bien pour les charges de travail d'entraînement et d'inférence. Si vous n'avez besoin d'effectuer manuellement la maintenance de l'hôte que pour un nœud individuel, ou si vos charges de travail peuvent tolérer la maintenance automatique de l'hôte, consultez Comprendre comment effectuer la maintenance de l'hôte sur GKE.

Ces stratégies effectuent la maintenance de l'hôte pour des groupes de nœuds et, éventuellement, lancent les mises à niveau des clusters GKE.

Utilisez la stratégie parallèle pour les nœuds des charges de travail où vous pouvez avoir une seule période d'indisponibilité, comme pour les nœuds des charges de travail d'entraînement. Utilisez la stratégie Rolling pour les nœuds des charges de travail où vous pouvez avoir des périodes d'indisponibilité tout en maintenant la disponibilité de la majorité des ressources, comme pour les nœuds des charges de travail d'inférence.

Utiliser une stratégie parallèle pour mettre à jour les nœuds des charges de travail d'entraînement

Cette stratégie effectue des modifications simultanément pour un groupe de nœuds qui utilisent des accélérateurs. Vous pouvez utiliser cette stratégie pour les charges de travail d'entraînement. Vous pouvez également l'utiliser pour d'autres types de charges de travail où la méthode la moins perturbatrice pour effectuer des modifications consiste à avoir une seule période d'indisponibilité complète pour tous les nœuds du groupe et les charges de travail qui s'y exécutent.

La stratégie suit les grandes étapes suivantes :

  1. Arrêter les charges de travail : sélectionnez les pools de nœuds, puis arrêtez les charges de travail qui s'y exécutent ou déplacez-les vers d'autres nœuds qui restent disponibles.
  2. Déclencher la maintenance de l'hôte : appliquez le libellé de maintenance à tous les nœuds sélectionnés en même temps et attendez que le processus soit terminé sur tous les nœuds.
  3. Mettre à niveau la version de GKE : modifiez la version de GKE des nœuds.
  4. Redémarrez les charges de travail : une fois que la maintenance et les mises à niveau de l'hôte sont terminées, redémarrez vos charges de travail.

Les instructions fournies permettent d'apporter des modifications à un seul pool de nœuds. Toutefois, vous pouvez adapter les étapes pour effectuer des modifications sur plusieurs pools de nœuds en même temps. Avant de commencer ces étapes, assurez-vous de disposer d'au moins quelques heures pendant lesquelles cette charge de travail n'a pas besoin de s'exécuter sur ces nœuds.

Pour minimiser les perturbations lors de la réception de modifications critiques pour les instances Compute Engine sous-jacentes et les nœuds GKE, utilisez cette période d'indisponibilité pour effectuer à la fois la maintenance de l'hôte et les mises à niveau de la version GKE. Toutefois, vous ne pouvez effectuer la maintenance de l'hôte que si vous ne souhaitez pas mettre à niveau la version de vos nœuds GKE.

À savoir avant de commencer

Avant de commencer, prenez connaissance des points suivants :

  • Évitez de redéployer les charges de travail : pour éviter des retards inutiles dus aux PodDisruptionBudgets, ne redéployez aucune charge de travail tant que vous n'avez pas terminé toutes les étapes.
  • Planifiez les interruptions : assurez-vous que vos charges de travail peuvent être interrompues pendant un certain temps. Ces étapes prennent plusieurs heures, principalement en raison du temps nécessaire à la maintenance de l'hôte.

Effectuer des mises à jour pour tous les nœuds simultanément

Pour effectuer la maintenance de l'hôte et, éventuellement, mettre à niveau la version de GKE, procédez comme suit :

  1. Préparez vos charges de travail : arrêtez-les ou assurez-vous qu'elles ont créé un instantané ou un point de contrôle récent.
  2. Démarrer et surveiller la maintenance de l'hôte :

    • Sous-blocs de réservations qui utilisent la planification groupée de la maintenance : déclenchez la maintenance sur les réservations, les blocs de réservation ou les sous-blocs de réservation à l'aide de la sous-commande gcloud compute reservations correspondante. Par exemple, la commande suivante lance la maintenance d'un sous-bloc :

      gcloud compute reservations sub-blocks perform-maintenance RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --sub-block-name=SUB_BLOCK_NAME \
          --zone=ZONE
      

      Remplacez les éléments suivants :

      • RESERVATION_NAME : nom de la réservation.
      • BLOCK_NAME : nom du bloc de réservation.
      • SUB_BLOCK_NAME : nom du sous-bloc de réservation.
      • ZONE : zone où se trouve la réservation.

      Compute Engine commence à vider et à mettre à jour simultanément toutes les instances du sous-bloc. Cette opération peut prendre quelques heures.

      Pour surveiller l'état de la maintenance, consultez le champ de métadonnées upcomingGroupMaintenance dans les ressources de réservation. Pour en savoir plus, consultez Afficher l'état de maintenance.

    • Instances qui utilisent une planification de la maintenance indépendante : déclenchez la maintenance pour les instances à la demande ou pour les réservations qui n'utilisent pas de sous-blocs en appliquant le libellé cloud.google.com/perform-maintenance=true aux nœuds de votre pool de nœuds :

      kubectl label nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME cloud.google.com/perform-maintenance=true --overwrite
      

      Compute Engine commence à vider et à mettre à jour les instances sous-jacentes simultanément. Cette opération peut prendre quelques heures. Pour en savoir plus, consultez Processus d'arrêt progressif.

      Pour surveiller l'état de la maintenance, vérifiez les nœuds. GKE supprime le libellé de maintenance une fois la maintenance terminée, s'il a été appliqué. Une fois la maintenance terminée, vous trouverez un journal contenant le message suivant dans Cloud Logging :

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
  3. Facultatif : Mettez à niveau la version des nœuds GKE : suivez les instructions pour mettre à niveau la version GKE des nœuds.

Utiliser une stratégie de déploiement continu pour mettre à jour les nœuds des charges de travail d'inférence

Cette stratégie décrit une approche manuelle pour effectuer la maintenance sur les nœuds GKE exécutant des charges de travail d'inférence. Il s'agit de mettre à jour les nœuds par lots pour maintenir la disponibilité du service. Cette méthode est particulièrement adaptée aux charges de travail qui peuvent tolérer un certain pourcentage de répliques temporairement hors connexion.

La stratégie suit les grandes étapes suivantes :

  1. Identifier et regrouper les nœuds : choisissez les pools de nœuds à mettre à jour. Regroupez les nœuds en lots dont la taille dépend de la tolérance aux pannes de votre charge de travail.
  2. Parcourez les lots : pour chaque lot, appliquez le libellé de maintenance et surveillez le lot de nœuds jusqu'à ce que le libellé soit supprimé.
  3. Mettez à niveau la version de GKE : une fois que tous les lots ont terminé la maintenance de l'hôte, modifiez la version des nœuds GKE.

À savoir avant de commencer

Avant de commencer, prenez connaissance des points suivants :

  • Comprendre votre déploiement : pour réussir, vous devez connaître en détail la distribution de votre charge de travail, le placement des répliques et les domaines de défaillance. Assurez-vous de maintenir une capacité de diffusion suffisante tout au long du processus.
  • Planifier les tailles de lot : mettez à jour les nœuds par lots. La taille de chaque lot est déterminée par la tolérance aux pannes de votre charge de travail. Voici quelques facteurs à prendre en compte :
    • Nombre d'instances répliquées par modèle de service.
    • La répartition des réplicas entre les nœuds et les domaines de défaillance.
    • Les PodDisruptionBudgets peuvent vous aider à appliquer le nombre maximal de pods pouvant être arrêtés simultanément.
    • Recommandation : pour simplifier la gestion, envisagez de dédier différents pools de nœuds à différents ensembles de répliques. Vous pourrez ainsi isoler les domaines de défaillance au niveau du pool de nœuds.
  • Calculer les contraintes de temps : tenez compte des facteurs de timing suivants :
    • Chaque lot peut prendre plusieurs heures pour effectuer l'étape de maintenance de l'hôte.
    • Calculez la taille minimale du lot pour vous assurer que toute la maintenance est terminée dans les délais requis :
      1. MAINTENANCE_BLOCKS = floor(HOURS_TO_MAINTENANCE / 4) (où HOURS_TO_MAINTENANCE correspond au temps total disponible).
      2. MIN_PER_BATCH = TOTAL_NODE_COUNT / MAINTENANCE_BLOCKS
    • La taille de lot que vous choisissez doit être supérieure ou égale à MIN_PER_BATCH.
  • Examiner des types de charges de travail spécifiques : tenez compte des éléments suivants pour les types de configuration respectifs :
    • Mixture of Experts (MOE) : assurez-vous que votre stratégie de traitement par lot maintient le nombre minimal de répliques requis pour chaque modèle.
    • Diffusion désagrégée : assurez-vous de suivre toutes les répliques impliquées dans la configuration désagrégée lorsque vous planifiez des lots.
    • Pools de nœuds multi-hôtes (TPU, MNNVL) : pour ces configurations, vous allez probablement supprimer un pool de nœuds entier à la fois. Planifiez vos domaines de défaillance sur plusieurs pools de nœuds en conséquence.

Effectuer des mises à jour progressives par lots

Pour effectuer des mises à jour de maintenance progressive des hôtes, vous pouvez mettre à jour votre capacité à partir de réservations qui utilisent la planification groupée de la maintenance par lots d'un ou plusieurs sous-blocs, ou vous pouvez mettre à jour des ensembles spécifiques de nœuds dans le cluster par nom avec une planification de la maintenance indépendante.

Choisissez la stratégie appropriée pour vos ressources :

Mettre à jour les réservations par lots de sous-blocs

Pour effectuer la maintenance progressive des hôtes pour les réservations de capacité par lots de sous-blocs, procédez comme suit :

  1. Identifier les réservations pour la maintenance : identifiez le nom de la réservation de capacité, ainsi que les blocs ou sous-blocs de réservation utilisés par le cluster GKE. Pour ce faire, effectuez une recherche à l'aide des libellés de nœud GKE et de la commande gcloud compute reservations :

    1. Répertoriez le nom de la réservation, ainsi que les ID de topologie de bloc physique et de sous-bloc des nœuds de votre pool de nœuds :

      kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME \
          -o custom-columns='NAME:.metadata.name,RESERVATION:.metadata.labels.cloud\.google\.com/reservation-name,BLOCK_ID:.metadata.labels.cloud\.google\.com/gce-topology-block,SUBBLOCK_ID:.metadata.labels.cloud\.google\.com/gce-topology-subblock'
      

      Remplacez NODE_POOL_NAME par le nom du pool de nœuds.

      Notez les valeurs de sortie : le nom de la réservation (par exemple, nvidia-gb300-m7kp2xq9vd4j1), l'ID du bloc (par exemple, 3f2a8c9b1d4e0756f8a2b3c1d9e4f0a5) et l'ID du sous-bloc (par exemple, e7b91f4a3c2d58069e1a4b7f3d2c8056).

    2. Pour identifier le nom de ressource du bloc de réservation, interrogez la liste des blocs de réservation Compute Engine à l'aide du nom de la réservation et filtrez par ID de bloc :

      gcloud compute reservations blocks list RESERVATION_NAME \
          --zone=ZONE \
          --project=PROJECT_ID \
          --filter="physicalTopology.block=BLOCK_ID"
      

      Remplacez les éléments suivants :

      • RESERVATION_NAME : nom de la réservation.
      • ZONE : zone où se trouve la réservation.
      • PROJECT_ID : ID du projet dans lequel se trouve la réservation.
      • BLOCK_ID : ID du bloc récupéré à partir des libellés de nœud.

      Notez le nom du bloc à partir de la sortie.

    3. Pour identifier le nom de ressource du sous-bloc de réservation, interrogez la liste des sous-blocs de réservation à l'aide du nom de la réservation et du nom du bloc, puis filtrez par ID de sous-bloc :

      gcloud compute reservations sub-blocks list RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --zone=ZONE \
          --project=PROJECT_ID \
          --filter="physicalTopology.subBlock=SUBBLOCK_ID"
      

      Remplacez les éléments suivants :

      • RESERVATION_NAME : nom de la réservation.
      • BLOCK_NAME : nom de la ressource du bloc de réservation.
      • ZONE : zone où se trouve la réservation.
      • PROJECT_ID : ID du projet dans lequel se trouve la réservation.
      • SUBBLOCK_ID : ID du sous-bloc récupéré à partir des libellés de nœud.

      La sortie affiche des informations sur le sous-bloc de réservation correspondant, y compris son nom de ressource.

  2. Divisez les réservations en lots : divisez les sous-blocs de réservation de capacité identifiés en lots égaux. Déterminez la taille du lot à l'aide de la formule décrite dans l'élément de liste Calculer les contraintes de temps de la section Points à prendre en compte avant de commencer. Chaque lot correspond à un ou plusieurs sous-blocs de réservation, et chaque lot doit être au moins de la taille d'un sous-bloc.

  3. Effectuez la maintenance de l'hôte : Pour chaque lot, procédez comme suit :

    1. Sélectionnez un groupe de sous-blocs de réservation et déclenchez la maintenance de l'hôte. Vous pouvez déclencher la maintenance de vos réservations, blocs de réservation ou sous-blocs de réservation. Pour les types de machines tels que A4X, A4X Max, TPU v6e et TPU7x, vous devez déclencher la maintenance de cette manière. La maintenance est effectuée par groupes de sous-blocs. Exécutez la commande gcloud compute reservations sub-blocks perform-maintenance :

      gcloud compute reservations sub-blocks perform-maintenance RESERVATION_NAME \
          --block-name=BLOCK_NAME \
          --sub-block-name=SUB_BLOCK_NAME \
          --zone=ZONE
      

      Remplacez les éléments suivants :

      • RESERVATION_NAME : nom de la réservation.
      • BLOCK_NAME : nom du bloc de réservation.
      • SUB_BLOCK_NAME : nom du sous-bloc de réservation.
      • ZONE : zone où se trouve la réservation.

      Compute Engine commence à vider et à mettre à jour simultanément toutes les instances du sous-bloc. Cette opération peut prendre quelques heures.

    2. Surveillez l'état de la maintenance en consultant l'état du champ de métadonnées upcomingGroupMaintenance dans les ressources de réservation. Pour en savoir plus, consultez Afficher l'état de maintenance d'une réservation.

    3. Répétez les étapes précédentes pour chaque lot restant jusqu'à ce que vous ayez terminé la maintenance des hôtes pour tous les lots.

  4. Facultatif : Mettez à niveau la version des nœuds GKE : n'effectuez cette étape qu'une fois la maintenance de l'hôte terminée pour tous les sous-blocs de réservation, afin d'éviter les scénarios où les nœuds GKE sont déployés sur des hôtes dont la maintenance n'est pas encore terminée. Suivez les instructions pour mettre à niveau la version GKE des nœuds.

Mettre à jour les nœuds par lot

Pour effectuer une maintenance progressive des hôtes pour les instances à la demande ou les réservations qui ne prennent pas en charge les sous-blocs par lots, procédez comme suit :

  1. Identifier les nœuds pour la maintenance : identifiez tous les nœuds sur lesquels vous souhaitez effectuer la maintenance et enregistrez cette liste. Pour identifier les nœuds, utilisez l'une des méthodes suivantes ou sélectionnez-les manuellement :

    • Obtenez tous les nœuds du cluster qui utilisent des accélérateurs (TPU ou GPU) :

      kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]? | select(.key=="nvidia.com/gpu" or .key=="google.com/tpu")) | .metadata.name'
      
    • Obtenez tous les nœuds d'un pool de nœuds spécifique :

      kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME --no-headers -o custom-columns=":metadata.name"
      

      Remplacez NODE_POOL_NAME par le nom du pool de nœuds.

    • Obtenir tous les nœuds avec un libellé spécifique :

      kubectl get nodes -l LABEL -o jsonpath='{.items[*].metadata.name}'
      

      Remplacez LABEL par le libellé du nœud.

  2. Diviser les nœuds en lots : divisez les nœuds identifiés en lots égaux. Déterminez la taille du lot à l'aide de la formule décrite dans l'élément de liste Calculer les contraintes de temps de la section Points à prendre en compte avant de commencer.

  3. Effectuez la maintenance de l'hôte : Pour chaque lot, procédez comme suit :

    1. Sélectionnez un lot de nœuds et déclenchez la maintenance au niveau de l'instance à l'aide de l'API instances en appliquant le libellé de maintenance :

      kubectl label nodes LIST_OF_NODES_IN_BATCH cloud.google.com/perform-maintenance=true --overwrite
      

      Remplacez LIST_OF_NODES_IN_BATCH par une liste de nœuds du lot, séparés par des espaces. Exemple : node-1 node-2 node-3.

      Compute Engine commence à vider et à mettre à jour les instances sous-jacentes simultanément. Cette opération peut prendre quelques heures. Pour en savoir plus, consultez Processus d'arrêt progressif.

    2. Surveillez l'état de la maintenance de l'hôte. Si le libellé de maintenance a été appliqué, GKE le supprime une fois la maintenance terminée. Une fois la maintenance terminée, vous trouverez un journal contenant le message suivant dans Logging :

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
    3. Répétez les étapes précédentes pour chaque lot restant jusqu'à ce que vous ayez terminé la maintenance des hôtes pour tous les lots.

  4. Facultatif : Mettez à niveau la version des nœuds GKE : n'effectuez cette étape qu'une fois la maintenance de l'hôte terminée pour tous les nœuds, afin d'éviter les scénarios dans lesquels les nœuds GKE sont déployés sur des hôtes dont la maintenance n'est pas encore terminée. Suivez les instructions pour mettre à niveau la version GKE des nœuds.

Mettre à niveau la version GKE des nœuds

Réfléchissez au nombre de nœuds que vous souhaitez mettre à niveau en même temps. Avec la stratégie parallèle, vous avez effectué la maintenance de l'hôte pour l'ensemble de votre pool de nœuds ou pour plusieurs pools de nœuds en même temps. Avec la stratégie Rolling, vous avez effectué la maintenance de l'hôte par lots. Déterminez la méthode de mise à niveau à utiliser en fonction de la taille des groupes de nœuds :

  • Stratégie parallèle : si vos pools de nœuds comportent chacun 100 nœuds ou moins par zone, utilisez les mises à niveau de la surutilisation. Si vos pools de nœuds comportent chacun plus de 100 nœuds par zone, supprimez-les et recréez-les.
  • Stratégie Rolling : si vos lots comportent 100 nœuds ou moins par zone et par pool de nœuds, utilisez les mises à niveau de la surutilisation. Si vos lots comportent plus de 100 nœuds par zone et par pool de nœuds, supprimez-les et recréez-les.

Utiliser les mises à niveau de la surutilisation

  1. Configurez les mises à niveau de la surutilisation à l'aide du paramètre maxUnavailable pour déterminer le nombre de nœuds pouvant être indisponibles simultanément par zone dans un pool de nœuds. Par exemple, si vous avez 18 nœuds dans une zone d'un pool de nœuds, définissez la valeur du champ maxUnavailable sur 18.

    Ce paramètre fonctionne mieux lorsque vous utilisez la capacité d'une réservation pour laquelle vous ne disposez pas de capacité excédentaire. Pour en savoir plus sur l'intérêt de ce paramètre, consultez Effectuer une mise à niveau dans un environnement à ressources limitées.

  2. Mettez à niveau le pool de nœuds en exécutant la commande suivante. Si vous souhaitez mettre à niveau plusieurs pools de nœuds, exécutez cette commande pour chaque pool de nœuds :

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool NODE_POOL_NAME \
        --cluster-version VERSION \
        --location CONTROL_PLANE_LOCATION \
        --quiet
    

    Remplacez les éléments suivants :

Supprimer et recréer les nœuds

Supprimez le pool de nœuds et recréez-le à l'aide de la version ultérieure :

  1. Supprimez le pool de nœuds :

    gcloud container node-pools delete NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    
  2. Recréez le pool de nœuds en transmettant la nouvelle version à l'aide de l'indicateur --cluster-version. Transmettez la cible de mise à niveau automatique recommandée pour le pool de nœuds. Pour en savoir plus, consultez Obtenir des informations sur les mises à niveau des pools de nœuds de cluster Standard. Si votre cluster ne dispose pas d'une cible de mise à niveau automatique recommandée, consultez les dernières entrées Mises à jour des versions dans les notes de version de GKE.