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.1341000ou mais recente. - Somente os pods que têm a classe de qualidade de serviço (QoS)
Burstablepodem 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.
- Para séries de máquinas de primeira ou segunda geração, defina a flag
- O tipo de máquina
e2-mediumpadrã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:
- Isole os nós ativados para troca de memória aplicando um taint ao pool de nós, por exemplo, e adicionando uma tolerância correspondente às cargas de trabalho destinadas a usar a troca.
gke-swap=enabled:NoSchedule - Dimensionar o espaço de troca de memória do nó de maneira adequada. O espaço de troca de memória de nós insuficiente pode não impedir erros de OOM, e o uso excessivo pode degradar a performance.
- Monitore o uso da troca de memória de nós nas cargas de trabalho. O uso frequente da troca de memória de nós pode ser um indicador de pressão de 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 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.yamlSubstitua:
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.yamlSubstitua:
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_TYPESubstitua:
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.yamlSubstitua:
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:
Verifique se o
system-config.yamlfoi aplicado com as configuraçõesswapConfigexecutando o seguinte comando:gcloud container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format='yaml(config.linuxNodeConfig.swapConfig)'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_byteskubernetes.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:
Verifique a condição
SwapDetectedno 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" }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:
Atualize o arquivo
system-config.yamlpara definirswapConfig.enabledcomofalse:linuxConfig: swapConfig: enabled: falseAtualize 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
- Saiba mais sobre como personalizar a configuração do sistema de nós.
- Saiba mais sobre as opções de armazenamento do GKE.