Cette page décrit le cycle de vie d’un Pod.
Le champ status
d’un Pod est un objet
PodStatus,
contenant un champ phase
.
La phase d’un Pod est un résumé simple et de haut niveau de l’étape à laquelle le Pod se trouve dans son cycle de vie. La phase n’est pas faite pour être un cumul complet d’observations de l’état du conteneur ou du Pod, ni pour être une machine à état compréhensible.
Le nombre et la signification des valeurs de phase d’un pod sont soigneusement gardés.
Hormis ce qui est documenté ici, rien ne doit être supposé sur des Pods
ayant une valeur de phase
donnée.
Voici les valeurs possibles pour phase
:
Valeur | Description |
---|---|
Pending | Le Pod a été accepté par Kubernetes, mais une ou plusieurs images de conteneurs n’ont pas encore été créées. Ceci inclut le temps avant d’être affecté ainsi que le temps à télécharger les images à travers le réseau, ce qui peut prendre un certain temps. |
Running | Le pod a été affecté à un nœud et tous les conteneurs ont été créés. Au moins un conteneur est toujours en cours d’exécution, ou est en train de démarrer ou redémarrer. |
Succeeded | Tous les conteneurs du pod ont terminé avec succès et ne seront pas redémarrés. |
Failed | Tous les conteneurs d’un pod ont terminé, et au moins un conteneur a terminé en échec : soit le conteneur a terminé avec un status non zéro, soit il a été arrêté par le système. |
Unknown | Pour quelque raison l’état du pod ne peut pas être obtenu, en général en cas d’erreur de communication avec l’hôte du Pod. |
Un Pod a un PodStatus, qui contient un tableau de PodConditions à travers lesquelles le Pod est ou non passé. Chaque élément du tableau de PodCondition a six champs possibles :
Le champ lastProbeTime
fournit un timestamp auquel la condition du Pod
a été sondée pour la dernière fois.
Le champ lastTransitionTime
fournit un timestamp auquel le Pod a changé de statut
pour la dernière fois.
Le champ message
est un message lisible indiquant les détails de la transition.
Le champ reason
est une raison unique, en un seul mot et en CamelCase de la transition
vers la dernière condition.
Le champ status
est une chaîne de caractères avec les valeurs possibles “True
”, “False
”, et “Unknown
”.
Le champ type
est une chaîne de caractères ayant une des valeurs suivantes :
PodScheduled
: le Pod a été affecté à un nœud ;Ready
: le Pod est prêt à servir des requêtes et doit être rajouté aux équilibreurs
de charge de tous les Services correspondants ;Initialized
: tous les init containers
ont démarré correctement ;Unschedulable
: le scheduler ne peut pas affecter le Pod pour l’instant, par exemple
par manque de ressources ou en raison d’autres contraintes ;ContainersReady
: tous les conteneurs du Pod sont prêts.Une Sonde (Probe) est un diagnostic exécuté périodiquement par kubelet sur un Conteneur. Pour exécuter un diagnostic, kubelet appelle un Handler implémenté par le Conteneur. Il existe trois types de handlers :
ExecAction: Exécute la commande spécifiée à l’intérieur du Conteneur. Le diagnostic est considéré réussi si la commande se termine avec un code de retour de 0.
TCPSocketAction: Exécute un contrôle TCP sur l’adresse IP du Conteneur et sur un port spécifié. Le diagnostic est considéré réussi si le port est ouvert.
HTTPGetAction: Exécute une requête HTTP Get sur l’adresse IP du Conteneur et sur un port et un chemin spécifiés. Le diagnostic est considéré réussi si la réponse a un code de retour supérieur ou égal à 200 et inférieur à 400.
Chaque sonde a un résultat parmi ces trois :
kubelet peut optionnellement exécuter et réagir à deux types de sondes sur des conteneurs en cours d’exécution :
livenessProbe
: Indique si le Conteneur est en cours d’exécution. Si
la liveness probe échoue, kubelet tue le Conteneur et le Conteneur
est soumis à sa politique de redémarrage (restart policy).
Si un Conteneur ne fournit pas de liveness probe, l’état par défaut est Success
.
readinessProbe
: Indique si le Conteneur est prêt à servir des requêtes.
Si la readiness probe échoue, le contrôleur de points de terminaison (Endpoints)
retire l’adresse IP du Pod des points de terminaison de tous les Services
correspodant au Pod. L’état par défaut avant le délai initial est
Failure
. Si le Conteneur ne fournit pas de readiness probe, l’état par
défaut est Success
.
Si le process de votre Conteneur est capable de crasher de lui-même lorsqu’il
rencontre un problème ou devient inopérant, vous n’avez pas forcément besoin
d’une liveness probe ; kubelet va automatiquement exécuter l’action correcte
en accord avec la politique de redémarrage (restartPolicy
) du Pod.
Si vous désirez que votre Conteneur soit tué et redémarré si une sonde échoue, alors
spécifiez une liveness probe et indiquez une valeur pour restartPolicy
à Always
ou OnFailure.
Si vous voulez commencer à envoyer du trafic à un Pod seulement lorsqu’une sonde réussit, spécifiez une readiness probe. Dans ce cas, la readiness probe peut être la même que la liveness probe, mais l’existence de la readiness probe dans la spec veut dire que le Pod va démarrer sans recevoir aucun trafic et va commencer à recevoir du trafic après que la sonde réussisse. Si votre Conteneur doit charger une grande quantité de données, des fichiers de configuration ou exécuter des migrations au démarrage, spécifiez une readiness probe.
Si vous désirez que le Conteneur soit capable de se mettre en maintenance tout seul, vous pouvez spécifier une readiness probe qui vérifie un point de terminaison spécifique au readiness et différent de la liveness probe.
Notez que si vous voulez uniquement être capable de dérouter les requêtes lorsque le Pod est supprimé, vous n’avez pas forcément besoin d’une readiness probe; lors de sa suppression, le Pod se met automatiquement dans un état non prêt, que la readiness probe existe ou non. Le Pod reste dans le statut non prêt le temps que les Conteneurs du Pod s’arrêtent.
Pour plus d’informations sur la manière de mettre en place une liveness ou readiness probe, voir Configurer des Liveness et Readiness Probes.
Pour des informations détaillées sur le statut d’un Pod et d’un Conteneur, voir PodStatus et ContainerStatus. Notez que l’information rapportée comme statut d’un Pod dépend du ContainerState actuel.
Une fois que le Pod est assigné à un nœud par le scheduler, kubelet commence
à créer les conteneurs en utilisant le runtime de conteneurs. Il existe trois états possibles
pour les conteneurs : en attente (Waiting), en cours d’exécution (Running) et terminé (Terminated). Pour vérifier l’état d’un conteneur, vous pouvez utiliser kubectl describe pod [POD_NAME]
. L’état est affiché pour chaque conteneur du Pod.
Waiting
: état du conteneur par défaut. Si le conteneur n’est pas dans un état Running ou Terminated, il est dans l’état Waiting. Un conteneur dans l’état Waiting exécute
les opérations nécessaires, comme télécharger les images, appliquer des Secrets, etc. À côté
de cet état, un message et une raison sur l’état sont affichés pour vous fournir plus
d’informations.
...
State: Waiting
Reason: ErrImagePull
...
Running
: Indique que le conteneur s’exécute sans problème. Une fois qu’un centeneur est
dans l’état Running, le hook postStart
est exécuté (s’il existe). Cet état affiche aussi
le moment auquel le conteneur est entré dans l’état Running.
...
State: Running
Started: Wed, 30 Jan 2019 16:46:38 +0530
...
Terminated
: Indique que le conteneur a terminé son exécution et s’est arrêté.
Un conteneur entre dans cet état lorsqu’il s’est exécuté avec succès ou lorsqu’il a
échoué pour une raison quelconque. De plus, une raison et un code de retour sont affichés,
ainsi que les moments de démarrage et d’arrêt du conteneur. Avant qu’un conteneur entre
dans l’état Terminated, le hook preStop
est exécuté (s’il existe).
...
State: Terminated
Reason: Completed
Exit Code: 0
Started: Wed, 30 Jan 2019 11:45:26 +0530
Finished: Wed, 30 Jan 2019 11:45:26 +0530
...
Kubernetes v1.14
stableAfin d’étendre la readiness d’un Pod en autorisant l’injection de données
supplémentaires ou des signaux dans PodStatus
, Kubernetes 1.11 a introduit
une fonctionnalité appelée Pod ready++.
Vous pouvez utiliser le nouveau champ ReadinessGate
dans PodSpec
pour spécifier des conditions additionnelles à évaluer pour la readiness d’un Pod.
Si Kubernetes ne peut pas trouver une telle condition dans le champ status.conditions
d’un Pod, le statut de la condition est “False
” par défaut. Voici un exemple :
Kind: Pod
...
spec:
readinessGates: extra
- conditionType: extra "www.example.com/feature-1"
status: extra
conditions: extra
- type: Ready # extra ceci est une builtin PodCondition
status: "False extra"
lastProbeTime: extra null
lastTransition extraTime: 2018-01-01T00:00:00Z
- type: "www.exa extrample.com/feature-1" # une PodCondition supplémentaire
status: "False extra"
lastProbeTime: extra null
lastTransitionTime: 2018-01-01T00:00:00Z
containerStatuses:
- containerID: docker://abcd...
ready: true
...
Les nouvelles conditions du Pod doivent être conformes au format des étiquettes de Kubernetes.
La commande kubectl patch
ne prenant pas encore en charge la modifictaion du statut
des objets, les nouvelles conditions du Pod doivent être injectées avec
l’action PATCH
en utilisant une des bibliothèques KubeClient.
Avec l’introduction de nouvelles conditions d’un Pod, un Pod est considéré comme prêt seulement lorsque les deux déclarations suivantes sont vraies :
ReadinessGates
sont à “True
”.Pour faciliter le changement de l’évaluation de la readiness d’un Pod,
une nouvelle condition de Pod ContainersReady
est introduite pour capturer
l’ancienne condition Ready
d’un Pod.
Avec K8s 1.11, en tant que fonctionnalité alpha, “Pod Ready++” doit être explicitement activé en mettant la feature gate PodReadinessGates
à true.
Avec K8s 1.12, la fonctionnalité est activée par défaut.
La structure PodSpec a un champ restartPolicy
avec comme valeur possible
Always, OnFailure et Never. La valeur par défaut est Always.
restartPolicy
s’applique à tous les Conteneurs du Pod. restartPolicy
s’applique
seulement aux redémarrages des Conteneurs par kubelet sur le même nœud. Des conteneurs
terminés qui sont redémarrés par kubelet sont redémarrés avec un délai exponentiel
(10s, 20s, 40s …) plafonné à cinq minutes, qui est réinitialisé après dix minutes
d’exécution normale. Comme discuté dans le
document sur les Pods,
une fois attaché à un nœud, un Pod ne sera jamais rattaché à un autre nœud.
En général, un Pod ne disparaît pas avant que quelqu’un le détruise. Ceci peut être
un humain ou un contrôleur. La seule exception à cette règle est pour les Pods ayant
une phase
Succeeded ou Failed depuis une durée donnée (déterminée
par terminated-pod-gc-threshold
sur le master), qui expireront et seront
automatiquement détruits.
Trois types de contrôleurs sont disponibles :
Utilisez un Job pour des
Pods qui doivent se terminer, par exemple des calculs par batch. Les Jobs sont appropriés
seulement pour des Pods ayant restartPolicy
égal à OnFailure ou Never.
Utilisez un ReplicationController,
ReplicaSet ou
Deployment
pour des Pods qui ne doivent pas s’arrêter, par exemple des serveurs web.
ReplicationControllers sont appropriés pour des Pods ayant restartPolicy
égal à
Always.
Utilisez un DaemonSet pour des Pods qui doivent s’exécuter une fois par machine, car ils fournissent un service système au niveau de la machine.
Les trois types de contrôleurs contiennent un PodTemplate. Il est recommandé de créer le contrôleur approprié et de le laisser créer les Pods, plutôt que de créer directement les Pods vous-même. Ceci car les Pods seuls ne sont pas résilients aux pannes machines, alors que les contrôleurs le sont.
Si un nœud meurt ou est déconnecté du reste du cluster, Kubernetes applique
une politique pour mettre la phase
de tous les Pods du nœud perdu à Failed.
Les Liveness probes sont exécutées par kubelet, toutes les requêtes sont donc faites dans l’espace réseau de kubelet.
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- args:
- /server
image: k8s.gcr.io/liveness
livenessProbe:
httpGet:
# lorsque "host" n'est pas défini, "PodIP" sera utilisé
# host: my-host
# lorsque "scheme" n'est pas défini, "HTTP" sera utilisé. "HTTP" et "HTTPS" sont les seules valeurs possibles
# scheme: HTTPS
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 15
timeoutSeconds: 1
name: liveness
Un Pod est en cours d’exécution et a un Conteneur. Le conteneur se termine avec succès.
restartPolicy
est :phase
du Pod reste à Running.phase
du Pod passe à Succeeded.phase
du Pod passe à Succeeded.Un Pod est en cours d’exécution et a un Conteneur. Le conteneur se termine en erreur.
restartPolicy
est :phase
du Pod reste à Running.phase
du Pod reste à Running.phase
du Pod passe à Failed.Un Pod est en cours d’exécution et a deux Conteneurs. Le conteneur 1 termine en erreur.
restartPolicy
est :phase
du Pod reste à Running.phase
du Pod reste à Running.phase
du Pod reste à Running.restartPolicy
est :phase
du Pod reste à Running.phase
du Pod reste à Running.phase
du Pod passe à Failed.Un Pod est en cours d’exécution et a un Conteneur. Le Conteneur n’a plus assez de mémoire.
restartPolicy
est :phase
du Pod reste à Running.phase
du Pod reste à Running.phase
du Pod passe à Failed.Le Pod est en cours d’exécution, et un disque meurt.
phase
du Pod devient Failed.Le Pod est en cours d’exécution et son nœud est segmenté.
phase
du Pod à Failed.Apprenez par la pratique attacher des handlers à des événements de cycle de vie d’un conteneur.
Apprenez par la pratique configurer des liveness et readiness probes.
En apprendre plus sur les hooks de cycle de vie d’un Conteneur.
Cette page est elle utile ?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.