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 estiver 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) em 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 OOM para aplicativos que consomem muita memória, especialmente durante picos de uso inesperados. A troca de memória do nó 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 dos aplicativos devido à falta de memória do nó.
- Otimize os 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 do nó, 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 passam por pressão temporária de memó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 o desempenho e o custo:
- Disco de inicialização: usa o disco de inicialização do nó para o espaço de troca.
- SSD local temporário: usa um SSD local que também é compartilhado com o armazenamento temporário do pod. Se o nó usar capacidade mista de SSD local, a troca usará apenas a parte de armazenamento temporário dos SSDs locais.
- 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 posterior. - Somente os pods que têm a classe de qualidade de serviço (QoS)
Burstablepodem usar a troca de memória do nó. Para mais informações sobre as 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 de contêineres 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. Só é possível usar SSDs locais provisionados como armazenamento temporário ou armazenamento misto. Não é possível usar o SSD local provisionado como armazenamento dispositivo de transferência por blocos bruto. Para uma lista de perfis de troca compatíveis nesse modo, consulte Troca de memória de nó com capacidade mista de 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 inclua SSDs locais.
- Para séries de máquinas de primeira ou segunda geração, defina a flag
- O tipo de máquina padrão
e2-mediumnão é compatível com SSDs locais. Portanto, é necessário selecionar 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 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 de nó:
- Isole os nós com troca de memória de nó ativada
aplicando um taint ao pool de nós, por exemplo,
gke-swap=enabled:NoSchedule, e adicionando uma tolerância correspondente às cargas de trabalho que usarão a troca. - Dimensione o espaço de troca de memória do nó de maneira adequada. O espaço de troca de memória insuficiente do nó pode não evitar erros de OOM, e o uso excessivo pode prejudicar o desempenho.
- Monitore o uso da troca de memória do nó nas cargas de trabalho. O uso 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, verifique se você realizou as tarefas a seguir:
- Ative a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Para usar a Google Cloud CLI nesta tarefa,
instale e 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 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 de nó, crie ou atualize um arquivo system-config.yaml que contenha
a configuração de troca de memória de nó que você quer. 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 você pode definir. 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 de nó 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 e 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ó em um pool de nós
Para ativar a troca de memória de nó 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ó 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 inclua SSDs locais, por exemplo,n1-standard-1.
Para atualizar um pool de nós atual e 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 do nó está ativada, siga estas etapas:
Verifique se o
system-config.yamlfoi aplicado com as configurações deswapConfigexecutando 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 de 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 swap:
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 por meio do cAdvisor. Para usar essas métricas, ative o cAdvisor no cluster:
prometheus.googleapis.com/container_memory_swap/gauge
kubectl
Monitore o uso de swap com os 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á 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" }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}
Troca de memória de nó com capacidade mista de SSD local
É possível ativar a troca de memória de nós em pools de nós que provisionam SSDs locais mistos. O GKE é compatível com os seguintes perfis de troca:
- Disco de inicialização (
bootDiskProfile) - SSD local temporário (
ephemeralLocalSsdProfile): o GKE aloca espaço de troca da parte de armazenamento temporário dos SSDs locais, não das partições de bloco bruto.
O GKE não é compatível com o perfil de troca de SSD local dedicado
(dedicatedLocalSsdProfile) com SSDs locais mistos.
Se você usar o perfil de SSD local temporário, observe o seguinte:
- O campo
swapSizePercenté uma porcentagem da capacidade temporária que você define com o subcampocapacity, não a capacidade física total do SSD local. Por exemplo, com configurações comocapacity=200GBeswapSizePercent: 20, o GKE aloca 40 GiB de swap. - O espaço de troca reduz o armazenamento temporário disponível para os pods. O GKE calcula o armazenamento temporário reservado com base na capacidade temporária menos o tamanho da troca.
- O tamanho da troca não pode exceder 80% da capacidade temporária menos o armazenamento temporário que o GKE reserva para uso do sistema. Se a capacidade temporária for muito pequena para acomodar a troca, a solicitação vai falhar.
O exemplo de arquivo system-config.yaml a seguir aloca 20% da capacidade temporária
para troca:
linuxConfig:
swapConfig:
enabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 20
Para criar um pool de nós com capacidade mista de SSD local e troca de memória de nó, execute o seguinte comando:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--ephemeral-storage-local-ssd count=NUMBER_OF_DISKS,capacity=CAPACITY \
--system-config-from-file=system-config.yaml
Substitua:
POOL_NAME: o nome do novo pool de nós que você quer criar.CLUSTER_NAME: o nome do cluster.MACHINE_TYPE: o tipo de máquina que será usado. Não é possível usar SSDs locais com o tipo de máquinae2-mediumpadrão, porque os tipos de máquina com núcleo compartilhado não são compatíveis com eles.NUMBER_OF_DISKS: o número dos discos SSD locais a serem provisionados em cada nó.CAPACITY: a capacidade total do SSD local a ser formatada para armazenamento temporário. Esse valor precisa ser maior que 0 e estritamente menor que a capacidade física total do SSD local (contagem de discos × tamanho por disco), por exemplo,200GB.
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:
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.