Hardening Kubernetes: Gestión de recursos y límites
Cuando creas contenedor en una infraestructura Kubernetes, sobre todo en Producción, es importante gestionar los recursos y límites que vamos a asignar a nuestras aplicaciones. A nivel de seguridad es importante, porque un solo contenedor, al compartir un host con otros contenedores, podría generar una denegación de servicio.
En la generación del Pod lo podemos controlar fácilmente mediante las secciones Requests y Limits en el fichero de ejecución YML o YAML. A continuación, vamos a explicar cada sección por separado:
Sección Requests en Kubernetes
La mejor forma de explicar algo es con un ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Pod metadata: name: pod-requests spec: containers: - name: elblogdenegu-nginx image: nginx resources: requests: cpu: "200m" memory: "20Mi" |
Lo que estamos haciendo es definir por cada contenedor, la CPU y Memoria RAM que van a necesitar como mínimo para poder ejecutarse.
- CPU: el valor XXXm define en unidades de CPU. En el ejemplo, le estamos dando una quinta parte de una CPU
- MEMORIA: el valor XXMi define la memoria en MegaBytes o MB.
Como podéis imaginar aquí sólo damos el mínimo necesario, pero para limitar necesitaremos usar Limits.
Sección Limits en Kubernetes
Volvemos a un ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Pod metadata: name: pod-requests spec: containers: - name: elblogdenegu-nginx image: nginx resources: limits: cpu: "1" memory: "40Mi" |
En el caso de Limits lo que estamos dando son los máximos de uso de cada contenedor dentro del host.
Como podéis presuponer, los valores de Limits y Requests se pueden y deben usar juntos. Si no ponéis valores mínimos y sólo colocáis límites a vuestros contenedores, el valor mínimo (Requests) se tomará el de los especificados en Limits.
¿Qué pasa si un contenedor llega al límite de los recursos?
Cuando un contenedor intenta usar una cantidad mayor de RAM o CPU de los límites marcados, para del estado Running a Terminated. Y se reiniciará para restablecerse.
Eso pasa gracias a OOMKilled (Out Of Memory Killed), que está implementado en el kernel del sistema y genera un error de memoria.
¿Qué pasa si un Host llega al límite de los recursos?
Si la suma de los límites de los contenedores sobrepasa la capacidad del nodo, lo que pasará es que, en algún momento, ciertos contenedores podrían ser reiniciados e incluso matados para liberar recursos en el sistema.
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?