====== 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.
===== Cycle de vie =====
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 |
===== Création de pod =====
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']
===== Liste des pods par status =====
oc get pods --field-selector "status.phase=Running" -o name
===== Destruction / nettoyage des POD =====
==== Supprimer un seul pod ====
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
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 --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 -p '{"metadata":{"finalizers":null}}'
==== Supprimer un set de pods ====
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
==== Nettoyer les services d'un noeud ====
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