Pods lifecycle

This commit is contained in:
Philippe Martin
2020-05-22 14:38:22 +02:00
parent a79466447c
commit f92ad5afce
@@ -65,8 +65,6 @@ du tableau de PodCondition a six champs possibles :
de charge de tous les Services correspondants ; de charge de tous les Services correspondants ;
* `Initialized` : tous les [init containers](/docs/concepts/workloads/pods/init-containers) * `Initialized` : tous les [init containers](/docs/concepts/workloads/pods/init-containers)
ont démarré correctement ; 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. * `ContainersReady` : tous les conteneurs du Pod sont prêts.
@@ -98,12 +96,12 @@ Chaque sonde a un résultat parmi ces trois :
* Failure: Le Conteneur a échoué au diagnostic. * Failure: Le Conteneur a échoué au diagnostic.
* Unknown: L'exécution du diagnostic a échoué, et donc aucune action ne peut être prise. * Unknown: L'exécution du diagnostic a échoué, et donc aucune action ne peut être prise.
kubelet peut optionnellement exécuter et réagir à deux types de sondes sur des conteneurs kubelet peut optionnellement exécuter et réagir à trois types de sondes sur des conteneurs
en cours d'exécution : en cours d'exécution :
* `livenessProbe` : Indique si le Conteneur est en cours d'exécution. Si * `livenessProbe` : Indique si le Conteneur est en cours d'exécution. Si
la liveness probe échoue, kubelet tue le Conteneur et le Conteneur la liveness probe échoue, kubelet tue le Conteneur et le Conteneur
est soumis à sa [politique de redémarrage](#restart-policy) (restart policy). est soumis à sa [politique de redémarrage](#politique-de-redemarrage) (restart policy).
Si un Conteneur ne fournit pas de liveness probe, l'état par défaut est `Success`. 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. * `readinessProbe` : Indique si le Conteneur est prêt à servir des requêtes.
@@ -113,7 +111,13 @@ en cours d'exécution :
`Failure`. Si le Conteneur ne fournit pas de readiness probe, l'état par `Failure`. Si le Conteneur ne fournit pas de readiness probe, l'état par
défaut est `Success`. défaut est `Success`.
### Quand devez-vous utiliser une liveness ou une readiness probe ? * `startupProbe`: Indique si l'application à l'intérieur du conteneur a démarré.
Toutes les autres probes sont désactivées si une starup probe est fournie,
jusqu'à ce qu'elle réponde avec succès. Si la startup probe échoue, le kubelet
tue le conteneur, et le conteneur est assujetti à sa [politique de redémarrage](#politique-de-redemarrage).
Si un conteneur ne fournit pas de startup probe, l'état par défaut est `Success`.
### Quand devez-vous utiliser une liveness probe ?
Si le process de votre Conteneur est capable de crasher de lui-même lorsqu'il 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 rencontre un problème ou devient inopérant, vous n'avez pas forcément besoin
@@ -124,6 +128,10 @@ Si vous désirez que votre Conteneur soit tué et redémarré si une sonde écho
spécifiez une liveness probe et indiquez une valeur pour `restartPolicy` à Always spécifiez une liveness probe et indiquez une valeur pour `restartPolicy` à Always
ou OnFailure. ou OnFailure.
### Quand devez-vous utiliser une readiness probe ?
{{< feature-state for_k8s_version="v1.0" state="stable" >}}
Si vous voulez commencer à envoyer du trafic à un Pod seulement lorsqu'une sonde 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 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 la même que la liveness probe, mais l'existence de la readiness probe dans la spec
@@ -142,8 +150,16 @@ de sa suppression, le Pod se met automatiquement dans un état non prêt, que la
readiness probe existe ou non. readiness probe existe ou non.
Le Pod reste dans le statut non prêt le temps que les Conteneurs du Pod s'arrêtent. 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, ### Quand devez-vous utiliser une startup probe ?
voir [Configurer des Liveness et Readiness Probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/).
{{< feature-state for_k8s_version="v1.16" state="alpha" >}}
Si vous conteneur démarre habituellement en plus de `initialDelaySeconds + failureThreshold × periodSeconds`,
vous devriez pécifier une startup probe qui vérifie le même point de terminaison que la liveness probe. La valeur par défaut pour `periodSeconds` est 30s.
Vous devriez alors meetre sa valeur `failureThreshold` suffisamment haute pour permettre au conteneur de démarrer, sans changer les valeurs par défaut de la liveness probe. Ceci aide à se protéger de deadlocks.
Pour plus d'informations sur la manière de mettre en place une liveness, readiness ou startup probe,
voir [Configurer des Liveness, Readiness et Startup Probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/).
## Statut d'un Pod et d'un Conteneur ## Statut d'un Pod et d'un Conteneur
@@ -172,9 +188,7 @@ d'informations.
... ...
``` ```
* `Running` : Indique que le conteneur s'exécute sans problème. Une fois qu'un centeneur est * `Running` : Indique que le conteneur s'exécute sans problème. Le hook `postStart` (s'il existe) est exécuté avant que le conteneur entre dans l'état Running. Cet état affiche aussi le moment auquel le conteneur est entré dans l'état Running.
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.
```yaml ```yaml
... ...
@@ -199,27 +213,30 @@ dans l'état Terminated, le hook `preStop` est exécuté (s'il existe).
... ...
``` ```
## Pod readiness gate ## Pod readiness {#pod-readiness-gate}
{{< feature-state for_k8s_version="v1.14" state="stable" >}} {{< feature-state for_k8s_version="v1.14" state="stable" >}}
Afin d'étendre la readiness d'un Pod en autorisant l'injection de données Votre application peut injecter des données dans `PodStatus`.
supplémentaires ou des signaux dans `PodStatus`, Kubernetes 1.11 a introduit
une fonctionnalité appelée [Pod ready++](https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md). _Pod readiness_. Pour utiliser cette fonctionnalité, remplissez `readinessGates` dans le PodSpec avec
Vous pouvez utiliser le nouveau champ `ReadinessGate` dans `PodSpec` une liste de conditions supplémentaires que le kubelet évalue pour la disponibilité du Pod.
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` Les Readiness gates sont déterminées par l'état courant des champs `status.condition` du Pod.
d'un Pod, le statut de la condition est "`False`" par défaut. Voici un exemple : Si Kubernetes ne peut pas trouver une telle condition dans le champs `status.conditions` d'un Pod, the statut de la condition
est mise par défaut à "`False`".
Voici un exemple :
```yaml ```yaml
Kind: Pod kind: Pod
... ...
spec: spec:
readinessGates: readinessGates:
- conditionType: "www.example.com/feature-1" - conditionType: "www.example.com/feature-1"
status: status:
conditions: conditions:
- type: Ready # ceci est une builtin PodCondition - type: Ready # builtin PodCondition
status: "False" status: "False"
lastProbeTime: null lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z lastTransitionTime: 2018-01-01T00:00:00Z
@@ -233,27 +250,26 @@ status:
... ...
``` ```
Les nouvelles conditions du Pod doivent être conformes au [format des étiquettes](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) de Kubernetes. Les conditions du Pod que vous ajoutez doivent avoir des noms qui sont conformes au [format des étiquettes](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) 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](/docs/reference/using-api/client-libraries/).
Avec l'introduction de nouvelles conditions d'un Pod, un Pod est considéré comme prêt ### Statut de la disponibilité d'un Pod {#pod-readiness-status}
**seulement** lorsque les deux déclarations suivantes sont vraies :
La commande `kubectl patch` ne peut pas patcher le statut d'un objet.
Pour renseigner ces `status.conditions` pour le pod, les applications et
{{< glossary_tooltip term_id="operator-pattern" text="operators">}} doivent utiliser l'action `PATCH`.
Vous pouvez utiliser une [bibliothèque client Kubernetes](/docs/reference/using-api/client-libraries/) pour
écrire du code qui renseigne les conditions particulières pour la disponibilité dun Pod.
Pour un Pod utilisant des conditions particulières, ce Pod est considéré prêt **seulement**
lorsque les deux déclarations c-dessous sont vraies :
* Tous les conteneurs du Pod sont prêts. * Tous les conteneurs du Pod sont prêts.
* Toutes les conditions spécifiées dans `ReadinessGates` sont à "`True`". * Toutes les conditions spécifiées dans `ReadinessGates` sont `True`.
Pour faciliter le changement de l'évaluation de la readiness d'un Pod, Lorsque les conteneurs d'un Pod sont prêts mais qu'au moins une condition particulière
une nouvelle condition de Pod `ContainersReady` est introduite pour capturer est manquante ou `False`, le kubelet renseigne la condition du Pod à `ContainersReady`.
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](/docs/reference/command-line-tools-reference/feature-gates/) `PodReadinessGates` ## Politique de redémarrage
à true.
Avec K8s 1.12, la fonctionnalité est activée par défaut.
## Restart policy
La structure PodSpec a un champ `restartPolicy` avec comme valeur possible La structure PodSpec a un champ `restartPolicy` avec comme valeur possible
Always, OnFailure et Never. La valeur par défaut est Always. Always, OnFailure et Never. La valeur par défaut est Always.
@@ -267,33 +283,30 @@ une fois attaché à un nœud, un Pod ne sera jamais rattaché à un autre nœud
## Durée de vie d'un Pod ## Durée de vie d'un Pod
En général, un Pod ne disparaît pas avant que quelqu'un le détruise. Ceci peut être En général, les Pods restent jusqu'à ce qu'un humain ou un process de
un humain ou un contrôleur. La seule exception à cette règle est pour les Pods ayant {{< glossary_tooltip term_id="controller" text="controller" >}} les supprime explicitement.
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 : Le plan de contrôle nettoie les Pods terminés (avec une phase à `Succeeded` ou
`Failed`), lorsque le nombre de Pods excède le seuil configuré
(determiné par `terminated-pod-gc-threshold` dans le kube-controller-manager).
Ceci empêche une fuite de ressources lorsque les Pods sont créés et supprimés au fil du temps.
- Utilisez un [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) pour des Il y a différents types de ressources pour créer des Pods :
Pods qui doivent se terminer, par exemple des calculs par batch. Les Jobs sont appropriés
- Utilisez un {{< glossary_tooltip term_id="deployment" >}},
{{< glossary_tooltip term_id="replica-set" >}} ou {{< glossary_tooltip term_id="statefulset" >}}
pour les Pods qui ne sont pas censés terminer, par exemple des serveurs web.
- Utilisez un {{< glossary_tooltip term_id="job" >}}
pour les Pods qui sont censés se terminer une fois leur tâche accomplie. Les Jobs sont appropriés
seulement pour des Pods ayant `restartPolicy` égal à OnFailure ou Never. seulement pour des Pods ayant `restartPolicy` égal à OnFailure ou Never.
- Utilisez un [ReplicationController](/docs/concepts/workloads/controllers/replicationcontroller/), - Utilisez un {{< glossary_tooltip term_id="daemonset" >}}
[ReplicaSet](/docs/concepts/workloads/controllers/replicaset/) ou pour les Pods qui doivent s'exécuter un par noeud éligible.
[Deployment](/docs/concepts/workloads/controllers/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](/docs/concepts/workloads/controllers/daemonset/) pour des Pods Toutes les ressources de charges de travail contiennent une PodSpec. Il est recommandé de créer
qui doivent s'exécuter une fois par machine, car ils fournissent un service système la ressource de charges de travail appropriée et laisser le contrôleur de la ressource créer les Pods
au niveau de la machine. pour vous, plutôt que de créer directement les Pods vous-même.
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 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. une politique pour mettre la `phase` de tous les Pods du nœud perdu à Failed.
@@ -391,7 +404,7 @@ spec:
[attacher des handlers à des événements de cycle de vie d'un conteneur](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). [attacher des handlers à des événements de cycle de vie d'un conteneur](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/).
* Apprenez par la pratique * Apprenez par la pratique
[configurer des liveness et readiness probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/). [configurer des liveness, readiness et startup probes](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/).
* En apprendre plus sur les [hooks de cycle de vie d'un Conteneur](/docs/concepts/containers/container-lifecycle-hooks/). * En apprendre plus sur les [hooks de cycle de vie d'un Conteneur](/docs/concepts/containers/container-lifecycle-hooks/).