==== Limitar el consumo de los recursos =====
==== Limitar la Ram y la CPU de un pod ====
Para limitar la ram de un pod usaremos en el manifiesto del pod las opciones **request** y **limits**.
La opción **request** es para definir la cantidad de memoria que asignamos al pod y la opción limits define el máximo de memoria que podría llegar a usar ese pod.
apiVersion: v1
kind: Pod
metadata:
name: limite-memoria
spec:
containers:
- name: limite-memoria
image: polinux/stress
resources:
limits:
memory: "200Mi" # Definimos el límite de memoria que puede usar el pod a 200M
requests:
memory: "100Mi" #Definimos la cantidad de memoria que reservamos para este pod
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
Para limitar la cantidad de CPU a utilizar
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
spec:
containers:
- name: cpu-demo-ctr
image: vish/stress
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
args:
- -cpus
- "2"
==== LimitRange ====
Un LimitRange permite poner limitaciones :
* Limitar la cantidad mínima y máxima de recursos que puede usar un pod o un contenedor en un namespace
* Definir los valores por defecto de **request** y **limits** para un recurso en el namespace
Veamos un ejemplo para definir los limits y los request
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
name: dev
---
apiVersion: v1
kind: LimitRange
metadata:
name: mem-cpu-limit-range
namespace: dev
spec:
limits:
- default:
memory: 512Mi
cpu: 1
defaultRequest:
memory: 256Mi
cpu: 0.5
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: podtest3
namespace: dev
labels:
app: backend
env: dev
spec:
containers:
- name: cont1
image: nginx:alpine
Ejemplo para definir unos valores mínimos y máximos
apiVersion: v1
kind: Namespace
metadata:
name: prod
labels:
name: prod
---
apiVersion: v1
kind: LimitRange
metadata:
name: min-max
namespace: prod #Definimos el namespace donde vamos a aplicar este limite
spec:
limits:
- max:
memory: 1Gi
cpu: 1
min:
memory: 100M
cpu: 100m
type: Container
---
apiVersion: v1
kind: Pod
metadata:
name: podtest3
namespace: prod #Definimos el namespace para el pod
labels:
app: backend
env: dev
spec:
containers:
- name: cont1
image: nginx:alpine
resources:
limits:
memory: 50M
cpu: 50m
para ver los límites
kubectl get limitrange -n
Limitrange sólo se aplica en el namespace en el que este definido por lo que es muy importante que los pods se definan también dentro del namespace donde lo hemos declarado
==== ResourceQuota ====
Limita el consumo de recursos por namespace
apiVersion: v1
kind: Namespace
metadata:
name: uat
labels:
name: uat
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: res-quota
namespace: uat
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
En un RequestQuota es obligatorio definir los **requests** y los **limits**
Tambien es posible limitar el número de pods de un namespace
---
apiVersion: v1
kind: Namespace
metadata:
name: pre
labels:
name: pre
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: pod-demo
namespace: pre
spec:
hard:
pods: "3"
===== Referencias ====
* https://github.com/ricardoandre97/k8s-resources/blob/master/limits-requests/limit-ram.yaml
* https://github.com/ricardoandre97/k8s-resources/blob/master/limitRange/
* https://v1-17.docs.kubernetes.io/docs/concepts/policy/limit-range/