El intercambio de memoria 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. El intercambio de memoria del nodo 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 los errores de OOM para las aplicaciones que consumen mucha memoria, en especial durante los picos de uso inesperados. 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 del nodo.
- Optimiza los costos, ya que evita la necesidad de aprovisionar en exceso la memoria para los picos ocasionales.
Cómo funciona el intercambio de memoria de nodos
Cuando habilitas el intercambio de memoria del nodo, 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 temporal de la memoria.
GKE calcula los límites de intercambio de contenedores según 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 un SSD local que también se comparte con el almacenamiento efímero del Pod.
- SSD local dedicado: Reserva uno 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 de 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 del nodo. 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 el intercambio de memoria del nodo, la política de cambio de tamaño del contenedor debe establecerse en
RestartContainer. - Si configuras el intercambio de memoria del nodo para que use un disco de arranque, el tamaño del intercambio no puede superar el 50% de la capacidad total del disco de arranque.
Si configuras el intercambio de memoria del nodo para que use 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 un 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. - En el caso de las series de máquinas de tercera o cuarta generación, elige un tipo de máquina que incluya 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 otro tipo de máquina. - Para obtener instrucciones sobre cómo crear o actualizar un clúster para que aprovisione SSDs locales, consulta Aprovisiona y usa el almacenamiento efímero respaldado por SSD local.
Prácticas recomendadas
El intercambio de memoria del nodo está diseñado como una red de seguridad para los picos de memoria impredecibles, no como un reemplazo de la memoria física suficiente. Si necesitas orientación para optimizar las 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 aplicando un taint al grupo de nodos, por ejemplo,
gke-swap=enabled:NoSchedule, y agrega una tolerancia correspondiente a las cargas de trabajo que se destinen a usar el intercambio. - Ajusta el tamaño del espacio de intercambio de memoria del nodo de forma adecuada. Es posible que un espacio de intercambio de memoria de nodo insuficiente no evite los errores de OOM, y el uso excesivo puede degradar el rendimiento.
- Supervisa el uso de intercambio de memoria de nodos en tus cargas de trabajo. El uso frecuente del intercambio de memoria del nodo 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. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa 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 que se describen en este documento.
Habilita el intercambio de memoria de nodos
Puedes habilitar el intercambio de memoria de nodos en un clúster o 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 desees. En el siguiente ejemplo, se habilita el intercambio de memoria del nodo con la configuración predeterminada:
linuxConfig:
swapConfig:
enabled: true
Hay parámetros de configuración adicionales que puedes establecer. En este ejemplo, se configura el intercambio sin encriptar para usar el 30% del almacenamiento de un SSD local efímero:
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 del nodo habilitado, 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.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 y habilitar el intercambio de memoria de nodos, ejecuta el siguiente comando:
gcloud beta 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 del nodo 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 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_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: Un tipo de máquina compatible. En el caso de las SSD locales, asegúrate de elegir un tipo de máquina que incluya SSD locales, por ejemplo,n1-standard-1.
Para actualizar un grupo de nodos existente y habilitar el intercambio de memoria 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.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 del nodo esté habilitado, completa los siguientes pasos:
Ejecuta el siguiente comando para verificar que
system-config.yamlse aplique con la configuración deswapConfig:gcloud beta container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format='yaml(config.linuxNodeConfig.swapConfig)'Para verificar que la configuración de kubelet exista en el nodo, ejecuta el siguiente comando:
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 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 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úster:
prometheus.googleapis.com/container_memory_swap/gauge
kubectl
Para supervisar el uso del intercambio con comandos de kubectl, completa los siguientes pasos:
Ejecuta el siguiente comando para verificar la condición
SwapDetecteden el objeto del nodo:kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .El resultado es similar a lo 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" }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 lo siguiente:
{"capacity":53687087104}
Inhabilita el intercambio de memoria de nodos
Para inhabilitar el intercambio de memoria del nodo, actualiza tu 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 nueva configuración:
gcloud beta 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.