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.

<sxh yaml> 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"]

</sxh>

Para limitar la cantidad de CPU a utilizar <sxh yaml> 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"

</sxh>

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 <sxh yaml> 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

</sxh> Ejemplo para definir unos valores mínimos y máximos <sxh yaml> 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

</sxh>

para ver los límites <sxh>kubectl get limitrange -n <nombredelnamespace></sxh>

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

<sxh yaml> 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
  </sxh>
En un RequestQuota es obligatorio definir los requests y los limits

Tambien es posible limitar el número de pods de un namespace <sxh yaml > — apiVersion: v1 kind: Namespace metadata:

name: pre
labels:
  name: pre

— apiVersion: v1 kind: ResourceQuota metadata:

name: pod-demo
namespace: pre

spec:

hard:
  pods: "3"

</sxh>

Referencias