Límites de recursos en Kuberenetes
Si el nodo tiene suficiente cantidad de un recurso disponible, es posible que un contenedor utilice más recursos. Podemos especificar qué cantidad de cada recurso necesita un Contenedor. Los recursos habituales que se especifican son la CPU y la memoria Cuando especificamos la solicitud de recursos para los Contenedores de un Pod, el programador decide en qué nodo colocar el Pod. Cuando especificamos un límite de recursos para un Contenedor, el kubelet se encarga de los límites para que el contenedor en ejecución no pueda utilizar más del límite que establezcamos.
Por ejemplo, si establecemos una solicitud de memoria de 100 MiB para un contenedor, entonces el contenedor puede intentar utilizar más RAM. Pero si establecemos un límite de memoria de 4GiB para ese contenedor, el tiempo de ejecución impide que el contenedor utilice más del límite de recursos configurado.
La CPU y la memoria se denominan recursos informáticos.
Cada Contenedor de un Pod puede especificar uno o más de los siguientes
- límites de cpu
- límites de memoria
- límites en hugepages-<tamaño>
- solicitudes de cpu
- peticiones de memoria
- solicitudes de hugepages-<tamaño>
Para saber más sobre los recursos en Kubernetes, haz clic aquípara visitar la documentación oficial de Kubernetes.
En este artículo, veremos un ejemplo de límite de recursos y solicitud de CPU y Memoria. También utilizaremos el Servidor de Métricas. El Servidor de Métricas es un agregador de datos de uso de recursos en el clúster y no está desplegado por defecto en el clúster. Utilizaremos este Servidor de Métricas para ver el consumo de recursos por parte de los pods.
Requisitos previos
- Clúster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Clúster Kubernetes, haz clic aquí. Esta guía te ayudará a crear un cluster de Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 de AWS Ubuntu 18.04.
¿Qué vamos a hacer?
- Límites de recursos
Límites de recursos
Antes de proceder y crear pods con los requisitos de recursos especificados, vamos a instalar Metric Server.
Clona el repositorio de Github de Metric Server con el siguiente comando e instálalo.
git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git
cd kubernetes-metrics-server/
Crea Metric Server utilizando los archivos de objetos.
kubectl create -f .
Espera algún tiempo para que se inicie Metric Server. Después de algún tiempo, puedes ejecutar el siguiente comando para monitorizar los nodos del clúster.
kubectl top node
Ahora, crea un archivo de definición de pods con el siguiente contenido en él, que contiene la solicitud y el límite de memoria.
vim my-pod-with-memory.yml
apiVersion: v1 kind: Pod metadata: name: my-pod-memory-demo spec: containers: - name: my-container-memory-demo image: polinux/stress resources: limits: memory: "50Mi" requests: memory: "20Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "30M", "--vm-hang", "1"]
Puedes encontrar la propiedad «resources» en la que hemos especificado el límite de memoria como 50Mi y la solicitud de memoria como 20Mi
Comprueba los pods existentes en el clúster.
kubectl get pods #Get pods from the default namespace
Crea un pod utilizando la definición del pod creada en el paso anterior.
kubectl create -f my-pod-with-memory.yml #Create a pod
kubectl get pods
Ahora, si obtienes los detalles del Pod puedes ver que éste solicita 20Mi de memoria y tiene un límite de 50Mi de memoria.
kubectl get pods
kubectl describe pod my-pod-memory-demo #Describe the pod
El uso del Pod se puede comprobar con el siguiente comando.
kubectl top pods #Check resource consumption by the pod
Ahora, crea una definición de pod con solicitud y límite de CPU.
vim my-pod-with-cpu.yml
apiVersion: v1 kind: Pod metadata: name: my-pod-cpu-demo spec: containers: - name: my-container-cpu-demo image: vish/stress resources: limits: cpu: "1" requests: cpu: "0.5" args: - -cpus - "2"
En el archivo anterior, puedes ver que la definición tiene una propiedad «recurso» con solicitud de CPU como 0,5 y límite como 1. Observa también que estamos pasando 2 CPUs como nuestro requerimiento que es más que el límite.
Ahora, vamos a crear un pod con solicitud de CPU y límite utilizando el siguiente comando.
kubectl apply -f my-pod-with-cpu.yml #Create a pod
kubectl get pods
Obtén los detalles del pod que hemos creado.
kubectl get pods
kubectl describe pod my-pod-cpu-demo
Puedes ver que el Pod ha solicitado 0,5 o 500m de CPU con un límite de 1 CPU
Para comprobar el uso de la CPU, utiliza el siguiente comando.
kubectl top pod #Check resource consumption by the pod
En la captura de pantalla anterior puedes ver que incluso después de pasar 2 CPUs en la definición del pod como argumento, no puede consumir más que el límite, es decir, 1 CPU. Aquí el pod «mi-pod-cpu-demo» pudo consumir 999m de CPU que equivale a 1 CPU y no pudo aumentar su consumo.
Conclusión
En este artículo hemos visto los pasos para habilitar la monitorización en el clúster mediante el Servidor de Métricas. Hemos visto cómo un pod puede solicitar CPU y memoria y consumir recursos sin sobrepasar el límite especificado.