Pods

Les pods sont les objets de plus bas niveau en terme de charge de calcul dans les clusters Kubernetes. Un pod est un regroupement de ressources partagées fonctionnant sur un seul et même noeud.

Le pod est constitué de :

  • Containers
  • Une IP réseau

Et au sein d'un même pod sont partagé entre tous les containers :

  • La stack réseau. Les containers peuvent aussi communiquer entre eux via localhost.
  • Les volumes.
Généralement, les applications sont constituées d'un seul container par pod.

Chez Kubernetes, un pod est considéré comme éphémère. Ils ne sont donc généralement pas à créer à la main.

Les phases du pod (status.phase) sont les suivantes:

Phase Description
Pending Les images sont en cours de téléchargement.
Running Le pod a été lié à un noeud et est en cours de fonctionnement. Au moins un container est en cours d'exécution.
Succeeded Tous les containers ont terminé avec succès.
Failed Tous les containers ont terminé et au moins un est en échec.
Unknown Il y a une erreur…

Chaque pod a aussi des conditions (status.conditions) qui est une liste de condition dont les propriétés sont :

Propriété Description
lastProbeTime Timestamp de la dernière vérification.
lastTransitionTime Timestamp du dernier changement de statut.
message Message du dernier statut.
reason Champ d'un seule mot pour la raison du dernier changement.
status True, False ou Unknown.
type PodScheduled / Ready / Initialized / Unschedylable / ContainersReady

En général, un pod est créé par un contrôleur via une directive d'un deployment, statefulset ou daemonset. Ils sont créé à partir d'un template comme le suivant.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
  oc get pods --field-selector "status.phase=Running" -o name

Un pod se détruit de lui même après que les containers qui le compose se soient fermés. Il d'envoyer un signal de terminaison avec la commande :

oc delete pod <PODNAME>

Avec PODNAME le nom du pod.

Si un pod ne se termine pas correctement, il est possible de forcer son arrêt avec la commande suivante :

oc delete pod <PODNAME> --grace-period=0 --force

Si malgré l'arrêt forcé le pod reste dans le système avec l'état “Unknown”, la commande suivante peut permettre de le retirer :

oc patch pod <PODNAME> -p '{"metadata":{"finalizers":null}}'

Pour supprimer plusieurs pods d'un coup, il est possible de combiner des commandes :

  for pod in `oc get pods --field-selector "status.phase=Running" -n namespace -o name`; do oc delete $pod --grace-period=0 --force -n namespace; done

Les pods seront terminés et transféré à un autre noeud.

La commande de base est la suivante :

  oc adm drain $node

On peut y ajouter les arguments suivant pour mieux déterminer les pods à nettoyer. Notamment les arguments suivant :

Argument Description
–ignore-daemonsets Ignorer les pods créé par des daemonset (conseillé).
–delete-local-data Nettoyer aussi les pods avec des données en local.
–force Forcer le nettoyage.
–grace-period=-1 Ne pas attendre que les pods se termine.
–timeout=5s Temps avant d'abandonner le nettoyage.
–dry-run Ne pas exécuter.

for node in `oc get nodes -l 'node-role.kubernetes.io/compute=true' -o name`; do oc adm drain $node –force –ignore-daemonsets –delete-local-data; done