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 :
Et au sein d'un même pod sont partagé entre tous les containers :
localhost
.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