La memoria de intercambio de nodos de Google Kubernetes Engine (GKE) permite que los nodos de GKE usen espacio en disco como memoria virtual cuando se agota la memoria física. La memoria de intercambio de nodos puede ayudar a mejorar la resiliencia de las aplicaciones y evitar errores de falta de memoria en determinadas cargas de trabajo.
Cuándo usar el intercambio de memoria de nodos
Usa la memoria de intercambio de nodos para proporcionar un búfer contra los errores de falta de memoria en aplicaciones que consumen mucha memoria, sobre todo durante picos de uso inesperados. La memoria de intercambio de nodos puede ayudarte a mejorar la resiliencia de tus cargas de trabajo en los siguientes casos:
- Ejecutar cargas de trabajo con patrones de memoria impredecibles.
- Reduce el riesgo de que las aplicaciones fallen debido al agotamiento de la memoria de los nodos.
- Optimiza los costes evitando la necesidad de aprovisionar memoria en exceso para picos ocasionales.
Cómo funciona la memoria de intercambio de nodos
Cuando habilitas la memoria de intercambio de nodos, GKE configura el sistema operativo del nodo para que use espacio en disco como memoria virtual. Este proceso proporciona un búfer para las aplicaciones que experimentan presión de memoria temporal.
GKE calcula los límites de intercambio de contenedores en función de los límites de recursos de memoria del contenedor y de la memoria total del nodo.
Puedes configurar la memoria swap en diferentes tipos de almacenamiento para equilibrar el rendimiento y el coste:
- Disco de arranque: usa el disco de arranque del nodo para el espacio de intercambio.
- SSD local efímero: usa un SSD local que también se comparte con el almacenamiento efímero de los pods.
- SSD local dedicado: reserva uno o varios SSD locales exclusivamente para la memoria swap.
Para proteger los datos sensibles, GKE cifra el espacio de intercambio de forma predeterminada con una clave efímera.
Requisitos y limitaciones
La memoria de intercambio de nodos tiene los siguientes requisitos y limitaciones:
- Los clústeres de GKE deben tener la versión
1.34.1-gke.1341000o una posterior. - Solo los pods que tengan la clase de
Burstablecalidad del servicio (QoS) pueden usar la memoria de intercambio de nodos. Para obtener más información sobre las clases de QoS, consulta la documentación de Kubernetes sobre las clases de calidad de servicio de los pods. - Si habilitas la memoria de intercambio de nodos, la política de cambio de tamaño del contenedor debe ser
RestartContainer. - Si configuras la memoria de intercambio de nodos para que use un disco de arranque, el tamaño de intercambio no puede superar el 50% de la capacidad total del disco de arranque.
Si configuras la memoria de intercambio de nodos para que use un SSD local, debes asegurarte de que se cumplen los siguientes requisitos:
- El tipo de máquina debe admitir discos SSD locales. No puedes usar el almacenamiento en bloques sin formato con un SSD local.
- Los nodos deben aprovisionarse con SSDs locales. El método de aprovisionamiento depende de la serie de la máquina:
- En las series de máquinas de primera o segunda generación, define la marca
--ephemeral-storage-local-ssd=count. - En el caso de las series de máquinas de tercera o cuarta generación, elige un tipo de máquina que incluya SSDs locales.
- En las series de máquinas de primera o segunda generación, define la marca
- El tipo de máquina
e2-mediumpredeterminado no admite SSDs locales, por lo que debes seleccionar otro tipo de máquina. - Para obtener instrucciones sobre cómo crear o actualizar un clúster para que aprovisione SSDs locales, consulta Aprovisionar y usar almacenamiento efímero respaldado por SSDs locales.
Prácticas recomendadas
El intercambio de memoria de nodos está pensado para hacer frente a picos de memoria impredecibles, no para sustituir una memoria física suficiente. Para obtener información sobre cómo optimizar las cargas de trabajo, consulta el artículo Ajustar el tamaño de las cargas de trabajo de GKE a gran escala.
También debes tener en cuenta las siguientes prácticas recomendadas al usar el intercambio de memoria de nodos:
- Aísla los nodos con la función de intercambio de memoria habilitada aplicando un taint al grupo de nodos, por ejemplo,
gke-swap=enabled:NoSchedule, y añadiendo una tolerancia correspondiente a las cargas de trabajo que vayan a usar el intercambio. - Ajusta el tamaño del espacio de intercambio de memoria de tu nodo. Memoria de nodo insuficiente Es posible que el espacio de intercambio no evite los errores de falta de memoria y que un uso excesivo pueda reducir el rendimiento.
- Monitoriza el uso de la memoria de intercambio de nodos en tus cargas de trabajo. El uso frecuente de la memoria de intercambio de nodos puede ser un indicador de presión de memoria.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Habilitar la memoria de intercambio de nodos
Puedes habilitar la memoria de intercambio de nodos en un clúster o en un grupo de nodos. Para habilitar el intercambio de memoria de nodos, crea o actualiza un archivo system-config.yaml que contenga la configuración de intercambio de memoria de nodos que quieras. En el siguiente ejemplo se habilita el intercambio de memoria de nodos con la configuración predeterminada:
linuxConfig:
swapConfig:
enabled: true
Hay otros ajustes que puedes configurar. En este ejemplo se configura el intercambio sin cifrar para que use el 30% del almacenamiento de un SSD local efímero:
linuxConfig:
swapConfig:
enabled: true
encryptionConfig:
disabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 30
Para ver una lista de los campos opcionales que puede configurar, consulte la documentación de la API LinuxNodeConfig.
Habilitar la memoria de intercambio de nodos en un clúster
Para habilitar la memoria de intercambio de nodos en un clúster, sigue uno de estos pasos:
Para crear un clúster con la memoria de intercambio de nodos habilitada, ejecuta el siguiente comando:
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=1.34.1-gke.1341000 \ --system-config-from-file=system-config.yamlHaz los cambios siguientes:
CLUSTER_NAME: el nombre del nuevo clúster.LOCATION: la región o la zona de tu clúster.
Para actualizar un clúster y habilitar el intercambio de memoria de los nodos, ejecuta el siguiente comando:
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yamlHaz los cambios siguientes:
CLUSTER_NAME: el nombre del nuevo clúster.LOCATION: la región o la zona de tu clúster.
Habilitar la memoria de intercambio de nodos en un grupo de nodos
Para habilitar la memoria de intercambio de nodos en un grupo de nodos, siga uno de estos pasos:
Para crear un grupo de nodos con la memoria de intercambio de nodos habilitada, ejecuta el siguiente 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_TYPEHaz los cambios siguientes:
NODEPOOL_NAME: el nombre del nuevo grupo de nodos.CLUSTER_NAME: el nombre de tu clúster.LOCATION: la región o la zona de tu clúster.MACHINE_TYPE: un tipo de máquina compatible. En el caso de las SSDs locales, asegúrate de elegir un tipo de máquina que incluya SSDs locales, comon1-standard-1.
Para actualizar un grupo de nodos y habilitar la memoria de intercambio de nodos, ejecuta el siguiente comando:
gcloud beta container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yamlHaz los cambios siguientes:
NODEPOOL_NAME: el nombre del grupo de nodos.CLUSTER_NAME: el nombre de tu clúster.LOCATION: la región o la zona de tu clúster.
Verificar la configuración
Para verificar que la memoria de intercambio de nodos esté habilitada, sigue estos pasos:
Para comprobar que se ha aplicado el
system-config.yamlcon la configuración deswapConfig, ejecuta el siguiente comando:gcloud beta container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format='yaml(config.linuxNodeConfig.swapConfig)'Para comprobar que la configuración de kubelet existe en el nodo, ejecuta el siguiente comando:
kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
Monitorizar el uso de la memoria swap
Puedes monitorizar la memoria de los nodos con Cloud Monitoring o kubectl.
Supervisión
Las siguientes métricas del sistema están disponibles de forma predeterminada para observar el uso de la memoria swap:
kubernetes.io/node/memory/swap_used_byteskubernetes.io/container/memory/swap_used_bytes
GKE también proporciona métricas de uso de swap a nivel de contenedor a través de cAdvisor. Para usar estas métricas, habilite cAdvisor en el clúster:
prometheus.googleapis.com/container_memory_swap/gauge
kubectl
Para monitorizar el uso de la memoria de intercambio con los comandos kubectl, sigue estos pasos:
Comprueba la condición
SwapDetecteden el objeto de nodo ejecutando el siguiente comando:kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .El resultado debería ser similar al siguiente:
{ "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" }Comprueba la capacidad de intercambio ejecutando el siguiente comando:
kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'El resultado debería ser similar al siguiente:
{"capacity":53687087104}
Inhabilitar el intercambio de memoria de nodos
Para inhabilitar el intercambio de memoria de nodos, actualiza el archivo system-config.yaml siguiendo estos pasos:
Actualiza el archivo
system-config.yamlpara asignar el valorfalseaswapConfig.enabled:linuxConfig: swapConfig: enabled: falseActualiza el grupo de nodos con la nueva configuración:
gcloud beta container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml
Siguientes pasos
- Más información sobre cómo personalizar la configuración del sistema de nodos
- Consulta más información sobre las opciones de almacenamiento de GKE.