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

A troca de memória dos 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 de nós pode ajudar a melhorar a resiliência das aplicações e evitar erros de falta de memória (OOM) para determinadas cargas de trabalho.

Quando usar a troca de memória do nó

Use a troca de memória de nós para fornecer um buffer contra erros de falta de memória para aplicações com utilização intensiva de memória, especialmente durante picos de utilização 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 falhas das aplicações devido ao esgotamento da memória do nó.
  • Otimize os custos evitando a necessidade de aprovisionar memória em excesso para picos ocasionais.

Como funciona a troca de memória do nó

Quando ativa a troca de memória do nó, o GKE configura o sistema operativo do nó para usar espaço em disco como memória virtual. Este processo fornece um buffer para aplicações que sofrem pressão temporária da memória.

O GKE calcula os limites de troca de contentores com base nos limites de recursos de memória do contentor e na memória total do nó.

Pode configurar a troca em diferentes tipos de armazenamento para equilibrar o desempenho e o custo:

  • Disco de arranque: usa o disco de arranque do nó para o espaço de troca.
  • SSD local efémero: usa um SSD local que também é partilhado com o armazenamento efémero do pod.
  • SSD local dedicado: reserva um ou mais SSDs locais exclusivamente para a troca.

Para proteger os dados confidenciais, o GKE encripta o espaço de troca por predefinição através de uma chave efémera.

Requisitos e limitações

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

  • Os clusters do GKE têm de ter a versão 1.34.1-gke.1341000 ou posterior.
  • Apenas os pods que têm a classe de Burstablequalidade de serviço (QoS) podem usar a troca de memória do nó. Para mais informações sobre as classes de QoS, consulte a documentação do Kubernetes para Classes de qualidade de serviço de pods.
  • Se ativar a troca de memória do nó, a política de redimensionamento do contentor tem de ser definida como RestartContainer.
  • Se configurar a troca de memória do nó para usar um disco de arranque, o tamanho da troca não pode exceder 50% da capacidade total do disco de arranque.

Se configurar a troca de memória de nós para usar um SSD local, tem de garantir que os seguintes requisitos são cumpridos:

  • O tipo de máquina tem de suportar SSDs locais. Não pode usar o armazenamento de blocos não processados com um SSD local.
  • Os nós têm de ser aprovisionados com SSDs locais. O método de aprovisionamento depende da série da máquina:
    • Para a primeira ou segunda geração da série de máquinas, 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 inclua SSDs locais.
  • O tipo de máquina e2-medium predefinido não suporta SSDs locais, pelo que tem de selecionar um tipo de máquina diferente.
  • Para ver instruções sobre como criar ou atualizar um cluster para que provisione SSDs locais, consulte o artigo Provisione e use armazenamento efémero suportado por SSDs locais.

Práticas recomendadas

A troca de memória de nós destina-se a ser uma rede de segurança para picos de memória imprevisíveis e não uma substituição da memória física suficiente. Para orientações sobre a otimização das cargas de trabalho, consulte o artigo Ajuste o tamanho das cargas de trabalho do GKE em grande escala.

Também deve considerar as seguintes práticas recomendadas quando usar a troca de memória do nó:

  • Isole os nós com a troca de memória ativada aplicando uma mancha ao node pool, por exemplo, gke-swap=enabled:NoSchedule, e adicionando uma tolerância correspondente às cargas de trabalho destinadas a usar a troca.
  • Dimensionar o espaço de troca de memória do nó de forma adequada. A memória do nó insuficiente o espaço de troca pode não impedir erros de falta de memória e a utilização excessiva pode degradar o desempenho.
  • Monitorize a utilização da troca de memória dos nós nas suas cargas de trabalho. A utilização frequente da troca de memória do nó pode ser um indicador de pressão de memória.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize a CLI gcloud. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

Ativar troca de memória de nós

Pode ativar a troca de memória de nós ao nível do cluster ou do conjunto de nós. Para ativar a troca de memória do nó, crie ou atualize um ficheiro system-config.yaml que contenha a configuração de troca de memória do nó pretendida. O exemplo seguinte ativa a troca de memória do nó com as predefinições:

linuxConfig:
  swapConfig:
    enabled: true

Existem definições adicionais que pode configurar. Este exemplo configura a troca não encriptada para usar 30% do armazenamento de um SSD local efémero:

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

Para ver uma lista de campos opcionais que pode configurar, consulte a LinuxNodeConfig documentação da API.

Ative a troca de memória de nós num cluster

Para ativar a troca de memória de nós num cluster, conclua um dos seguintes passos:

  • Para criar um novo 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 o seguinte:

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

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

    Substitua o seguinte:

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

Ative a troca de memória de nós num conjunto de nós

Para ativar a troca de memória de nós num conjunto de nós, conclua um dos seguintes passos:

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

    • NODEPOOL_NAME: o nome do novo node pool.
    • CLUSTER_NAME: o nome do seu cluster.
    • LOCATION: a região ou a zona do seu cluster.
    • MACHINE_TYPE: um tipo de máquina compatível. Para os SSDs locais, certifique-se de que escolhe um tipo de máquina que inclui SSDs locais, por exemplo, n1-standard-1.
  • Para atualizar um node pool existente para ativar a troca de memória de nós, 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 o seguinte:

    • NODEPOOL_NAME: o nome do seu node pool.
    • CLUSTER_NAME: o nome do seu cluster.
    • LOCATION: a região ou a zona do seu cluster.

Valide a configuração

Para verificar se a troca de memória do nó está ativada, conclua os seguintes passos:

  1. Verifique se o system-config.yaml é aplicado com as definiçõ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
    

Monitorize a utilização da troca de memória

Pode monitorizar a memória dos nós com o Cloud Monitoring ou o kubectl.

Monitorização

As seguintes métricas do sistema estão disponíveis por predefinição para observar a utilização da troca:

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

O GKE também fornece métricas de utilização de troca ao nível do contentor através do cAdvisor. Para usar estas métricas, ative o cAdvisor no cluster:

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

Monitorize a utilização da troca com comandos kubectl concluindo os seguintes passos:

  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 é semelhante ao 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 é semelhante ao seguinte:

    {"capacity":53687087104}
    

Desative a troca de memória de nós

Para desativar a troca de memória do nó, atualize o ficheiro system-config.yaml concluindo os seguintes passos:

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

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. Atualize o node pool 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
    

O que se segue?