En el post anterior vimos una configuración muy básica de los pods, pero como os imaginaréis tenemos más posibilidades interesantes que estaria bien que tuvieramos en cuenta. Una de ellas es la configuración/limitación de recursos.
Cuando usamos pods pero no indicamos ningún límite de recursos de hardware, nos encontrariamos con estos 2 escenarios:
- Tener unos límites definidos por defecto dentro del cluster de kubernetes
- Usar los recursos sin límite (no recomendado para nada, si sabemos de sobra que no usaremos en ningun caso todo el hardware disponible nos podemos arriesgar, pero si tenemos intención de aumentar contenedores en el futuro esto puede convertirse en un problema importante)
Lo ideal es siempre definir unos recursos específicos para cada elemento, así kubernetes puede distribuir los contenedores y los recursos de manera mucho más eficiente.
Para ello podemos/tenemos que añadir dos nuevas propiedades en nuestros pods, veamos un ejemplo.
Como usaremos el mismo pod que hemos estado usando actualmente lo primero que haremos será borrar los pods que tenemos actualmente, para ello es suficiente con ejecutar el siguiente comando por cada pod que queramos eliminar:
// para obtener los pods actuales
kubectl get pods
// para eliminar un post específico
kubectl delete pods nombreDelContainer
Como vemos en la imagen la consola nos confirma su eliminación.
Ahora añadamos las opciones para limitar o específicar los recursos:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: mario-test
name: mario-test
spec:
containers:
- image: pengbai/docker-supermario:latest
name: mario-test
ports:
- containerPort: 8080
resources:
requests:
cpu: 50m
memory: 64M
limits:
cpu: 50m
memory: 64M
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
Si nos fijamos en nuestro fichero pod hemos añadido nuevas propiedades dentro de resources, hemos añadido:
- requests: Con esta opción le indicamos a kubernetes el mínimo de recursos que debe tener nuestro contenedor. Esto es muy útil para que kubernetes lo situe donde más le convenga.
- limits: Como su nombre indica este es el límite que le estamos indicando a kubernetes que puede usar nuestro contenedor. IMPORTANTE: si el contenedor se pasa de recursos es posible que kubernetes decida parar el contenedor
Para ver en detalle las opciones de CPU y MEMORIA recomienda leerse la documentación al respecto Assign cpu resource y Manage resources containers
En nuestro ejemplo le estamos limitando al uso de *50 milliCPU * y 64Mb, si por ejemplo le indicaramos algo que no tuviera disponible nuestro cluster, kubernetes lo que haría sería esperar a tener esos recursos disponibles para arrancar el contenedor en cuestión.
Ahora arranquemos nuestro pod:
kubectl create -f mario.yml
Y si hacemos un describe de nuestro pod
kubectl describe pods mario-test
Podemos ver como todo ha funcionado correctamente y nuestro pod tiene configurado sus recursos.
Ahora cambiemos la configuración para que veamos que pasa cuando le ponemos una cantidad de recursos que no puede asumir. Por ejemplo en mi caso le ponemos que use 64Gb (que mi maquina actual no los tiene)
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: mario-test
name: mario-test
spec:
containers:
- image: pengbai/docker-supermario:latest
name: mario-test
ports:
- containerPort: 8080
resources:
requests:
cpu: 50m
memory: 64G
limits:
cpu: 50m
memory: 64G
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
Si ahora borramos el pod que tenemos y creamos este nuevo veamos lo que pasa:
Nuestro pod se queda con un estado pending permanente, y si vemos la descripción del pod nos indicara el estado y la información de porque no se esta ejecutando, en este caso por falta de memoria
Como vemos con estas simples propiedades dentro de los pods podemos limitar o indicar los recursos que nuestro contenedor o pod usará (con requests) y la cantidad de hardware que queremos que use como máximo (con limits).
Y hasta aquí lo referente a lo básico de sobre los recursos de nuestros pods, recomiendo leer la documentación para poder hacer un selección más específica de los recursos que queremos que usen nuestros contenedores, sin mucho más nos vemos en el siguiente, un abrazooooooooo




