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 dans un namespace, sur un pod mais seulement à 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.
Un LimitRange permet de limiter les resources pour:

  • Un pod
  • Un container
  • Un PersistentVolumeClaim
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

Version full:

apiVersion: v1
kind: LimitRange
metadata:
  name: memory-resource-constraint
spec:
  limits:
  - type: Pod
    max:
      cpu: "2"
      memory: "4Gi"
    min:
      cpu: "200m"
      memory: "256Mi"
    maxLimitRequestRatio:
      cpu: "4"
      memory: "8"
  - type: Container
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "250m"
      memory: "256Mi"
    max:
      cpu: "1"
      memory: "1Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    maxLimitRequestRatio:
      cpu: "2"
      memory: "4"
  - type: PersistentVolumeClaim
    max:
      storage: "10Gi"
    min:
      storage: "1Gi"
    default:
      storage: "5Gi"
    defaultRequest:
      storage: "2Gi"
    maxLimitRequestRatio:
      storage: "2"

Légende :

  • min : définit le minimum
  • max : définit le maximum
  • default : définit la limit par défaut
  • defaultRequest : définit la request par défaut
  • maxLimitRequestRatio : le ratio max entre la limit et request

Kubernetes Request & Limit

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

Affichage des limits

Informations au travers de la description d’un namespace.

k describe ns limits
Name:         limits
Labels:       kubernetes.io/metadata.name=limits
              name=limits
Annotations:  <none>
Status:       Active

Resource Quotas
  Name:            my-resource-quota
  Resource         Used  Hard
  --------         ---   ---
  limits.cpu       0     2
  limits.memory    0     2Gi
  requests.cpu     0     2
  requests.memory  0     2Gi

Resource Limits
 Type                   Resource  Min    Max   Default Request  Default Limit  Max Limit/Request Ratio
 ----                   --------  ---    ---   ---------------  -------------  -----------------------
 Pod                    cpu       200m   2     -                -              4
 Pod                    memory    256Mi  4Gi   -                -              8
 Container              memory    128Mi  1Gi   256Mi            512Mi          4
 Container              cpu       100m   1     250m             500m           2
 PersistentVolumeClaim  storage   1Gi    10Gi  2Gi              5Gi            2

En image …

Kubernetes Request & Limit