El intercambio de memoria de nodos de Google Kubernetes Engine (GKE) permite que los nodos de GKE usen espacio en el disco como memoria virtual cuando se agota la memoria física. El intercambio de memoria de nodos puede ayudar a mejorar la resiliencia de las aplicaciones y evitar errores de memoria insuficiente (OOM) para ciertas cargas de trabajo.
Cuándo usar el intercambio de memoria de nodos
Usa el intercambio de memoria de nodos para proporcionar un búfer contra errores de OOM para aplicaciones que consumen mucha memoria, en especial durante los aumentos inesperados de uso. El intercambio de memoria de nodos puede ayudar a mejorar la resiliencia de tu carga de trabajo, como en las siguientes situaciones:
- Ejecuta cargas de trabajo con patrones de memoria impredecibles.
- Reduce el riesgo de que las aplicaciones fallen debido al agotamiento de la memoria de nodos.
- Optimiza los costos evitando la necesidad de aprovisionar en exceso la memoria para picos ocasionales.
Cómo funciona el intercambio de memoria de nodos
Cuando habilitas el intercambio de memoria de nodos, GKE configura el sistema operativo del nodo para usar espacio en el 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 la memoria total del nodo.
Puedes configurar el intercambio en diferentes tipos de almacenamiento para equilibrar el rendimiento y el costo:
- Disco de arranque: Usa el disco de arranque del nodo para el espacio de intercambio.
- SSD local efímero: Usa una SSD local que también se comparte con el almacenamiento efímero de Pod.
- SSD local dedicada: Reserva una o más SSD locales exclusivamente para el intercambio.
Para proteger los datos sensibles, GKE encripta el espacio de intercambio de forma predeterminada con una clave efímera.
Requisitos y limitaciones
El intercambio de memoria de nodos tiene los siguientes requisitos y limitaciones:
- Los clústeres de GKE deben ser la versión
1.34.1-gke.1341000o posterior. - Solo los Pods que tienen la clase de Calidad de servicio (QoS)
Burstablepueden usar el intercambio de memoria 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 Pods. - Para cambiar el tamaño de los recursos de memoria de los contenedores, debes establecer la
política de cambio de tamaño del contenedor en
RestartContainer. - Si configuras el intercambio de memoria de nodos para usar un disco de arranque, el tamaño del intercambio no puede exceder el 50% de la capacidad total del disco de arranque.
Si configuras el intercambio de memoria de nodos para usar una SSD local, debes asegurarte de que se cumplan los siguientes requisitos:
- El tipo de máquina debe admitir SSD locales. No puedes usar el almacenamiento en bloque sin procesar con una SSD local.
- Los nodos deben aprovisionarse con SSD locales. El método de aprovisionamiento depende de la serie de máquinas:
- Para las series de máquinas de primera o segunda generación, establece la marca
--ephemeral-storage-local-ssd=count. - Para las series de máquinas de tercera o cuarta generación, elige un tipo de máquina que agrupe SSD locales.
- Para las series de máquinas de primera o segunda generación, establece la marca
- El tipo de máquina
e2-mediumpredeterminado no admite SSD locales, por lo que debes seleccionar un tipo de máquina diferente. - Para obtener instrucciones sobre cómo crear o actualizar un clúster para que aprovisione SSD locales, consulta Aprovisiona y usa el almacenamiento efímero respaldado por SSD local.
Prácticas recomendadas
El intercambio de memoria de nodos está diseñado como una red de seguridad para los picos de memoria impredecibles, no como un reemplazo de la memoria física suficiente. Para obtener orientación sobre la optimización de cargas de trabajo, consulta Redimensiona tus cargas de trabajo de GKE a gran escala.
También debes tener en cuenta las siguientes prácticas recomendadas cuando uses el intercambio de memoria de nodos:
- Aísla los nodos habilitados para el intercambio de memoria de nodos mediante
la aplicación de un taint al grupo de nodos, por ejemplo,
gke-swap=enabled:NoSchedule, y agregando una tolerancia correspondiente a las cargas de trabajo destinadas a usar el intercambio. - Ajusta el tamaño del espacio de intercambio de memoria de nodos de forma adecuada. Es posible que un espacio de intercambio de memoria de nodos insuficiente no evite los errores de OOM, y el uso excesivo puede degradar el rendimiento.
- Supervisa el uso del intercambio de memoria de nodos en tus cargas de trabajo. El uso frecuente del intercambio de memoria de nodos puede ser un indicador de presión de memoria.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilita la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea,
instala y, luego,
inicializa the
gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.
Habilita el intercambio de memoria de nodos
Puedes habilitar el intercambio de memoria de nodos en un clúster o 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 deseas. En el siguiente ejemplo, se habilita el intercambio de memoria de nodos con la configuración predeterminada:
linuxConfig:
swapConfig:
enabled: true
Hay parámetros de configuración adicionales que puedes configurar. En este ejemplo, se configura el intercambio sin encriptar para usar el 30% del almacenamiento de una SSD local efímera:
linuxConfig:
swapConfig:
enabled: true
encryptionConfig:
disabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 30
Para obtener una lista de los campos opcionales que puedes configurar, consulta la documentación de la API de LinuxNodeConfig.
Habilita el intercambio de memoria de nodos en un clúster
Para habilitar el intercambio de memoria de nodos en un clúster, completa uno de los siguientes pasos:
Para crear un clúster nuevo con el intercambio de memoria de nodos habilitado, ejecuta el siguiente comando:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=1.34.1-gke.1341000 \ --system-config-from-file=system-config.yamlReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster nuevo.LOCATION: Es la región o zona de tu clúster.
Para actualizar un clúster existente para habilitar el intercambio de memoria de nodos, ejecuta el siguiente comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yamlReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster nuevo.LOCATION: Es la región o zona de tu clúster.
Habilita el intercambio de memoria de nodos en un grupo de nodos
Para habilitar el intercambio de memoria de nodos en un grupo de nodos, completa uno de los siguientes pasos:
Para crear un grupo de nodos nuevo con el intercambio de memoria de nodos habilitado, ejecuta el siguiente 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_TYPEReemplaza lo siguiente:
NODEPOOL_NAME: es el nombre de tu grupo de nodos nuevo.CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona de tu clúster.MACHINE_TYPE: Es un tipo de máquina compatible. Para las SSD locales, asegúrate de elegir un tipo de máquina que agrupe SSD locales, por ejemplo,n1-standard-1.
Para actualizar un grupo de nodos existente para habilitar el intercambio de memoria de nodos, ejecuta el siguiente comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yamlReemplaza lo siguiente:
NODEPOOL_NAME: es el nombre de tu grupo de nodos.CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona de tu clúster.
Verifica la configuración
Para verificar que el intercambio de memoria de nodos esté habilitado, completa los siguientes pasos:
Ejecuta el siguiente comando para verificar que
system-config.yamlse aplique con la configuración deswapConfig:gcloud container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format='yaml(config.linuxNodeConfig.swapConfig)'Ejecuta el siguiente comando para verificar que la configuración de kubelet exista en el nodo:
kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
Supervisa el uso del intercambio de memoria
Puedes supervisar la memoria de nodos con Cloud Monitoring o kubectl.
Supervisión
Las siguientes métricas del sistema están disponibles de forma predeterminada para observar el uso del intercambio:
kubernetes.io/node/memory/swap_used_byteskubernetes.io/container/memory/swap_used_bytes
GKE también proporciona métricas de uso de intercambio a nivel del contenedor a través de cAdvisor. Para usar estas métricas, habilita cAdvisor en el clú1ster:
prometheus.googleapis.com/container_memory_swap/gauge
kubectl
Para supervisar el uso del intercambio con comandos kubectl, completa los siguientes pasos:
Ejecuta el siguiente comando para verificar la condición
SwapDetecteden el objeto de nodo:kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .El resultado es similar a este:
{ "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" }Ejecuta el siguiente comando para verificar la capacidad de intercambio:
kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'El resultado es similar a este:
{"capacity":53687087104}
Inhabilita el intercambio de memoria de nodos
Para inhabilitar el intercambio de memoria de nodos, actualiza el archivo system-config.yaml completando los siguientes pasos:
Actualiza el archivo
system-config.yamlpara establecerswapConfig.enabledenfalse:linuxConfig: swapConfig: enabled: falseActualiza el grupo de nodos con la configuración nueva:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml
¿Qué sigue?
- Obtén más información para personalizar la configuración del sistema de nodos.
- Obtén más información sobre las opciones de almacenamiento de GKE.