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

Lo swap di memoria dei nodi 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 esaurimento della memoria per determinati carichi di lavoro.

Quando utilizzare lo swap di memoria dei nodi

Utilizza lo swap di memoria dei nodi per fornire un buffer contro gli errori di esaurimento della memoria per le applicazioni che richiedono molta memoria, soprattutto durante picchi di utilizzo imprevisti. Lo swap di memoria dei nodi può contribuire a migliorare la resilienza del workload, ad esempio negli scenari seguenti:

  • Esegui carichi di lavoro con pattern di memoria imprevedibili.
  • Ridurre il rischio di arresto anomalo delle applicazioni a causa dell'esaurimento della memoria dei nodi.
  • Ottimizza i costi evitando la necessità di eseguire l'overprovisioning della memoria per picchi occasionali.

Come funziona lo scambio di memoria dei nodi

Quando abiliti lo swap di 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 subiscono 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 spazio di 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 temporaneo: utilizza un SSD locale condiviso anche con lo spazio di archiviazione temporaneo del pod.
  • SSD locale dedicato: riserva uno o più SSD locali esclusivamente per lo swap.

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

Requisiti e limitazioni

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

  • I cluster GKE devono essere la versione 1.34.1-gke.1341000 o successiva.
  • Solo i pod con la classe di qualità del servizio (QoS) Burstable possono utilizzare lo swap di memoria dei nodi. Per ulteriori informazioni sulle classi QoS, consulta la documentazione di Kubernetes relativa alle classi di qualità del servizio dei pod.
  • Se abiliti lo swap di memoria dei nodi, il criterio di ridimensionamento dei container deve essere impostato su RestartContainer.
  • Se configuri lo swap di memoria del nodo in modo che utilizzi un disco di avvio, le dimensioni dello swap non possono superare il 50% della capacità totale del disco di avvio.

Se configuri lo swap di memoria dei nodi in modo che utilizzi un SSD locale, devi assicurarti che siano soddisfatti i seguenti requisiti:

  • Il tipo di macchina deve supportare le SSD locali. Non puoi utilizzare lo spazio di archiviazione a blocchi non elaborato con un SSD locale.
  • I nodi devono essere sottoposti a provisioning 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 gli SSD locali.
  • Il tipo di macchina e2-medium predefinito non supporta gli SSD locali, quindi 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 Eseguire il provisioning e utilizzare l'archiviazione temporanea basata su SSD locali.

Best practice

Lo scambio di memoria dei nodi è inteso come rete di sicurezza per picchi di memoria imprevedibili, non come sostituzione di una memoria fisica sufficiente. Per indicazioni sull'ottimizzazione dei workload, consulta Ridimensiona correttamente i tuoi workload GKE su larga scala.

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

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

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi 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 scambio di memoria dei nodi

Puoi abilitare 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 contenga la configurazione dello swap della memoria dei nodi che preferisci. Il seguente esempio attiva lo swap della memoria dei nodi con le impostazioni predefinite:

linuxConfig:
  swapConfig:
    enabled: true

Esistono impostazioni aggiuntive che puoi configurare. Questo esempio configura lo swap non criptato in modo che utilizzi il 30% dello spazio di archiviazione di un SSD locale temporaneo:

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 di memoria dei nodi su un cluster

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

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

    gcloud beta 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 cluster.
  • Per aggiornare un cluster esistente in modo da abilitare lo swap della memoria dei nodi, esegui questo comando:

    gcloud beta 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 cluster.

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

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

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

    gcloud beta 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 cluster.
    • MACHINE_TYPE: un tipo di macchina compatibile. Per gli SSD locali, assicurati di scegliere un tipo di macchina che raggruppi gli SSD locali, ad esempio n1-standard-1.
  • Per aggiornare un pool di nodi esistente in modo da abilitare lo swap di memoria dei nodi, esegui questo comando:

    gcloud beta 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 tuo pool di nodi.
    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona del cluster.

Verificare la configurazione

Per verificare che lo swap di memoria dei nodi sia abilitato:

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

    gcloud beta 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 il seguente comando:

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

Monitorare l'utilizzo dello swap di 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 sull'utilizzo dello spazio di 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 spazio di 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}
    

Disattiva lo scambio di 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 beta container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

Passaggi successivi