Dans cet exercice, nous allons créer un namespace et définir des limites d’utilisation de ressources pour chaque Pod qui sera déployé dans celui-ci.

Création d’un namespace

Créez le namespace test à l’aide de la commande suivante:

kubectl create namespace test

Limites d’utilisation des ressources

La spécification suivante définit une ressource de type LimitRange qui fixe une limite d’utilisation de la mémoire pour chaque container qui sera créé dans le namespace test. Copiez cette spécification dans le fichier limit.yaml:

limit.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: memory-limit-range
spec:
  limits:
  - default:
      memory: 128M
    defaultRequest:
      memory: 64M
    max:
      memory: 256M
    type: Container

Créez la ressource correspondante dans le namespace test:

kubectl apply -f limit.yaml --namespace=test

Lancement d’un Pod sans spécification de ressource

La spécification suivante définit un Pod avec un unique container, celui-ci ne définit pas de requests ni de limits pour l’utilisation des ressources. Copiez cette spécification dans le fichier www-1.yaml:

www-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: www-1
spec:
  containers:
  - name: www
    image: nginx:1.18-alpine

Créez ce Pod dans le namespace test:

kubectl apply -f www-1.yaml -n test

Regardez ensuite la configuration du Pod:

kubectl describe po www-1 -n test

Vous devriez observer que les propriétés Requests et Limits ont été ajoutées dans le container du Pod, celles-ci ont les valeurs spécifiées dans la ressource LimitRange.

...
Containers:
  www:
    Container ID:   containerd://11b259e95b68ade3e014fc994e11ea22b0a5c31d0896c845811dad4ad073ba87
    Image:          nginx:1.18-alpine
    Image ID:       docker.io/library/nginx@sha256:93baf2ec1bfefd04d29eb070900dd5d79b0f79863653453397e55a5b663a6cb1
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 21 Sep 2021 19:00:11 +0200
    Ready:          True
    Restart Count:  0
    Limits:
      memory:  128M         <-- Valeur de .spec.limits.default.memory de la ressource LimitRange
    Requests:
      memory:     64M       <-- Valeur de .spec.limits.defaultRequest.memory de la ressource LimitRange
...

Lancement d’un Pod avec une spécification de ressource correcte

La spécification suivante définit un Pod avec un unique container, celui-ci définit des valeurs pour les requests et limits de mémoire. Copiez cette spécification dans le fichier www-2.yaml:

www-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: www-2
spec:
  containers:
  - name: www
    image: nginx:1.18-alpine
    resources:
      limits:
        memory: 120M
      requests:
        memory: 100M

Créez ce Pod dans le namespace test

kubectl apply -f www-2.yaml -n test

Regardez ensuite la configuration du Pod:

kubectl describe po www-2 -n test

Vous devriez observer que les propriétés Requests et Limits n’ont pas été modifiées, elles sont dans l’intervalle accepté par la ressource LimitRange.

...
Containers:
  www:
    Container ID:   containerd://7bef304d43a3a72ffb39623b11e0f4d45f6ceeb4ee5409e047f414f22f099515
    Image:          nginx:1.18-alpine
    Image ID:       docker.io/library/nginx@sha256:93baf2ec1bfefd04d29eb070900dd5d79b0f79863653453397e55a5b663a6cb1
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 21 Sep 2021 19:52:06 +0200
    Ready:          True
    Restart Count:  0
    Limits:
      memory:  120M      <-- valeur inchangée
    Requests:
      memory:     100M   <-- valeur inchangée
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-hmlh5 (ro)
...

Lancement d’un Pod avec une spécification de ressource incorrecte

La spécification suivante définit un Pod avec un unique container, celui-ci définit des valeurs pour les requests et limits de mémoire (cette dernière étant cependant en dehors de l’intervalle accepté par le LimitRange). Copiez cette spécification dans le fichier www-3.yaml:

www-3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: www-3
spec:
  containers:
  - name: www
    image: nginx:1.18-alpine
    resources:
      limits:
        memory: 512M
      requests:
        memory: 64M

Créez ensuite ce Pod dans le namespace test

kubectl apply -f www-3.yaml -n test

Vous devriez obtenir un message semblable à celui ci-dessous:

Error from server (Forbidden): error when creating "www-3.yaml": pods "www-3" is forbidden: maximum memory usage per Container is 256M, but limit is 512M

Ce nouveau Pod ne peut pas être créé car sa spécification contient une limite de mémoire (.spec.containers[0].resources.limits.memory) supérieure à la valeur maximale acceptée par le LimitRange.

Cleanup

Supprimez le namespace avec la commande suivante:

kubectl delete ns test