Solución de problemas de saturación de memoria en clústeres de AKS

En este artículo se describen los métodos para solucionar problemas de saturación de memoria. La saturación de memoria se produce si al menos una aplicación o proceso necesita más memoria de la que puede proporcionar un host de contenedor, o si el host agota su memoria disponible.

Requisitos previos

Síntomas

En la tabla siguiente se describen los síntomas comunes de saturación de memoria.

Síntoma Descripción
Pods noschedulables No se pueden programar pods adicionales si el nodo está cerca de su límite de memoria establecido.
Expulsión de pods Si un nodo se está quedando sin memoria, kubelet puede expulsar pods. Aunque el plano de control intenta reprogramar los pods desalojados en otros nodos que tienen recursos, no hay ninguna garantía de que otros nodos tengan suficiente memoria para ejecutar estos pods.
Nodo no listo La saturación de memoria puede provocar kubelet y containerd dejar de responder, lo que puede provocar problemas de preparación del nodo.
Eliminación de memoria insuficiente (OOM) Se produce un problema de OOM si la expulsión del pod no puede evitar un problema de nodo.

Lista de comprobación para la solución de problemas

Para reducir la saturación de memoria, use herramientas de supervisión eficaces y aplique los procedimientos recomendados.

Paso 1: Identificar los nodos que tienen saturación de memoria

Use cualquiera de los métodos siguientes para identificar los nodos que tienen saturación de memoria:

  • En un explorador web, use la característica Container Insights de AKS en el Azure Portal.

  • En una consola, use la herramienta de línea de comandos de Kubernetes (kubectl).

Container Insights es una característica de AKS que supervisa el rendimiento de la carga de trabajo de contenedor. Para obtener más información, consulte Habilitar Container Insights para Azure Kubernetes Service clúster (AKS).

  1. En el Azure Portal, busque y seleccione Servicios de Kubernetes.

  2. En la lista de servicios de Kubernetes, seleccione el nombre del clúster.

  3. En el panel de navegación del clúster, busque el encabezado Supervisión y, a continuación, seleccione Conclusiones.

  4. Establezca el valor de Intervalo de tiempo adecuado.

  5. Seleccione la pestaña Nodos .

  6. En la lista Métrica, seleccione Conjunto de trabajo de memoria (calculado a partir de Asignable).

  7. En el selector percentiles, establezca el ejemplo en Max y, a continuación, seleccione la etiqueta de columna % máximo dos veces. Esta acción ordena los nodos de tabla según el porcentaje máximo de memoria utilizada, de mayor a menor.

    Azure Portal captura de pantalla de la vista Nodos en Container Insights dentro de un clúster de Azure Kubernetes Service (AKS).

  8. Dado que el primer nodo tiene el uso de memoria más alto, seleccione ese nodo para investigar el uso de memoria de los pods que se ejecutan en el nodo.

    Azure Portal captura de pantalla de los contenedores de un nodo en la vista Nodos de Container Insights dentro de un clúster de Azure Kubernetes Service (AKS).

    Nota:

    El porcentaje de uso de CPU o memoria para pods se basa en la solicitud de CPU especificada para el contenedor. No representa el porcentaje del uso de CPU o memoria para el nodo. Por lo tanto, examine el uso real de CPU o memoria en lugar del porcentaje de uso de CPU o memoria para pods.

Ahora que ha identificado los pods que usan memoria alta, puede identificar las aplicaciones que se ejecutan en el pod.

Paso 2: Revisar los procedimientos recomendados para evitar la saturación de memoria

Revise la tabla siguiente para obtener información sobre cómo implementar los procedimientos recomendados para evitar la saturación de memoria.

Procedimiento recomendado Descripción
Uso de solicitudes y límites de memoria Kubernetes proporciona opciones para especificar el tamaño mínimo de memoria (solicitud) y el tamaño máximo de memoria (límite) de un contenedor. Al configurar límites en pods, puede evitar la presión de memoria en el nodo. Asegúrese de que los límites agregados de todos los pods que se ejecutan no superen la memoria disponible del nodo. Esta situación se denomina sobreasignación. El programador de Kubernetes asigna recursos en función de las solicitudes y límites establecidos a través de calidad de servicio (QoS). Sin los límites adecuados, el programador podría programar demasiados pods en un solo nodo. Esto podría acabar por reducir el nodo. Además, aunque kubelet expulsa pods, prioriza los pods en los que el uso de memoria supera sus solicitudes definidas. Se recomienda establecer la solicitud de memoria cerca del uso real.
Habilitación del escalador automático de pod horizontal Al escalar el clúster, puede equilibrar las solicitudes en muchos pods para evitar la saturación de memoria. Esta técnica puede reducir la superficie de memoria en el nodo específico.
Uso de etiquetas de antiafinidad En escenarios en los que la memoria no está enlazada por diseño, puede usar selectores de nodos y etiquetas de afinidad o antiafinidad, que pueden aislar la carga de trabajo en nodos específicos. Mediante el uso de etiquetas de antiafinidad, puede evitar que otras cargas de trabajo programe pods en estos nodos. Esto reduce el problema de saturación de memoria.
Elección de máquinas virtuales de SKU más altas Las máquinas virtuales (VM) que tienen más memoria de acceso aleatorio (RAM) son más adecuadas para controlar el uso elevado de memoria. Para usar esta opción, debe crear un nuevo grupo de nodos, acordonar los nodos (que no se puedan especificar) y purgar el grupo de nodos existente.
Aislar cargas de trabajo del sistema y del usuario Se recomienda ejecutar las aplicaciones en un grupo de nodos de usuario. Esta configuración garantiza que puede aislar los pods específicos de Kubernetes en el grupo de nodos del sistema y mantener el rendimiento del clúster.

Más información

Aviso de declinación de responsabilidades sobre la información de terceros

Los productos de otros fabricantes que se mencionan en este artículo han sido creados por compañías independientes de Microsoft. Microsoft no ofrece ninguna garantía, ya sea implícita o de otro tipo, sobre la confiabilidad o el rendimiento de dichos productos.

Aviso de declinación de responsabilidades sobre la información de contacto de terceros

Microsoft proporciona información de contacto de otros proveedores para ayudarle a encontrar información adicional sobre este tema. Dicha información de contacto puede cambiar sin notificación previa. Microsoft no garantiza la precisión de esta información de contacto de terceros.

Ponte en contacto con nosotros para obtener ayuda

Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.