Cómo establecer límites de recursos de pod de Kubernetes – CloudSavvy IT

Gráfico que muestra el logotipo de Kubernetes

Establecer límites de recursos en sus pods de Kubernetes evita que un contenedor errante afecte a otras cargas de trabajo. Kubernetes le permite limitar los recursos, incluido el consumo de CPU y memoria. Los pods pueden terminarse cuando se superan sus límites, lo que mantiene la estabilidad general del clúster.

Unidades de recursos

Antes definiendo límites, vale la pena señalar cómo Kubernetes expresa la disponibilidad de recursos.

El consumo de CPU se mide en términos de CPU virtuales utilizadas. Un límite de 0.5 vCPU indica que el pod puede consumir la mitad del tiempo disponible de una de las vCPU disponibles. Una vCPU es lo que verá publicitado en las páginas de alojamiento de los proveedores de la nube. Cuando usa hardware bare-metal, es un hyperthread en su procesador.

La memoria se mide en bytes. Puede especificarlo como un número entero de bytes o como una cantidad más amigable, como 512Mi o 1Gi.

Crear un límite de CPU

Para agregar un límite de CPU a los contenedores de pod, incluya el resources:limits campo en el manifiesto de su contenedor:

apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: demo
spec:
  containers:
    - name: my-container
      image: example/example
      resources:
        limits:
          cpu: "0.5"

El ejemplo anterior limitará sus contenedores a 0,5 vCPU. Se regularán para que no puedan consumir más de la mitad del tiempo de CPU disponible en un período de 100 ms.

Crear un límite de memoria

Los límites de memoria se crean de manera similar. Cambiar el limits:cpu campo en el manifiesto para limits:memory:

El contenedor estará limitado a 512Mi de RAM. Kubernetes aún le permitirá acceder a más si el nodo en el que está programado tiene un exceso de capacidad. De lo contrario, exceder el límite resultará en que el contenedor sea marcado como candidato a rescisión.

Límites de almacenamiento

Todos los nodos de Kubernetes tienen una cantidad de almacenamiento efímero disponible. Los pods utilizan este almacenamiento para almacenar cachés y registros. El grupo de almacenamiento efímero también es donde el clúster de Kubernetes guarda las imágenes del contenedor.

Puede establecer límites para el uso de almacenamiento efímero de un pod. Esta es una función beta destinada a garantizar que la caché de un solo pod no pueda consumir todo el grupo de almacenamiento. Utilizar el limits:ephemeral-storage campo de manifiesto de contenedor:

limits:
  ephemeral-storage: "1Gi"

Este contenedor ahora estaría limitado a usar 1Gi del almacenamiento efímero disponible. Los pods que intenten utilizar más espacio de almacenamiento serán desalojados. Cuando hay varios contenedores en un pod, el pod se desaloja si la suma del uso de almacenamiento de todos los contenedores excede el límite de almacenamiento general.

Kubernetes generalmente rastrea el uso del almacenamiento escaneando periódicamente el sistema de archivos de almacenamiento efímero del nodo. Luego sumará el uso de almacenamiento de cada cápsula y contenedor. Existe un soporte opcional para las cuotas de almacenamiento del sistema de archivos a nivel del sistema operativo, que permiten un monitoreo más preciso.

Necesitará un sistema de archivos compatible con cuotas de proyecto, como XFS o ext4. Asegúrese de que el sistema de archivos esté montado con el seguimiento de la cuota del proyecto habilitado, luego habilite el LocalStorageCapacityIsolationFSQuotaMonitoring característica bandera en kubelet. Orientación sobre configurar este sistema se proporciona en la documentación de Kubernetes.

Solicitudes de recursos

Además de los límites de recursos, puede establecer recursos peticiones. Están disponibles para CPU, memoria y almacenamiento efímero; cambie el limits campo a requests en cada uno de los ejemplos que se muestran arriba.

Establecer una solicitud de recurso indica la cantidad de ese recurso que espera que utilice el contenedor. Kubernetes tiene en cuenta esta información al determinar en qué nodo programar el pod.

Usando la memoria como ejemplo, un request de 512Mi resultará en que el pod se programe en un nodo con al menos 512Mi de memoria disponible. La disponibilidad se calcula sumando las solicitudes de memoria de todos los pods existentes en el nodo y restando eso de la capacidad total de memoria del nodo.

Un nodo no será elegible para alojar un nuevo contenedor si la suma de las solicitudes de carga de trabajo, incluida la solicitud del nuevo contenedor, excede la capacidad disponible. Este sigue siendo el caso incluso si el uso de la memoria en tiempo real es realmente muy bajo. La capacidad disponible ya se ha asignado a los contenedores existentes para garantizar que se puedan satisfacer sus solicitudes.

A diferencia de un límite, Kubernetes siempre permite que los contenedores excedan su solicitud de recursos. Pueden consumir cualquier cantidad de recursos no utilizados que otros contenedores hayan solicitado pero que no estén usando actualmente.

Uso de solicitudes y límites

Los diferentes comportamientos de las solicitudes y los límites significan que debe considerar cuidadosamente los valores que utiliza. Por lo general, es mejor mantener bajas las solicitudes. Luego, establece los límites lo más altos posible sin afectar la capacidad de coexistencia de sus cargas de trabajo.

El uso de un valor de solicitud de recursos bajo le da a sus pods la mejor oportunidad de ser programados en un nodo. El programador tiene más flexibilidad al tomar decisiones de asignación, ya que es más probable que cualquier nodo pueda albergar el contenedor. El contenedor tendrá acceso inmediato a los recursos en exceso que necesite, más allá de la solicitud, hasta el límite especificado.

Cada solicitud y límite debe equilibrarse para lograr el mayor efecto. Debe observar las solicitudes y los límites de los otros pods que se ejecutan en su clúster. Asegúrese de conocer las cantidades totales de recursos proporcionadas por sus nodos para no establecer límites que sean demasiado altos (riesgo de estabilidad) o demasiado bajos (un desperdicio de capacidad).

Conclusión

Siempre debe configurar límites de recursos para sus cargas de trabajo de Kubernetes. El uso eficaz de los límites ayuda a que las cargas de trabajo coexistan pacíficamente sin poner en riesgo la salud de su clúster.

Esto es particularmente importante en el caso de la memoria. Sin límites, un contenedor con un proceso errante puede consumir rápidamente toda la memoria que ofrece su nodo. Tal escenario de falta de memoria podría eliminar otros pods programados para ese nodo, ya que el administrador de memoria a nivel del sistema operativo comenzaría a eliminar procesos para reducir el uso de memoria.

Establecer un límite de memoria permite a Kubernetes terminar el contenedor antes de que comience a afectar otras cargas de trabajo en el clúster, y mucho menos los procesos externos. Pierde su carga de trabajo, pero el clúster en general gana mayor estabilidad.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad