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

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

    Reemplaza 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_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 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.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 de tu clúster.

Verifica la configuración

Para verificar que el intercambio de memoria del nodo esté habilitado, completa los siguientes pasos:

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

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

  1. Ejecuta el siguiente comando para verificar la condición SwapDetected en 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"
    }
    
  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}
    

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:

  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 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?