Kubernetes oomkilled

Kubernetes oomkilled
Cuando Kubernetes funciona, es sorprendente, pero cuando no lo hace, como cuando su aplicación se bloquea debido a las preocupaciones de la memoria, debe saber cómo solucionar problemas con Oomkilled. Si ha trabajado con Kubernetes antes, es casi seguro que se ha encontrado con el error Oomquilled. Si no entiende cómo funciona, la depuración podría ser una experiencia frustrante. Miraremos el problema más oMBied con más detalle en esta publicación.

Requisito previo

Para usar los servicios de Kubernetes, necesitará un clúster de Minikube. Tendrás que configurar un clúster de minikube en tu sistema para que esta técnica funcione. Para configurar un clúster de minikube, use el terminal de la línea de comando. Se puede usar de dos maneras. Busque "terminal" en la sección de búsqueda de programas de su sistema. Ctrl+Alt+T es un atajo de teclado que se puede usar para esto:

Al menos 300 MIB de memoria deben estar disponibles en cada nodo en su clúster. Deberá que el servicio de métricos-servidor se ejecute en su clúster para algunas tareas en esta página. Puede omitir esos pasos si el servidor de métricas ya está funcionando. Ahora, escriba el siguiente comando adjunto.

Ahora use el comando adjunto.

La respuesta guía métricas.K8S.IO Si se puede acceder a la API de métricas de recursos, como se muestra en la captura de pantalla anterior.

Pasos para crear un espacio de nombres

Haga un espacio de nombres para los recursos que creará aquí para separarlos del resto de su clúster.

Se forma una nueva cápsula, como puede ver a continuación.

Proporcionar el campo de recursos: solicitudes en el manifiesto del recurso del contenedor para definir una solicitud de memoria. Incluir recursos: límites para establecer un límite de RAM. Diseñarás una vaina con un contenedor. El contenedor tiene una solicitud de memoria de 100 MIB y un límite de memoria de 200 MIB. El archivo de configuración del POD es el siguiente:

Cuando se inicia el contenedor, la sección Args del archivo de configuración proporciona sus parámetros. Las opciones "-vm-bytes" y "150m" instruyen al contenedor que asigne 150 MIB de RAM.

A continuación puede ver que hemos creado la cápsula:

Este comando verificará si el contenedor POD está en funcionamiento:

Según el resultado, el contenedor único del POD tiene una solicitud de memoria de 100 MIB y un límite de memoria de 200 MIB.

Para obtener las métricas de la cápsula, ejecute el comando Kubectl Top.

¿Cómo se puede exceder el límite de memoria de un contenedor??

Si el nodo parece tener suficiente memoria, un contenedor puede superar su solicitud de memoria. Por otro lado, un contenedor no puede usar más memoria de la. Si un contenedor toma más memoria de la asignado, se terminará. El contenedor se eliminará si continúa utilizando la memoria sobre su límite. El kubelet reinicia un contenedor terminado si se puede reanudar, al igual que cualquier otra forma de falla en el tiempo de ejecución.

Aquí crearemos una vaina. Esta cápsula intentará asignar más memoria de la.

El archivo de configuración para una cápsula con un contenedor y una solicitud de memoria de 50 MIB y un límite de memoria de 100 MIB es el siguiente:

Según la sección Args del archivo de configuración, el contenedor intentará asignar 250 MIB de RAM, significativamente por encima del límite de 100 MIB.

De nuevo, hemos creado la cápsula aquí.

Aquí puede ver la información integral del POD. El contenedor se ejecuta o no en este punto. Se requiere repetición del comando anterior hasta que se mate el contenedor:

Obtenga una mirada más profunda al estado del contenedor. Según la salida, el contenedor fue destruido porque se quedó sin memoria.

En este ejemplo, el kubelet reinicia el contenedor porque se puede reiniciar. Repita este comando numerosas veces para asegurarse de que el contenedor sea asesinado y reiniciado regularmente. Según la salida, el contenedor es asesinado, restaurado, matado nuevamente, iniciado nuevamente, etc.

El siguiente comando le permite ver información integral relacionada con el historial de la cápsula.

El resultado revela que el contenedor comienza y se detiene constantemente:

Aquí puede ver la información detallada sobre los nodos de su clúster:

Se incluye un registro del contenedor debido a un problema fuera de memoria en la salida:

Este comando elimina la cápsula, como puede ver a continuación.

¿Qué debe hacer si tiene una solicitud de memoria que es demasiado grande para sus nodos??

Las solicitudes de memoria y las limitaciones generalmente están vinculadas con contenedores, pero también es útil pensar en las vainas que tienen solicitudes de memoria y restricciones. La solicitud de memoria se define como el total de todas las necesidades de memoria para todos los contenedores en el POD.
Las vainas están programadas y mantenidas a través de solicitudes.

Aquí construiremos una cápsula con una solicitud de memoria más grande que cualquier nodo en la capacidad de su clúster.

Aquí está el archivo de configuración para una cápsula, incluido un contenedor y una necesidad de memoria de 1000 GIB, que probablemente sea más que cualquier nodo en su clúster puede administrar.

El siguiente comando de aplicación crea la cápsula, como puede ver.

Ahora utilice el comando 'Obtener pod'. El estado de la cápsula está pendiente (ver la salida). El POD no está configurado para ejecutarse en cualquier nodo y permanecerá pendiente indefinidamente.

Este comando lo ayudará a ver más detalles sobre el Pod, incluidos los próximos eventos:

La salida demuestra que el contenedor no se puede programar porque los nodos no tienen suficiente memoria:

¿Qué sucede si no especifica un límite de memoria??

Uno de los siguientes escenarios ocurre si no define un límite de memoria para un contenedor:

  • El contenedor no tiene límite en la cantidad de RAM puede utilizar. El asesino de OOM podría activarse si el contenedor consume toda la memoria disponible en el nodo donde se ha estado ejecutando. Además, el actainer sin restricciones de recursos tendrá un mayor riesgo de ser asesinado en caso de una matanza de OOM.
  • El contenedor se ejecuta en un espacio de nombres con un límite de memoria predeterminado, y el límite predeterminado se aplica al contenedor automáticamente. Los administradores de clúster pueden usar un LimitRange para establecer un número predeterminado para el límite de memoria.

Conclusión:

Echamos un vistazo más de cerca al error de Kubernetes oomkilled en este artículo. Ayuda a Kubernetes a la gestión de la memoria al programar las vainas y decidir qué vainas destruir cuando los recursos se vuelven escasos.