Configurer les nœuds pour utiliser l'espace disque comme mémoire virtuelle

L'échange de mémoire des nœuds Google Kubernetes Engine (GKE) permet aux nœuds GKE d'utiliser l'espace disque comme mémoire virtuelle lorsque la mémoire physique est épuisée. La permutation de mémoire des nœuds peut aider à améliorer la résilience des applications et à éviter les erreurs de mémoire insuffisante (OOM) pour certaines charges de travail.

Quand utiliser l'échange de mémoire de nœud ?

Utilisez l'échange de mémoire de nœud pour fournir un tampon contre les erreurs de mémoire insuffisante pour les applications gourmandes en mémoire, en particulier lors de pics d'utilisation inattendus. L'échange de mémoire des nœuds peut vous aider à améliorer la résilience de vos charges de travail, par exemple dans les scénarios suivants :

  • Exécuter des charges de travail avec des modèles de mémoire imprévisibles
  • Réduisez le risque de plantage des applications en raison de l'épuisement de la mémoire des nœuds.
  • Optimisez les coûts en évitant de surprovisionner la mémoire pour les pics occasionnels.

Fonctionnement de l'échange de mémoire des nœuds

Lorsque vous activez l'échange de mémoire de nœud, GKE configure le système d'exploitation du nœud pour qu'il utilise l'espace disque comme mémoire virtuelle. Ce processus fournit un tampon pour les applications qui subissent une pression temporaire sur la mémoire.

GKE calcule les limites d'échange de conteneurs en fonction des limites de ressources de mémoire du conteneur et de la mémoire totale du nœud.

Vous pouvez configurer l'échange sur différents types de stockage pour équilibrer les performances et les coûts :

  • Disque de démarrage : utilise le disque de démarrage du nœud pour l'espace d'échange.
  • SSD local éphémère : utilise un SSD local qui est également partagé avec le stockage éphémère du pod. Si le nœud utilise une capacité de SSD local mixte, l'échange n'utilise que la partie de stockage éphémère des SSD locaux.
  • SSD local dédié : réserve un ou plusieurs SSD locaux exclusivement pour l'échange.

Pour protéger les données sensibles, GKE chiffre l'espace d'échange par défaut à l'aide d'une clé éphémère.

Conditions requises et limites

La permutation de mémoire des nœuds est soumise aux exigences et limites suivantes :

  • Les clusters GKE doivent être de version 1.34.1-gke.1341000 ou ultérieure.
  • Seuls les pods de la classe de qualité de service (QoS) Burstable peuvent utiliser l'échange de mémoire de nœud. Pour en savoir plus sur les classes QoS, consultez la documentation Kubernetes sur les classes de qualité de service des pods.
  • Pour redimensionner les ressources mémoire des conteneurs, vous devez définir la règle de redimensionnement des conteneurs sur RestartContainer.
  • Si vous configurez l'échange de mémoire de nœud pour utiliser un disque de démarrage, la taille de l'échange ne peut pas dépasser 50 % de la capacité totale du disque de démarrage.

Si vous configurez l'échange de mémoire de nœud pour utiliser un disque SSD local, vous devez vous assurer que les conditions suivantes sont remplies :

  • Le type de machine doit être compatible avec les disques SSD locaux. Vous ne pouvez utiliser que des disques SSD locaux provisionnés en tant que stockage éphémère ou stockage mixte. Vous ne pouvez pas utiliser de SSD locaux provisionnés en tant qu'appareils de stockage en mode bloc bruts. Pour obtenir la liste des profils d'échange compatibles dans ce mode, consultez Échange de mémoire de nœud avec une capacité de SSD local mixte.
  • Les nœuds doivent être provisionnés avec des disques SSD locaux. La méthode de provisionnement dépend de la série de machines :
    • Pour les séries de machines de première ou deuxième génération, définissez l'option --ephemeral-storage-local-ssd=count.
    • Pour les séries de machines de troisième ou quatrième génération, choisissez un type de machine qui regroupe des disques SSD locaux.
  • Le type de machine e2-medium par défaut n'est pas compatible avec les disques SSD locaux. Vous devez donc sélectionner un autre type de machine.
  • Pour savoir comment créer ou mettre à jour un cluster afin qu'il provisionne des disques SSD locaux, consultez Provisionner et utiliser un stockage éphémère sauvegardé sur disque SSD local.

Bonnes pratiques

L'échange de mémoire de nœud est conçu comme un filet de sécurité pour les pics de mémoire imprévisibles, et non comme un remplacement d'une mémoire physique suffisante. Pour obtenir des conseils sur l'optimisation des charges de travail, consultez Dimensionner correctement vos charges de travail GKE à grande échelle.

Vous devez également tenir compte des bonnes pratiques suivantes lorsque vous utilisez l'échange de mémoire de nœud :

  • Isolez les nœuds sur lesquels l'échange de mémoire est activé en appliquant un rejet au pool de nœuds (par exemple, gke-swap=enabled:NoSchedule) et en ajoutant une tolérance correspondante aux charges de travail destinées à utiliser l'échange.
  • Dimensionnez l'espace d'échange de mémoire de vos nœuds de manière appropriée. Un espace d'échange de mémoire de nœud insuffisant peut ne pas empêcher les erreurs OOM, et une utilisation excessive peut dégrader les performances.
  • Surveillez l'utilisation de la mémoire d'échange des nœuds sur vos charges de travail. L'utilisation fréquente de l'échange de mémoire de nœud peut indiquer une saturation de la mémoire.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Pour utiliser la Google Cloud CLI pour cette tâche, installez puis initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.

Activer l'échange de mémoire des nœuds

Vous pouvez activer l'échange de mémoire de nœud au niveau d'un cluster ou d'un pool de nœuds. Pour activer l'échange de mémoire de nœud, créez ou mettez à jour un fichier system-config.yaml contenant la configuration d'échange de mémoire de nœud souhaitée. L'exemple suivant active l'échange de mémoire de nœud avec les paramètres par défaut :

linuxConfig:
  swapConfig:
    enabled: true

Vous pouvez configurer d'autres paramètres. Cet exemple configure un swap non chiffré pour utiliser 30 % de l'espace de stockage d'un disque SSD local éphémère :

linuxConfig:
  swapConfig:
    enabled: true
    encryptionConfig:
      disabled: true
    ephemeralLocalSsdProfile:
      swapSizePercent: 30

Pour obtenir la liste des champs facultatifs que vous pouvez configurer, consultez la documentation de l'API LinuxNodeConfig.

Activer l'échange de mémoire de nœud sur un cluster

Pour activer l'échange de mémoire de nœud sur un cluster, effectuez l'une des opérations suivantes :

  • Pour créer un cluster avec l'échange de mémoire de nœud activé, exécutez la commande suivante :

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=1.34.1-gke.1341000 \
        --system-config-from-file=system-config.yaml
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom de votre nouveau cluster
    • LOCATION : région ou zone de votre cluster.
  • Pour mettre à jour un cluster existant afin d'activer l'échange de mémoire des nœuds, exécutez la commande suivante :

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom de votre nouveau cluster
    • LOCATION : région ou zone de votre cluster.

Activer l'échange de mémoire de nœud sur un pool de nœuds

Pour activer l'échange de mémoire de nœud sur un pool de nœuds, effectuez l'une des opérations suivantes :

  • Pour créer un pool de nœuds avec l'échange de mémoire de nœud activé, exécutez la commande suivante :

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --node-version=1.34.1-gke.1293000 \
        --system-config-from-file=system-config.yaml \
        --machine-type=MACHINE_TYPE
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom de votre nouveau pool de nœuds.
    • CLUSTER_NAME : nom du cluster
    • LOCATION : région ou zone de votre cluster.
    • MACHINE_TYPE : type de machine compatible. Pour les disques SSD locaux, veillez à choisir un type de machine qui regroupe les disques SSD locaux, par exemple n1-standard-1.
  • Pour mettre à jour un pool de nœuds existant afin d'activer l'échange de mémoire des nœuds, exécutez la commande suivante :

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom de votre pool de nœuds.
    • CLUSTER_NAME : nom du cluster
    • LOCATION : région ou zone de votre cluster.

Vérifier la configuration

Pour vérifier que l'échange de mémoire de nœud est activé, procédez comme suit :

  1. Vérifiez que le system-config.yaml est appliqué avec les paramètres swapConfig en exécutant la commande suivante :

    gcloud container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. Vérifiez que la configuration kubelet existe sur le nœud en exécutant la commande suivante :

    kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
    

Surveiller l'utilisation de l'échange de mémoire

Vous pouvez surveiller la mémoire des nœuds avec Cloud Monitoring ou kubectl.

Surveillance

Les métriques système suivantes sont disponibles par défaut pour observer l'utilisation de l'espace d'échange :

  • kubernetes.io/node/memory/swap_used_bytes
  • kubernetes.io/container/memory/swap_used_bytes

GKE fournit également des métriques d'utilisation de l'espace d'échange au niveau du conteneur via cAdvisor. Pour utiliser ces métriques, activez cAdvisor sur le cluster :

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

Surveillez l'utilisation de l'espace d'échange à l'aide des commandes kubectl en procédant comme suit :

  1. Vérifiez la condition SwapDetected sur l'objet de nœud en exécutant la commande suivante :

    kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .
    

    Le résultat ressemble à ce qui suit :

    {
      "lastHeartbeatTime": "2025-07-11T00:14:52Z",
      "lastTransitionTime": "2025-06-25T05:20:10Z",
      "message": "Swap is active: Total=49Gi Used=0B Free=49Gi",
      "reason": "SwapDetected",
      "status": "True",
      "type": "Swap"
    }
    
  2. Vérifiez la capacité d'échange en exécutant la commande suivante :

    kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'
    

    Le résultat ressemble à ce qui suit :

    {"capacity":53687087104}
    

Échange de mémoire de nœud avec une capacité de SSD local mixte

Vous pouvez activer l'échange de mémoire de nœud sur les pools de nœuds qui provisionnent des disques SSD locaux mixtes. GKE est compatible avec les profils d'échange suivants :

  • Disque de démarrage (bootDiskProfile)
  • SSD local éphémère (ephemeralLocalSsdProfile) : GKE alloue de l'espace d'échange à partir de la partie de stockage éphémère des SSD locaux, et non à partir des partitions de blocs bruts.

GKE n'est pas compatible avec le profil d'échange de SSD locaux dédié (dedicatedLocalSsdProfile) avec des SSD locaux mixtes.

Si vous utilisez le profil de disque SSD local éphémère, tenez compte des points suivants :

  • Le champ swapSizePercent est un pourcentage de la capacité éphémère que vous définissez avec le sous-champ capacity, et non de la capacité totale du disque SSD local physique. Par exemple, avec des paramètres tels que capacity=200GB et swapSizePercent: 20, GKE alloue 40 Gio d'espace d'échange.
  • L'espace d'échange réduit l'espace de stockage éphémère disponible pour vos pods. GKE calcule l'espace de stockage éphémère réservé à partir de la capacité éphémère moins la taille de l'espace d'échange.
  • La taille de l'espace d'échange ne peut pas dépasser 80 % de la capacité éphémère moins le stockage éphémère que GKE réserve pour l'utilisation du système. Si la capacité éphémère est trop faible pour l'échange, la requête échoue.

L'exemple de fichier system-config.yaml suivant alloue 20 % de la capacité éphémère à l'espace d'échange :

linuxConfig:
  swapConfig:
    enabled: true
    ephemeralLocalSsdProfile:
      swapSizePercent: 20

Pour créer un pool de nœuds avec une capacité de SSD local et un échange de mémoire de nœud mixtes, exécutez la commande suivante :

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --ephemeral-storage-local-ssd count=NUMBER_OF_DISKS,capacity=CAPACITY \
    --system-config-from-file=system-config.yaml

Remplacez les éléments suivants :

  • POOL_NAME : nom du nouveau pool de nœuds que vous souhaitez créer.
  • CLUSTER_NAME : nom du cluster.
  • MACHINE_TYPE : type de machine à utiliser. Vous ne pouvez pas utiliser de disques SSD locaux avec le type de machine e2-medium par défaut, car les types de machines à cœur partagé ne les acceptent pas.
  • NUMBER_OF_DISKS : nombre de disques SSD locaux à provisionner sur chaque nœud.
  • CAPACITY : capacité totale de SSD locaux à formater pour le stockage éphémère. Cette valeur doit être supérieure à 0 et strictement inférieure à la capacité physique totale du SSD local (nombre de disques × taille par disque), par exemple 200GB.

Désactiver l'échange de mémoire des nœuds

Pour désactiver l'échange de mémoire des nœuds, mettez à jour votre fichier system-config.yaml en procédant comme suit :

  1. Mettez à jour le fichier system-config.yaml pour définir swapConfig.enabled sur false :

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. Mettez à jour le pool de nœuds avec la nouvelle configuration :

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

Étapes suivantes