Configurare i nodi per utilizzare lo spazio su disco come memoria virtuale

Lo scambio di memoria dei nodi di Google Kubernetes Engine (GKE) consente ai nodi GKE di utilizzare lo spazio su disco come memoria virtuale quando la memoria fisica è esaurita. Lo scambio di memoria dei nodi può contribuire a migliorare la resilienza delle applicazioni e a prevenire errori di memoria esaurita (OOM) per determinati workload.

Quando utilizzare lo scambio di memoria dei nodi

Utilizza lo swap della memoria dei nodi per fornire un buffer contro gli errori di memoria esaurita per le applicazioni ad alta intensità di memoria, soprattutto durante picchi di utilizzo imprevisti. Lo scambio di memoria dei nodi può contribuire a migliorare la resilienza dei workload, ad esempio nei seguenti scenari:

  • Eseguire workload con pattern di memoria imprevedibili.
  • Ridurre il rischio di arresti anomali delle applicazioni a causa dell'esaurimento della memoria dei nodi.
  • Ottimizza i costi evitando la necessità di eseguire l'overprovisioning della memoria per i picchi occasionali.

Come funziona lo scambio di memoria dei nodi

Quando attivi lo swap della memoria dei nodi, GKE configura il sistema operativo del nodo in modo che utilizzi lo spazio su disco come memoria virtuale. Questo processo fornisce un buffer per le applicazioni che riscontrano una pressione temporanea sulla memoria.

GKE calcola i limiti di swap dei container in base ai limiti delle risorse di memoria del container e alla memoria totale del nodo.

Puoi configurare lo swap su diversi tipi di archiviazione per bilanciare prestazioni e costi:

  • Disco di avvio: utilizza il disco di avvio del nodo per lo spazio di swap.
  • SSD locale temporanea: utilizza un'unità SSD locale condivisa anche con l'archiviazione temporanea dei pod. Se il nodo utilizza la capacità SSD locale mista, lo swap utilizza solo la parte di archiviazione temporanea degli SSD locali.
  • SSD locale dedicato: prenota una o più unità SSD locali esclusivamente per lo swap.

Per proteggere i dati sensibili, GKE cripta lo spazio di swap per impostazione predefinita utilizzando una chiave temporanea.

Requisiti e limitazioni

Lo scambio di memoria dei nodi presenta i seguenti requisiti e limitazioni:

  • I cluster GKE devono essere della versione 1.34.1-gke.1341000 o successiva.
  • Solo i pod con la classe di qualità del servizio (QoS) Burstable possono utilizzare lo scambio di memoria del nodo. Per saperne di più sulle classi QoS, consulta la documentazione di Kubernetes relativa alle classi di qualità del servizio dei pod.
  • Per ridimensionare le risorse di memoria dei container, devi impostare la policy di ridimensionamento dei container su RestartContainer.
  • Se configuri lo swap della memoria del nodo in modo che utilizzi un disco di avvio, la dimensione dello swap non può superare il 50% della capacità totale del disco di avvio.

Se configuri lo swap della memoria del nodo in modo che utilizzi un'unità SSD locale, devi assicurarti che siano soddisfatti i seguenti requisiti:

  • Il tipo di macchina deve supportare le unità SSD locali. Puoi utilizzare solo unità SSD locali di cui è stato eseguito il provisioning come archiviazione temporanea o archiviazione mista. Non puoi utilizzare l'SSD locale di cui è stato eseguito il provisioning come spazio dispositivo a blocchi non formattati. Per un elenco dei profili di swap supportati in questa modalità, consulta Swap della memoria dei nodi con capacità SSD locale mista.
  • Il provisioning dei nodi deve essere eseguito con SSD locali. Il metodo di provisioning dipende dalla serie di macchine:
    • Per le serie di macchine di prima o seconda generazione, imposta il flag --ephemeral-storage-local-ssd=count.
    • Per le serie di macchine di terza o quarta generazione, scegli un tipo di macchina che raggruppa le unità SSD locali.
  • Il tipo di macchina e2-medium predefinito non supporta le unità SSD locali, pertanto devi selezionare un tipo di macchina diverso.
  • Per istruzioni su come creare o aggiornare un cluster in modo che esegua il provisioning degli SSD locali, consulta Esegui il provisioning e utilizza l'archiviazione temporanea supportata da SSD locali.

Best practice

Lo swap della memoria dei nodi è concepito come una rete di sicurezza per picchi di memoria imprevedibili, non come un sostituto di una memoria fisica sufficiente. Per indicazioni sull'ottimizzazione dei workload, consulta Dimensiona correttamente i workload GKE su larga scala.

Quando utilizzi lo swap della memoria dei nodi, tieni presente anche le seguenti best practice:

  • Isola i nodi con swap della memoria del nodo abilitato applicando un taint al node pool, ad esempio gke-swap=enabled:NoSchedule, e aggiungendo una tolleranza corrispondente ai workload destinati a utilizzare lo swap.
  • Dimensiona in modo appropriato lo spazio di swap della memoria del nodo. Uno spazio di swap insufficiente della memoria dei nodi potrebbe non impedire gli errori OOM e un utilizzo eccessivo può peggiorare le prestazioni.
  • Monitora l'utilizzo dello swap della memoria dei nodi nei tuoi workload. L'utilizzo frequente dello swap della memoria del nodo può essere un indicatore di pressione della memoria.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Per utilizzare Google Cloud CLI per questa attività, installala e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Abilita lo swap della memoria dei nodi

Puoi attivare lo swap della memoria dei nodi in base al cluster o al pool di nodi. Per attivare lo swap della memoria dei nodi, crea o aggiorna un file system-config.yaml che contiene la configurazione di swap della memoria dei nodi che preferisci. L'esempio seguente attiva lo swap della memoria dei nodi con le impostazioni predefinite:

linuxConfig:
  swapConfig:
    enabled: true

Puoi configurare altre impostazioni. Questo esempio configura lo swap non criptato in modo da utilizzare il 30% dello spazio di archiviazione di un'unità SSD locale temporanea:

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

Per un elenco dei campi facoltativi che puoi configurare, consulta la documentazione dell'API LinuxNodeConfig.

Abilita lo swap della memoria dei nodi su un cluster

Per attivare lo swap della memoria dei nodi su un cluster, completa uno dei seguenti passaggi:

  • Per creare un nuovo cluster con lo swap della memoria dei nodi abilitato, esegui il seguente comando:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del nuovo cluster.
    • LOCATION: la regione o la zona del tuo cluster.
  • Per aggiornare un cluster esistente in modo da abilitare lo swap della memoria dei nodi, esegui questo comando:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del nuovo cluster.
    • LOCATION: la regione o la zona del tuo cluster.

Abilita lo scambio di memoria dei nodi su un pool di nodi

Per attivare lo swap della memoria dei nodi in un pool di nodi, completa uno dei seguenti passaggi:

  • Per creare un nuovo pool di nodi con lo swap della memoria dei nodi abilitato, esegui questo comando:

    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
    

    Sostituisci quanto segue:

    • NODEPOOL_NAME: il nome del nuovo pool di nodi.
    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona del tuo cluster.
    • MACHINE_TYPE: un tipo di macchina compatibile. Per le unità SSD locali, assicurati di scegliere un tipo di macchina che includa unità SSD locali, ad esempio n1-standard-1.
  • Per aggiornare un pool di nodi esistente in modo da abilitare lo swap della memoria dei nodi, esegui questo comando:

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

    Sostituisci quanto segue:

    • NODEPOOL_NAME: il nome del pool di nodi.
    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona del tuo cluster.

Verificare la configurazione

Per verificare che lo swap della memoria del nodo sia abilitato, completa i seguenti passaggi:

  1. Verifica che system-config.yaml sia applicato con le impostazioni swapConfig eseguendo questo comando:

    gcloud container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. Verifica che la configurazione di kubelet esista sul nodo eseguendo questo comando:

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

Monitora l'utilizzo dello swap della memoria

Puoi monitorare la memoria dei nodi con Cloud Monitoring o kubectl.

Monitoraggio

Le seguenti metriche di sistema sono disponibili per impostazione predefinita per osservare l'utilizzo dello spazio di swap:

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

GKE fornisce anche metriche di utilizzo dello swap a livello di container tramite cAdvisor. Per utilizzare queste metriche, abilita cAdvisor sul cluster:

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

Monitora l'utilizzo dello swap con i comandi kubectl completando i seguenti passaggi:

  1. Controlla la condizione SwapDetected sull'oggetto nodo eseguendo questo comando:

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

    L'output è simile al seguente:

    {
      "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. Controlla la capacità di swap eseguendo questo comando:

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

    L'output è simile al seguente:

    {"capacity":53687087104}
    

Scambio di memoria del nodo con capacità SSD locale mista

Puoi attivare lo swap della memoria dei nodi sui node pool che eseguono il provisioning di SSD locali miste. GKE supporta i seguenti profili di swap:

  • Disco di avvio (bootDiskProfile)
  • SSD locale temporanea (ephemeralLocalSsdProfile): GKE alloca lo spazio di swap dalla parte di archiviazione temporanea degli SSD locali, non dalle partizioni dei blocchi non elaborati.

GKE non supporta il profilo di swap degli SSD locali dedicati (dedicatedLocalSsdProfile) con SSD locali misti.

Se utilizzi il profilo SSD locale temporaneo, tieni presente quanto segue:

  • Il campo swapSizePercent è una percentuale della capacità temporanea che imposti con il sottocampo capacity, non della capacità fisica totale dell'SSD locale. Ad esempio, con impostazioni come capacity=200GB e swapSizePercent: 20, GKE alloca 40 GiB di swap.
  • Lo spazio di swap riduce lo spazio di archiviazione temporaneo disponibile per i pod. GKE calcola l'archiviazione temporanea riservata dalla capacità temporanea meno la dimensione di swap.
  • La dimensione dello swap non può superare l'80% della capacità temporanea meno lo spazio di archiviazione temporaneo che GKE riserva per l'utilizzo del sistema. Se la capacità temporanea è troppo piccola per lo swap, la richiesta non va a buon fine.

Il seguente file system-config.yaml di esempio alloca il 20% della capacità temporanea allo spazio di swap:

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

Per creare un pool di nodi con capacità SSD locale mista e swap della memoria dei nodi, esegui il seguente comando:

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

Sostituisci quanto segue:

  • POOL_NAME: il nome del nuovo pool di nodi che vuoi creare.
  • CLUSTER_NAME: il nome del cluster.
  • MACHINE_TYPE: il tipo di macchina da utilizzare. Non puoi utilizzare gli SSD locali con il tipo di macchina e2-medium predefinito, perché i tipi di macchine con core condivisi non li supportano.
  • NUMBER_OF_DISKS: il numero di dischi SSD locali di cui eseguire il provisioning su ciascun nodo.
  • CAPACITY: la capacità totale dell'SSD locale da formattare per l'archiviazione temporanea. Questo valore deve essere maggiore di 0 e rigorosamente inferiore alla capacità fisica totale dell'SSD locale (numero di dischi × dimensione per disco), ad esempio 200GB.

Disabilita lo swap della memoria dei nodi

Per disattivare lo swap della memoria dei nodi, aggiorna il file system-config.yaml completando i seguenti passaggi:

  1. Aggiorna il file system-config.yaml per impostare swapConfig.enabled su false:

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. Aggiorna il pool di nodi con la nuova configurazione:

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

Passaggi successivi