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.1341000ou 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.
- Para a primeira ou segunda geração da série de máquinas, defina a flag
- O tipo de máquina
e2-mediumpredefinido 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 updatepara 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.yamlSubstitua 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.yamlSubstitua 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_TYPESubstitua 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.yamlSubstitua 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:
Verifique se o
system-config.yamlé aplicado com as definições deswapConfigexecutando o seguinte comando:gcloud beta 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
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_byteskubernetes.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:
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 é 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" }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:
Atualize o ficheiro
system-config.yamlpara definirswapConfig.enabledcomofalse:linuxConfig: swapConfig: enabled: falseAtualize 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?
- Saiba mais sobre a personalização da configuração do sistema de nós.
- Saiba mais sobre as opções de armazenamento do GKE.