Guía para dominar el Almacenamiento efímero en Kubernetes
En este artículo, explicaremos en detalle el almacenamiento efímero en Kubernetes y responderemos preguntas como: ¿Quien lo usa y para que? ¿Que pasa si se termina el espacio disponible? ¿Como puedo optimizar su uso?. La gestión del almacenamiento es fundamental para garantizar la disponibilidad una faceta crucial es comprender y aprovechar al máximo el almacenamiento efímero local disponible.
El almacenamiento efímero, como su nombre sugiere, ofrece un recurso temporal de almacenamiento Sin embargo, su naturaleza transitoria y la falta de garantías de durabilidad plantean desafíos únicos para los administradores de clústeres.
¿Cómo funciona el almacenamiento efímero?
Los nodos de kubernetes tienen almacenamiento efímero local, respaldado por dispositivos conectados localmente que se pueden escribir. “Efímero” significa que no hay garantía a largo plazo sobre la durabilidad.
Los archivos localizados dentro de un contenedor son efímeros por naturaleza. Los Pods utilizan el almacenamiento efímero local para espacio temporal de trabajo, por ejemplo abrir un archivo y escribir en él, o también para crear un archivo en sí mismo. También se usa para almacenamiento en caché y para almacenar los logs del contenedor.
Además, Kubernetes también utiliza este tipo de almacenamiento para almacenar los registros de contenedores a nivel de nodo, las imágenes de contenedores que se están ejecutando en el nodo y las capas que se pueden escribir de los contenedores en ejecución.
Si un nodo falla, los datos de su almacenamiento efímero pueden perderse. Las aplicaciones no pueden esperar ningún SLA de disponibilidad ni de rendimiento (IOPS de disco, por ejemplo) del almacenamiento efímero local.
¿Cómo gestiona kubernetes el almacenamiento efímero?
kubelet puede medir cuánto almacenamiento local está utilizando, propiamente mide el uso de almacenamiento en:
- Volúmenes emptyDir, excepto los volúmenes emptyDir tmpfs
- Directorios que contienen logs a nivel de nodo
- Capas de contenedores escribibles
Si un Pod está utilizando más almacenamiento efímero del permitido, kubelet establece una señal de evacuación (eviction) que desencadena la evacuación del Pod. Esto sucede cuando la capa escribible de un contenedor y el uso de logs exceden su límite de almacenamiento,
Kubelet realiza comprobaciones regulares que escanean cada volumen emptyDir, directorio de logs de contenedores y capa de contenedor escribible. El escaneo mide cuánto espacio se está utilizando y si se rebasa ejecuta la acción de evacuación.
Sin importar cuanto almacenamiento efímero tengan los nodos, existen configuraciones globales que nos pueden ayudar a gestionarlo. Revisaremos esto más adelante.
Logs propios de kubernetes
Existen dos tipos de componentes del sistema: aquellos que típicamente se ejecutan en un contenedor y aquellos componentes directamente involucrados en la ejecución de contenedores. Por ejemplo:
- El kubelet y el runtime de contenedores no se ejecutan en contenedores. El kubelet ejecuta tus contenedores (agrupados en pods).
- El scheduler de Kubernetes, el controlador de manager y el servidor de API se ejecutan dentro de pods (usualmente pods estáticos).
Ubicaciones de los Logs
En los nodos Linux que utilizan systemd, el kubelet y el runtime de contenedores escriben en journald por defecto. Utiliza journalctl para leer el journal de systemd; por ejemplo: journalctl -u kubelet
. Si systemd no está presente, el kubelet y el runtime de contenedores escriben en archivos .log
en el directorio /var/log
.
Mejores prácticas para gestionar el almacenamiento efímero.
En resumen:
- Establece límites para el uso de almacenamiento efímero local
- Permite definir cuánto espacio en disco del almacenamiento efímero puede ser utilizado por un pod
- Optimiza los parámetros del Image Garbage Collector
- Permite ajustar los umbrales que activan y controlan la recolección de basura de imágenes, ayudando así a gestionar el espacio de almacenamiento utilizado por las imágenes de contenedor.
- Ajusta la configuración de la rotación de logs
- Permiten especificar cómo se deben rotar los logs, incluyendo parámetros como el tamaño máximo de los archivos de log, el número máximo de archivos a mantener, la frecuencia de rotación
Ahora veamos a detalle cómo se configura cada una de las anteriores .
Establece límites para el uso de almacenamiento efímero local
Puedes especificar cualquiera de los siguientes o ambos en la definición de un pod:
spec.containers[].resources.limits.ephemeral-storage
spec.containers[].resources.requests.ephemeral-storage
Los límites y solicitudes de almacenamiento efímero se miden en cantidades de bytes. Puedes expresar el almacenamiento como un número entero o como un número en punto fijo usando uno de estos sufijos: E, P, T, G, M, k.
- Por ejemplo, puedes establecer que los pods no usen más de 150M
Presta atención al caso de los sufijos. Si solicitas 400m de almacenamiento efímero, esto es una solicitud de 0,4 bytes. Es probable que alguien que escriba eso quisiera solicitar 400 mebibytes (400Mi) o 400 megabytes (400M).
En el siguiente ejemplo, el Pod tiene dos contenedores. Cada contenedor tiene una solicitud de 2GiB de almacenamiento efímero local. Cada contenedor tiene un límite de 4GiB de almacenamiento efímero local. Por lo tanto, el Pod tiene una solicitud de 4GiB de almacenamiento efímero local y un límite de 8GiB de almacenamiento efímero local.
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
volumes:
- name: ephemeral
emptyDir:
sizeLimit: 500Mi
Optimiza los parámetros del Image Garbage Collector
El Image Garbage Collector es un componente de Kubernetes que se encarga de administrar y limpiar los recursos de imágenes de contenedores que ya no son necesarios en el clúster. Libera espacio en el almacenamiento al eliminar las imágenes de contenedor que ya no están en uso.
Cuando se ejecutan contenedores en un clúster de Kubernetes, se utilizan imágenes de contenedor para crear y ejecutar esos contenedores. Con el tiempo, pueden acumularse muchas imágenes de contenedor en el clúster, especialmente si se despliegan varias versiones de aplicaciones o se realizan actualizaciones frecuentes. Estas imágenes pueden consumen espacio en el almacenamiento de los nodos, lo que reduce el espacio efímero disponible.
El Image Garbage Collector monitorea las imágenes de contenedor en el clúster y elimina aquellas que ya no están en uso por ningún contenedor en ejecución. Utiliza criterios como la existencia de contenedores en ejecución que utilicen una imagen particular, junto con políticas de retención configurables, para determinar qué imágenes pueden ser eliminadas de manera segura.
image-gc-high-threshold
: Es el umbral de uso de disco que activa la recolección de basura de imágenes. Cuando el uso del disco alcanza este porcentaje, Kubernetes inicia el proceso de recolección de basura para liberar espacio. El valor por defecto es del 85%.
image-gc-low-threshold
: Es el umbral de uso de disco al que la recolección de basura de imágenes intenta reducir. Una vez que la recolección de basura de imágenes se activa debido al umbral alto, intenta liberar espacio hasta que el uso del disco disminuya al porcentaje especificado en este valor. El valor por defecto es del 80%.
Estas configuraciones son útiles para controlar la cantidad de espacio en disco utilizado por imágenes de contenedores en el clúster Kubernetes, lo que ayuda a mantener un uso eficiente de los recursos y a evitar problemas de almacenamiento.
Sugerímos establecer los siguientes valores:
image-gc-high-threshold:75%
Image-gc-low-threshold: 65%
Ajusta la configuración de la rotación de logs
Para configurar la rotación eficiente de logs en Kubernetes, puedes ajustar la configuración del kubelet. Aquí están las configuraciones relevantes que puedes utilizar:
containerLogMaxSize
: Esta configuración permite especificar el tamaño máximo de cada archivo de registro de contenedor. El valor predeterminado es de 10Mi (10 megabytes).containerLogMaxFiles
: Esta configuración te permite especificar el número máximo de archivos de log permitidos para cada contenedor. El valor predeterminado es de 5containerLogMonitorInterval
: Esta configuración define el intervalo en el que el kubelet monitorea y rota los logs según sea necesario. Puedes ajustar este intervalo para controlar la frecuencia con la que se realiza la rotación de logs. El valor predeterminado es de 10s
Al ajustar estas configuraciones en el archivo de configuración del kubelet, puedes optimizar la rotación de logs en tu clúster Kubernetes para adaptarse mejor a las necesidades de tu aplicación y a las limitaciones de recursos del sistema.
Sugerímos establecer los siguientes valores:
containerLogMaxSize: 5M
containerLogMaxFiles: 3
containerLogMonitorInterval: 5s
Referencias: