Kubernetes - Resources Requirement & Limits
Alasta 17 Août 2024 kubernetes kubernetes limit quota
Description : Kubernetes, resources quotas & limit range
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
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