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 falta de memoria (OOM) en 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 en las aplicaciones que consumen mucha memoria, especialmente durante los aumentos 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:
- Ejecutar 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 evitando la necesidad de aprovisionar memoria en exceso para los picos ocasionales.
Cómo funciona el intercambio de memoria de nodos
Cuando habilitas el intercambio de memoria de nodo, GKE configura el sistema operativo del nodo para que use el 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ímera: Usa una SSD local que también se comparte con el almacenamiento efímero del Pod. Si el nodo usa una capacidad de SSD local mixta, el intercambio usa solo la parte de almacenamiento efímero de las SSD locales.
- 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 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 de 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. - 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 del nodo para usar un disco de arranque, el tamaño de intercambio no puede superar el 50% de la capacidad total del disco de arranque.
Si configuras el intercambio de memoria de nodo para usar una SSD local, debes asegurarte de que se cumplan los siguientes requisitos:
- El tipo de máquina debe admitir SSD locales. Solo puedes usar SSDs locales aprovisionadas como almacenamiento efímero o almacenamiento mixto. No puedes usar SSD locales aprovisionadas como almacenamiento de dispositivo de almacenamiento en bloques sin procesar. Para obtener una lista de los perfiles de intercambio compatibles en este modo, consulta Intercambio de memoria de nodo con capacidad de SSD local mixta.
- 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 incluya SSDs 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 nodo está pensado como una red de seguridad para los aumentos repentinos de memoria impredecibles, no como un reemplazo de la memoria física suficiente. Para obtener orientación sobre cómo 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 nodo:
- Aísla los nodos habilitados para el intercambio de memoria de nodos
aplicando un taint al grupo de nodos, por ejemplo,
gke-swap=enabled:NoSchedule, y agregando una tolerancia correspondiente a las cargas de trabajo que usarán el intercambio. - Asigna un tamaño adecuado al espacio de intercambio de memoria de los nodos. Es posible que el 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 del intercambio de memoria de los 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
- Para usar Google Cloud CLI en esta tarea,
instala y, luego,
inicializa la
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 por 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 de nodos 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 de nodo 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 del clúster.
Para actualizar un clúster existente y 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 del clúster.
Habilita el intercambio de memoria de nodo en un grupo de nodos
Para habilitar el intercambio de memoria de 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 nodo 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 del clúster.MACHINE_TYPE: un tipo de máquina compatible. En el caso de los 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 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 del clúster.
Verifica la configuración
Para verificar que el intercambio de memoria de nodo esté habilitado, completa los siguientes pasos:
Ejecuta el siguiente comando para verificar que se aplique el
system-config.yamlcon 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 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 de 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 de intercambio con los comandos de kubectl, completa los siguientes pasos:
Verifica 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 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}
Intercambio de memoria de nodo con capacidad de SSD local mixta
Puedes habilitar el intercambio de memoria de nodos en los grupos de nodos que aprovisionan SSD locales mixtos. GKE admite los siguientes perfiles de intercambio:
- Disco de arranque (
bootDiskProfile) - SSD local efímero (
ephemeralLocalSsdProfile): GKE asigna espacio de intercambio desde la parte de almacenamiento efímero de los SSD locales, no desde las particiones de bloques sin procesar.
GKE no admite el perfil de intercambio de SSD local dedicado
(dedicatedLocalSsdProfile) con SSD locales mixtas.
Si usas el perfil de SSD local efímero, ten en cuenta lo siguiente:
- El campo
swapSizePercentes un porcentaje de la capacidad efímera que estableces con el subcampocapacity, no la capacidad física total de la SSD local. Por ejemplo, con parámetros de configuración comocapacity=200GByswapSizePercent: 20, GKE asigna 40 GiB de intercambio. - El espacio de intercambio reduce el almacenamiento efímero disponible para tus Pods. GKE calcula el almacenamiento efímero reservado a partir de la capacidad efímera menos el tamaño de intercambio.
- El tamaño de intercambio no puede superar el 80% de la capacidad efímera menos el almacenamiento efímero que GKE reserva para el uso del sistema. Si la capacidad efímera es demasiado pequeña para que quepa el intercambio, la solicitud falla.
En el siguiente archivo system-config.yaml de ejemplo, se asigna el 20% de la capacidad efímera
al intercambio:
linuxConfig:
swapConfig:
enabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 20
Para crear un grupo de nodos con capacidad de SSD local mixta y un intercambio de memoria de nodo, ejecuta el siguiente 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
Reemplaza lo siguiente:
POOL_NAME: Es el nombre del grupo de nodos nuevo que deseas crear.CLUSTER_NAME: el nombre del clústerMACHINE_TYPE: Es el tipo de máquina que se usará. No puedes usar SSD locales con el tipo de máquinae2-mediumpredeterminado, ya que los tipos de máquinas de núcleo compartido no los admiten.NUMBER_OF_DISKS: es la cantidad de discos SSD locales que se aprovisionarán en cada nodo.CAPACITY: Es la capacidad total de SSD locales que se formatearán para el almacenamiento efímero. Este valor debe ser mayor que 0 y estrictamente menor que la capacidad física total del SSD local (recuento de discos × tamaño por disco), por ejemplo,200GB.
Inhabilita el intercambio de memoria de nodos
Para inhabilitar el intercambio de memoria de nodos, completa los siguientes pasos para actualizar el archivo system-config.yaml:
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.