Kubernetes - Resources Request / Limit

Les Requests et Limits permettent de gérer les ressources CPU/Mémoire d’un container.
La partie Request est ce qui est demandé au minimum au système, garantie par K8s.
La partie Limit est le max de ressources du container

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Ici on voit un pod avec 2 containers avec chacun ses limites de ressources.

Comportement CPU/mémoire :

Si le CPU veut dépasser le max, il y a du throttling. Si la mémoire veut dépasser, le container passera en terminate via OOM killer.

No request/no limit: le container peut consommer toute la CPU du node*.
No request/set limit: la request = la limit.
Set request/set limit: application des valeurs.
Set request/no limit: la CPU peut consommer toutes les resources du node*.

On peut avoir des infos dans le describe du pod:

  State:        Waiting
  Reason:       CrashLoopBackOff
  Last State:   Terminated
  Reason:       OOMKilled

Limit range:

La limite de range s’applique à un namespace et qu’à l’admission d’un pod (nouveau), pas à de l’existant.
Si plusieurs LimitRange sont appliquées sur un même objet dans un namespace, il n’y a pas d’état deterministe.

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
  - default: # this section defines default limits
      cpu: 500m
    defaultRequest: # this section defines default requests
      cpu: 500m
    max: # max and min define the limit range
      cpu: "1"
    min: # request 
      cpu: 100m
    type: Container

Pour le min/max, un pod ne pourra pas avoir plus petite/grande que ces valeurs.

apiVersion: v1
kind: LimitRange
metadata:
  name: memory-resource-constraint
spec:
  limits:
  - default: # this section defines default limits
      memory: 1Gi
    defaultRequest: # this section defines default requests
      memory: 1Gi
    max: # max and min define the limit range
      memory: 1Gi
    min: # request 
      memory: 500m
    type: Container

Resource Quota

Niveau Namespace, limite la somme des ressources des pods.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-resource-quota
spec:
  hard:
    requests.cpu: 4
    requests.memory: 4Gi
    limits.cpu: 10
    limits.memory: 10Gi