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 está esgotada. A troca de memória de nós pode ajudar a melhorar a resiliência do aplicativo e evitar erros de falta de memória (OOM) para determinadas cargas de trabalho.

Quando usar a troca de memória de nós

Use a troca de memória de nós para fornecer um buffer contra erros de OOM para aplicativos com uso intenso de memória, especialmente durante picos de uso inesperados. A troca de memória de nós pode ajudar a melhorar a resiliência 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 falha de aplicativos devido ao esgotamento da memória do nó.
  • Otimizar custos evitando a necessidade de provisionar memória em excesso para picos ocasionais.

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

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

O GKE calcula os limites de troca de contêiner 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 de nós tem os seguintes requisitos e limitações:

  • Os clusters do GKE precisam ser da versão 1.34.1-gke.1341000 ou mais recente.
  • Somente os pods que têm a classe de qualidade de serviço (QoS) Burstable podem usar a troca de memória de nós. Para mais informações sobre classes de QoS, consulte a documentação do Kubernetes sobre classes de qualidade de serviço de pods.
  • Para redimensionar os recursos de memória dos contêineres, defina a política de redimensionamento do contêiner como RestartContainer.
  • Se você configurar a troca de memória de nós 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 de nós para usar um SSD local, verifique se os seguintes requisitos são atendidos:

  • O tipo de máquina precisa oferecer suporte a SSDs locais. Não é possível usar o 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, selecione um tipo de máquina diferente.
  • Para instruções sobre como criar ou atualizar um cluster para que ele provisione SSDs locais, consulte Provisionar e usar armazenamento temporário com SSD local.

Práticas recomendadas

A troca de memória de nós é destinada a ser 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 de nós:

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 Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Ativar a troca de memória de nós

É 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 de nós, crie ou atualize um arquivo system-config.yaml que contenha a configuração de troca de memória de nós desejada. O exemplo a seguir ativa a troca de memória de nós 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 uma lista de campos opcionais que podem ser configurados, consulte a LinuxNodeConfig documentação da API.

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 novo cluster com a troca de memória de nós ativada, execute o seguinte comando:

    gcloud 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 atual para ativar a troca de memória de nós, execute o seguinte comando:

    gcloud 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 de nós 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 de nós ativada, execute o seguinte 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
    

    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 para ativar a troca de memória de nós, execute o seguinte comando:

    gcloud 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 de nós está ativada, siga estas etapas:

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

    gcloud 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 de nós com o Cloud Monitoring ou kubectl.

Monitoramento

As seguintes métricas do sistema estão disponíveis por padrão para observar o uso da 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á assim:

    {
      "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á assim:

    {"capacity":53687087104}
    

Desativar a troca de memória de nós

Para desativar a troca de memória de nós, 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 container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

A seguir