Configurar nós para usar espaço em disco como memória virtual

A troca de memória de nós do Google Kubernetes Engine (GKE) permite que os nós do GKE usem espaço em disco como memória virtual quando a memória física se esgota. A troca de memória do nó pode ajudar a melhorar a capacidade de recuperação de aplicativos e evitar erros de falta de memória (OOM) em determinadas cargas de trabalho.

Quando usar a troca de memória do nó

Use a troca de memória do nó para fornecer um buffer contra erros de falta de memória para aplicativos que exigem muita memória, especialmente durante picos inesperados de uso. A troca de memória do nó pode ajudar a melhorar a capacidade de recuperação da carga de trabalho, como nos seguintes cenários:

  • Executar cargas de trabalho com padrões de memória imprevisíveis.
  • Reduzir o risco de falhas de aplicativos devido ao esgotamento da memória do nó.
  • Otimize os custos evitando o provisionamento excessivo de memória para picos ocasionais.

Como funciona a troca de memória de nós

Quando você ativa a troca de memória do nó, o GKE configura o sistema operacional do nó para usar espaço em disco como memória virtual. Esse processo fornece um buffer para aplicativos que sofrem pressão temporária na memória.

O GKE calcula os limites de troca de contêineres com base nos limites de recursos de memória do contêiner e na memória total do nó.

É possível configurar a troca em diferentes tipos de armazenamento para equilibrar desempenho e custo:

  • Disco de inicialização: usa o disco de inicialização do nó para espaço de troca.
  • SSD local temporário: usa um SSD local que também é compartilhado com o armazenamento temporário do pod.
  • SSD local dedicado: reserva um ou mais SSDs locais exclusivamente para troca.

Para proteger dados sensíveis, o GKE criptografa o espaço de troca por padrão usando uma chave temporária.

Requisitos e limitações

A troca de memória do nó tem os seguintes requisitos e limitações:

  • Os clusters do GKE precisam ser da versão 1.34.1-gke.1341000 ou posterior.
  • Somente pods com a classe de qualidade de serviço (QoS) Burstable podem usar a troca de memória do nó. Para mais informações sobre as classes de QoS, consulte a documentação do Kubernetes sobre Qualidade de pod de classes de serviço.
  • Se você ativar a troca de memória do nó, a política de redimensionamento de contêiner precisará ser definida como RestartContainer.
  • Se você configurar a troca de memória do nó para usar um disco de inicialização, o tamanho da troca não poderá exceder 50% da capacidade total do disco de inicialização.

Se você configurar a troca de memória do nó para usar um SSD local, verifique se os seguintes requisitos são atendidos:

  • O tipo de máquina precisa ser compatível com SSDs locais. Não é possível usar armazenamento em blocos brutos com um SSD local.
  • Os nós precisam ser provisionados com SSDs locais. O método de provisionamento depende da série de máquinas:
    • Para séries de máquinas de primeira ou segunda geração, defina a flag --ephemeral-storage-local-ssd=count.
    • Para séries de máquinas de terceira ou quarta geração, escolha um tipo de máquina que agrupe SSDs locais.
  • O tipo de máquina e2-medium padrão não oferece suporte a SSDs locais. Portanto, você precisa selecionar outro tipo.
  • Para instruções sobre como criar ou atualizar um cluster para provisionar SSDs locais, consulte Provisionar e usar armazenamento temporário com suporte de SSD local.

Práticas recomendadas

A troca de memória do nó é uma rede de segurança para picos de memória imprevisíveis, não um substituto para memória física suficiente. Para orientações sobre como otimizar cargas de trabalho, consulte Dimensionar as cargas de trabalho do GKE em escala.

Considere também as seguintes práticas recomendadas ao usar a troca de memória do nó:

  • Isole os nós com troca de memória ativada aplicando uma taint ao pool de nós, por exemplo, gke-swap=enabled:NoSchedule, e adicione uma tolerância correspondente às cargas de trabalho destinadas a usar a troca.
  • Dimensionar o espaço de troca de memória do nó adequadamente. A memória insuficiente do nó e o espaço de troca podem não evitar erros de falta de memória, e o uso excessivo pode degradar o desempenho.
  • Monitore o uso da troca de memória do nó nas suas cargas de trabalho. O uso frequente da troca de memória do nó pode ser um indicador de pressão na memória.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da gcloud CLI não sejam compatíveis com a execução dos comandos neste documento.

Ativar a troca de memória do nó

É possível ativar a troca de memória de nós em um cluster ou pool de nós. Para ativar a troca de memória do nó, crie ou atualize um arquivo system-config.yaml que contenha a configuração de troca de memória do nó desejada. O exemplo a seguir ativa a troca de memória do nó com as configurações padrão:

linuxConfig:
  swapConfig:
    enabled: true

Há outras configurações que podem ser definidas. Este exemplo configura a troca não criptografada para usar 30% do armazenamento de um SSD local temporário:

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

Para ver uma lista de campos opcionais que podem ser configurados, consulte a documentação da API LinuxNodeConfig.

Ativar a troca de memória de nós em um cluster

Para ativar a troca de memória de nós em um cluster, siga uma destas etapas:

  • Para criar um cluster com a troca de memória do nó ativada, execute o seguinte comando:

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

    Substitua:

    • CLUSTER_NAME: o nome do novo cluster;
    • LOCATION: a região ou zona do cluster.
  • Para atualizar um cluster e ativar a troca de memória do nó, execute o seguinte comando:

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

    Substitua:

    • CLUSTER_NAME: o nome do novo cluster;
    • LOCATION: a região ou zona do cluster.

Ativar a troca de memória do nó em um pool de nós

Para ativar a troca de memória de nós em um pool de nós, siga uma destas etapas:

  • Para criar um novo pool de nós com a troca de memória do nó ativada, execute o seguinte 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
    

    Substitua:

    • NODEPOOL_NAME: o nome do novo pool de nós.
    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: a região ou zona do cluster.
    • MACHINE_TYPE: um tipo de máquina compatível. Para SSDs locais, escolha um tipo de máquina que agrupe SSDs locais, por exemplo, n1-standard-1.
  • Para atualizar um pool de nós atual e ativar a troca de memória do nó, execute o seguinte comando:

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

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós.
    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: a região ou zona do cluster.

Verificar a configuração

Para verificar se a troca de memória do nó está ativada, siga estas etapas:

  1. Verifique se o system-config.yaml foi aplicado com as configurações de swapConfig executando o seguinte comando:

    gcloud beta container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. Verifique se a configuração do kubelet existe no nó executando o seguinte comando:

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

Monitorar o uso da troca de memória

É possível monitorar a memória do nó com o Cloud Monitoring ou o kubectl.

Monitoramento

As seguintes métricas do sistema estão disponíveis por padrão para observar o uso de troca:

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

O GKE também fornece métricas de uso de troca no nível do contêiner pelo cAdvisor. Para usar essas métricas, ative o cAdvisor no cluster:

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

Monitore o uso da troca com comandos kubectl seguindo estas etapas:

  1. Verifique a condição SwapDetected no objeto do nó executando o seguinte comando:

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

    O resultado será o seguinte:

    {
      "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. Verifique a capacidade de troca executando o seguinte comando:

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

    O resultado será o seguinte:

    {"capacity":53687087104}
    

Desativar a troca de memória do nó

Para desativar a troca de memória do nó, atualize o arquivo system-config.yaml seguindo estas etapas:

  1. Atualize o arquivo system-config.yaml para definir swapConfig.enabled como false:

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. Atualize o pool de nós com a nova configuração:

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

A seguir