Ceci est une ancienne révision du document !


Version - 2020.01

Dernière mise-à-jour : 2022/09/11 13:46

DOF304 - Travailler avec des Pods et des Conteneurs

Contenu du Module

  • DOF304 - Travailler avec des Pods et des Conteneurs
    • Contenu du Module
    • LAB #1 - Application Configuration
      • 1.1 - Création d'une ConfigMap
      • 1.2 - Création d'un Secret
      • 1.3 - Utilisation de ConfigMaps et de Secrets
        • Utilisation de Variables d'environnement
        • Utilisation de Volumes de Configuration
    • LAB #2 - Gestion des Ressources des Conteneurs
      • 2.1 - Resource Requests
      • 2.2 - Resource Limits
    • LAB #3 - Supervision des Conteneurs
      • 3.1 - Liveness Probes
        • Le Probe exec
        • Le Probe httpGet
      • 3.2 - Startup Probes
      • 3.3 - Readiness Probes
    • LAB #4 - Gestion des Politiques de Redémarrage

LAB #1 - Application Configuration

La gestion de la configuration d'application ou Application Configuration est le processus de passage de valeurs dynamiques aux applications au moment du runtime.

Il y a deux façons de stocker des informations dans K8s :

  • ConfigMaps,
  • Secrets.

Les données stockées dans des ConfigMaps et des Secrets peuvent être passées aux conteneurs en utilisant des :

  • Variables d'environnement,
  • Volumes de configuration.

1.1 - Création d'une ConfigMap

Pour commencer, créez le fichier myconfigmap.yaml :

root@kubemaster:~# vi myconfigmap.yaml
root@kubemaster:~# cat myconfigmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  key1: Hello, world!
  key2: |
    Test
    multiple lines
    more lines

Important : Notez que les données sont stockées dans des Key-values. La première donnée dans la section data est key1: Hello, world! tandis que la deuxième, key2, est en plusieures lignes.

Créez maintenant la ConfigMap :

root@kubemaster:~# kubectl create -f myconfigmap.yaml
configmap/my-configmap created

Pour consulter le contenu de la ConfigMap, utilisez la commande kubectl describe :

root@kubemaster:~# kubectl describe configmap my-configmap
Name:         my-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
key1:
----
Hello, world!
key2:
----
Test
multiple lines
more lines


BinaryData
====

Events:  <none>

1.2 - Création d'un Secret

Créez maintenant le fichier mysecret.yaml :

root@kubemaster:~# vi mysecret.yaml
root@kubemaster:~# cat mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  secretkey1:
  secretkey2:

Important : Notez que les clefs secrets n'ont pas encore été définies.

Cryptez maintenant les deux clefs en utilisant base64 :

root@kubemaster:~# echo -n 'secret' | base64
c2VjcmV0

root@kubemaster:~# echo -n 'anothersecret' | base64
YW5vdGhlcnNlY3JldA==

Copiez et collez les chaînes base64 dans le ficheir mysecret.yaml :

root@kubemaster:~# vi mysecret.yaml
root@kubemaster:~# cat mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  secretkey1: c2VjcmV0
  secretkey2: YW5vdGhlcnNlY3JldA==

Important : Remplacez les chaînes par celles que VOUS avez créé.

Créez maintenant le Secret :

root@kubemaster:~# kubectl create -f mysecret.yaml
secret/my-secret created

1.3 - Utilisation de ConfigMaps et de Secret

Utilisation des Variables d'environnement

Créez le fichier envpod.yaml :

root@kubemaster:~# vi envpod.yaml
root@kubemaster:~# cat envpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: envpod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'echo "configmap: $CONFIGMAPVAR secret: $SECRETVAR"']
    env:
    - name: CONFIGMAPVAR
      valueFrom:
        configMapKeyRef:
          name: my-configmap
          key: key1
    - name: SECRETVAR
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: secretkey1

Important : Notez que la variable $CONFIGMAPVAR contiendra la valeur de key1 de la ConfigMap et que la variable $SECRETVAR contindra la valeur de secretkey1 du Secret.

Créez maintenant le pod :

root@kubemaster:~# kubectl create -f envpod.yaml 
pod/envpod created

Consultez maintenant les logs du pod :

root@kubemaster:~# kubectl logs envpod
configmap: Hello, world! secret: secret

Important : Notez que le conteneur dans le pod voit bien les valeurs des deux variables.

Utilisation des Volumes de Configuration

Créez le fichier volumepod.yaml :

root@kubemaster:~# vi volumepod.yaml
root@kubemaster:~# cat volumepod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: volumepod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'while true; do sleep 3600; done']
    volumeMounts:
    - name: configmap-volume
      mountPath: /etc/config/configmap
    - name: secret-volume
      mountPath: /etc/config/secret
  volumes:
  - name: configmap-volume
    configMap:
      name: my-configmap
  - name: secret-volume
    secret:
      secretName: my-secret

Créez maintenant le pod :

root@kubemaster:~# kubectl create -f volumepod.yaml 
pod/volumepod created

Utilisez maintenant la commande kubectl exec pour consulter les config data files dans le conteneur :

root@kubemaster:~# kubectl exec volumepod -- ls /etc/config/configmap
key1
key2

root@kubemaster:~# kubectl exec volumepod -- cat /etc/config/configmap/key1
Hello, world!root@kubemaster:~# [Enter]

root@kubemaster:~# kubectl exec volumepod -- cat /etc/config/configmap/key2
Test
multiple lines
more lines

root@kubemaster:~# kubectl exec volumepod -- ls /etc/config/secret
secretkey1
secretkey2

root@kubemaster:~# kubectl exec volumepod -- cat /etc/config/secret/secretkey1
secretroot@kubemaster:~# [Enter]

root@kubemaster:~# kubectl exec volumepod -- cat /etc/config/secret/secretkey2
anothersecretroot@kubemaster:~# [Enter]

root@kubemaster:~# 

Dernièrement, supprimez les pods envpod et volumepod :

root@kubemaster:~# kubectl delete pod envpod volumepod
pod "envpod" deleted
pod "volumepod" deleted

LAB #2 - Gestion des Ressources des Conteneurs

Deux aspects importants de la gestion des ressources des conteneurs sont :

  • Resource Requests,
    • Une Resource Request permet de définir des ressources telles le CPU et la mémoire au moment du scheduling. Autrement dit, si la Resource Request est de 5Go, le scheduleur des pods cherchera une noeud ayant 5 Go de RAM disponible. Une Resource Request n'est pas une limite car le pod peut utiliser plus ou moins de mémoire.
  • Resource Limits,
    • Une Resource Limit permet de définir des limites des ressources telles le CPU et la mémoire. Différents Container Runtimes réagissent de manières différentes devant une Resource Limit. Par exemple, certains vont arrêter le processus du conteneur en cas de dépassement de la limite. Dans le cas de Docker, si la limite du CPU est dépassé, Docker va limiter l'utilisation du CPU. Par contre dans le cas d'un dépassement de la limite de la mémoire, Docker va tuer le processus du conteneur.

Pour les deux types, les demandes et les limites de la mémoire sont généralement exprimées en Mi, tandis que les les demandes et les limites du CPU sont exprimées en 1/1000 d'un processeur. Par exemple le chiffre 250m représente 250/1000 d'un CPU ou 1/4.

2.1 - Resource Requests

Créez le fichier bigrequestpod.yaml :

root@kubemaster:~# vi bigrequestpod.yaml
root@kubemaster:~# cat bigrequestpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: bigrequestpod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'while true; do sleep 3600; done']
    resources:
      requests:
        cpu: "10000m"
        memory: "128Mi"

Créez le pod :

root@kubemaster:~# kubectl create -f bigrequestpod.yaml
pod/bigrequestpod created

Consultez maintenant le statut du pod créé :

root@kubemaster:~# kubectl get pod bigrequestpod
NAME            READY   STATUS    RESTARTS   AGE
bigrequestpod   0/1     Pending   0          92s

Important : Notez que le statut du pod est en pending. Le pod restera en pending car ni kubenode1, ni kubenode2 sont capables de satisfaire la demande de 10000m.

2.2 - Resource Limits

Créez le fichier resourcepod.yaml :

root@kubemaster:~# vi resourcepod.yaml
root@kubemaster:~# cat resourcepod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: resourcepod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'while true; do sleep 3600; done']
    resources:
      requests:
        cpu: "250m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"

Créez le pod :

root@kubemaster:~# kubectl create -f resourcepod.yaml
pod/resourcepod created

Consultez le statut des pods :

root@kubemaster:~# kubectl get pods
NAME                              READY   STATUS             RESTARTS       AGE
bigrequestpod                     0/1     Pending            0              20m
my-deployment-67b5d4bf57-6wcrq    1/1     Running            0              22h
myapp-deployment-689f9d59-c25f9   1/1     Running            0              7d
myapp-deployment-689f9d59-nn9sw   1/1     Running            0              7d
myapp-deployment-689f9d59-rnc4r   1/1     Running            0              7d
resourcepod                       1/1     Running            0              5m49s 

Important : Notez que le statut du pod bigrequestpod est toujours en pending.

LAB #3 - Supervision des Conteneurs

La supervision des conteneurs concerne la surveillance de la santé des conteneurs afin d'assurer des applications et des solutions robustes en redémarrant des conteneurs cassés. Pour accomplir cette tâche, K8s utilise des sondes ou probes en anglais.

Il existe plusieurs types de sondes :

  • Liveness Probes,
    • Par défaut K8s considère un conteneur HS uniquement quand le conteneur en question s'arrête,
    • Liveness probes permettent une configuration plus sophistiquée de mécanisme.
  • Startup Probes,
    • Similaires aux Liveness Probes, les Startup Probes n'interviennent uniquement au démarrage du conteneur et s'arrêtent quand l'application a démarré.
  • Readiness Probes,
    • Similaires aux Startup Probes car ils n'interviennet qu'au démarrage du pod, les Readiness Probes sont responsables du blocage du trafic vers les pods tant que tous les conteneurs du pod n'ont pas réussi les Readiness Probes.

3.1 - Liveness Probes

Le Probe exec

Créez le fichier livenesspod.yaml :

root@kubemaster:~# vi livenesspod.yaml
root@kubemaster:~# cat livenesspod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: livenesspod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'while true; do sleep 3600; done']
    livenessProbe:
      exec:
        command: ["echo", "Hello, world!"]
      initialDelaySeconds: 5
      periodSeconds: 5

Important : Dans le fichier ci-dessus, si la commande echo “Hello, World! retourne un code de retour de 0, le conteneur sera considéré en bonne santé. Le Liveness Probe démarrera 5 secondes après le démarrage du conteneur grâce à la directive initialDelaySeconds. Ensuite le probe s'exécutera tous les 5 secondes grâce à la directive periodSeconds.

Créez le pod :

root@kubemaster:~# kubectl create -f livenesspod.yaml
pod/livenesspod created

Consultez le statut du pod :

root@kubemaster:~# kubectl get pod livenesspod
NAME           READY   STATUS    RESTARTS   AGE
livenesspod    1/1     Running   0          90s

Important : Notez que le pod est en bonne santé et à un statut de running.

Le Probe httpGet

Créez le fichier livenesspodhttp.yaml :

root@kubemaster:~# vi livenesspodhttp.yaml
root@kubemaster:~# cat livenesspodhttp.yaml
apiVersion: v1
kind: Pod
metadata:
  name: livenesspodhttp
spec:
  containers:
  - name: nginx
    image: nginx:1.19.1
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5

Important : Dans le fichier ci-dessus, si la commande GET / s'exécute sans erreur, le conteneur sera considéré en bonne santé. Le Liveness Probe démarrera 5 secondes après le démarrage du conteneur grâce à la directive initialDelaySeconds. Ensuite le probe s'exécutera tous les 5 secondes grâce à la directive periodSeconds.

Créez le pod :

root@kubemaster:~# kubectl create -f livenesspodhttp.yaml
pod/livenesspodhttp created

Consultez le statut du pod :

root@kubemaster:~# kubectl get pod livenesspodhttp
NAME              READY   STATUS    RESTARTS   AGE
livenesspodhttp   1/1     Running   0          52s

Important : Notez que le pod est en bonne santé et à un statut de running.

3.2 - Startup Probes

Créez le fichier startuppod.yaml :

root@kubemaster:~# vi startuppod.yaml
root@kubemaster:~# cat startuppod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: startuppod
spec:
  containers:
  - name: nginx
    image: nginx:1.19.1
    startupProbe:
      httpGet:
        path: /
        port: 80
      failureThreshold: 30
      periodSeconds: 10

Important : Dans le fichier ci-dessus, le Startup Probe va attendre un maximum de 30 secondes pour que l'application démarre grâce à la directive failureThreshold. Le probe s'exécutera tous les 10 secondes grâce à la directive periodSeconds.

Créez le pod :

root@kubemaster:~# kubectl create -f startuppod.yaml
pod/startuppod created

Consultez le statut du pod :

root@kubemaster:~# kubectl get pod startuppod
NAME           READY   STATUS    RESTARTS   AGE
livenesspod    1/1     Running   0          90s

Important : Notez que le pod est en bonne santé et à un statut de running.

3.3 - Readiness Probes

Créez le fichier readinesspod.yaml :

root@kubemaster:~# vi readinesspod.yaml
root@kubemaster:~# cat readinesspod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: readinesspod
spec:
  containers:
  - name: nginx
    image: nginx:1.19.1
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5

Important : Dans le fichier ci-dessus, si la commande GET / s'exécute sans erreur, le conteneur sera considéré dasn un état de READY. Le Readiness Probe démarrera 5 secondes après le démarrage du conteneur grâce à la directive initialDelaySeconds. Ensuite le probe s'exécutera tous les 5 secondes grâce à la directive periodSeconds.

Créez le pod et consultez son statut :

root@kubemaster:~# kubectl create -f readinesspod.yaml;kubectl get pod readinesspod;sleep 1;kubectl get pod readinesspod;sleep 3;kubectl get pod readinesspod;sleep 3;kubectl get pod readinesspod;sleep 3;kubectl get pod readinesspod;sleep 3;kubectl get pod readinesspod
pod/readinesspod created
NAME           READY   STATUS    RESTARTS   AGE
readinesspod   0/1     Pending   0          0s
NAME           READY   STATUS              RESTARTS   AGE
readinesspod   0/1     ContainerCreating   0          1s
NAME           READY   STATUS    RESTARTS   AGE
readinesspod   0/1     Running   0          4s
NAME           READY   STATUS    RESTARTS   AGE
readinesspod   0/1     Running   0          7s
NAME           READY   STATUS    RESTARTS   AGE
readinesspod   0/1     Running   0          10s
NAME           READY   STATUS    RESTARTS   AGE
readinesspod   1/1     Running   0          13s

Important : Notez que le pod est a un statut de running 4 secondes après son démarrage. Par contre, le pod ne passe qu'en READY au bout de 13 secondes quand le Readiness Probe a réussi.

LAB #4 - Gestion des Politiques de Redémarrage


Copyright © 2022 Hugh Norris

Menu