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 lots de temps d'arrêt 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'effectuer des modifications pour un seul pool de nœuds. Toutefois, vous pouvez adapter la procédure pour effectuer des modifications pour plusieurs pools de nœuds en même temps. Avant de commencer, 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 pouvez effectuer uniquement la maintenance de l'hôte 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 la maintenance de l'hôte : appliquez le libellé de maintenance à tous les nœuds du pool de nœuds sélectionné :

    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.

  3. Surveillez l'état de la maintenance de l'hôte : GKE supprime le libellé de maintenance une fois la maintenance terminée. 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.
    
  4. 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. Elle consiste à mettre à jour les nœuds par lots pour maintenir la disponibilité du service. Cette méthode est la mieux adaptée aux charges de travail qui peuvent tolérer qu'un certain pourcentage de répliques soit 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 toutes les opérations de maintenance sont terminées 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 requis de répliques 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 mettre hors service 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 progressives, procédez comme suit :

  1. Identifier les nœuds pour la maintenance : identifiez tous les nœuds sur lesquels vous souhaitez effectuer une 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. Divisez les nœuds en lots : divisez les nœuds identifiés en lots égaux. Déterminez la taille des lots à 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 groupe de nœuds et appliquez 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.

    2. Surveillez l'état de la maintenance de l'hôte. GKE supprime le libellé de maintenance 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 deux é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 où les nœuds GKE sont déployés sur des hôtes dont la maintenance n'est pas encore terminée. Consultez les instructions dans la section suivante.

Mettre à niveau la version GKE des nœuds

Tenez compte du 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 que vous utiliserez en fonction de la taille des groupes de nœuds :

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

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 qui peuvent ê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.