Configura nodos para usar espacio en disco como memoria virtual

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.1341000 o posterior.
  • Solo los Pods que tienen la clase de Calidad de servicio (QoS) Burstable pueden 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.
  • El tipo de máquina e2-medium predeterminado 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 update para 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.yaml
    

    Reemplaza 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.yaml
    

    Reemplaza 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_TYPE
    

    Reemplaza 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.yaml
    

    Reemplaza 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:

  1. Ejecuta el siguiente comando para verificar que se aplique el system-config.yaml con la configuración de swapConfig:

    gcloud container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. 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_bytes
  • kubernetes.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:

  1. Verifica la condición SwapDetected en 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"
    }
    
  2. 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 swapSizePercent es un porcentaje de la capacidad efímera que estableces con el subcampo capacity, no la capacidad física total de la SSD local. Por ejemplo, con parámetros de configuración como capacity=200GB y swapSizePercent: 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úster
  • MACHINE_TYPE: Es el tipo de máquina que se usará. No puedes usar SSD locales con el tipo de máquina e2-medium predeterminado, 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:

  1. Actualiza el archivo system-config.yaml para establecer swapConfig.enabled en false:

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. Actualiza 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?