|
| 1 | +--- |
| 2 | +title: Container Lifecycle Hooks |
| 3 | +content_type: concept |
| 4 | +weight: 30 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | +Questa pagina descrive come i Container gestiti con kubelet possono utilizzare il lifecycle |
| 9 | +hook framework dei Container per l'esecuzione di codice eseguito in corrispondenza di alcuni |
| 10 | +eventi durante il loro ciclo di vita. |
| 11 | + |
| 12 | +<!-- body --> |
| 13 | + |
| 14 | +## Overview |
| 15 | + |
| 16 | +Analogamente a molti framework di linguaggi di programmazione che hanno degli hooks legati al ciclo di |
| 17 | +vita dei componenti, come ad esempio Angular, Kubernetes fornisce ai Container degli hook legati al loro ciclo di |
| 18 | +vita dei Container. |
| 19 | +Gli hook consentono ai Container di essere consapevoli degli eventi durante il loro ciclo di |
| 20 | +gestione ed eseguire del codice implementato in un handler quando il corrispondente hook viene |
| 21 | +eseguito. |
| 22 | + |
| 23 | +## Container hooks |
| 24 | + |
| 25 | +Esistono due tipi di hook che vengono esposti ai Container: |
| 26 | + |
| 27 | +`PostStart` |
| 28 | + |
| 29 | +Questo hook viene eseguito successivamente alla creazione del container. |
| 30 | +Tuttavia, non vi è garanzia che questo hook venga eseguito prima dell'ENTRYPOINT del container. |
| 31 | +Non vengono passati parametri all'handler. |
| 32 | + |
| 33 | +`PreStop` |
| 34 | + |
| 35 | +Questo hook viene eseguito prima della terminazione di un container a causa di una richiesta API o |
| 36 | +di un evento di gestione, come ad esempio un fallimento delle sonde di liveness/startup, preemption, |
| 37 | +risorse contese e altro. Una chiamata all'hook di `PreStop` fallisce se il container è in stato |
| 38 | +terminated o completed e l'hook deve finire prima che possa essere inviato il segnale di TERM per |
| 39 | +fermare il container. Il conto alla rovescia per la terminazione del Pod (grace period) inizia prima dell'esecuzione |
| 40 | +dell'hook `PreStop`, quindi indipendentemente dall'esito dell'handler, il container terminerà entro |
| 41 | +il grace period impostato. Non vengono passati parametri all'handler. |
| 42 | + |
| 43 | +Una descrizione più dettagliata riguardante al processo di terminazione dei Pod può essere trovata in |
| 44 | +[Terminazione dei Pod](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination). |
| 45 | + |
| 46 | +### Implementazione degli hook handler |
| 47 | + |
| 48 | +I Container possono accedere a un hook implementando e registrando un handler per tale hook. |
| 49 | +Ci sono due tipi di handler che possono essere implementati per i Container: |
| 50 | + |
| 51 | +* Exec - Esegue un comando specifico, tipo `pre-stop.sh`, all'interno dei cgroup e namespace del Container. |
| 52 | +Le risorse consumate dal comando vengono contate sul Container. |
| 53 | +* HTTP - Esegue una richiesta HTTP verso un endpoint specifico del Container. |
| 54 | + |
| 55 | +### Esecuzione dell'hook handler |
| 56 | + |
| 57 | +Quando viene richiamato l'hook legato al lifecycle del Container, il sistema di gestione di Kubernetes |
| 58 | +esegue l'handler secondo l'azione dell'hook, `httpGet` e `tcpSocket` vengono eseguiti dal processo kubelet, |
| 59 | +mentre `exec` è eseguito nel Container. |
| 60 | + |
| 61 | +Le chiamate agli handler degli hook sono sincrone rispetto al contesto del Pod che contiene il Container. |
| 62 | +Questo significa che per un hook `PostStart`, l'ENTRYPOINT e l'hook si attivano in modo asincrono. |
| 63 | +Tuttavia, se l'hook impiega troppo tempo per essere eseguito o si blocca, il container non può raggiungere lo |
| 64 | +stato di `running`. |
| 65 | + |
| 66 | +Gli hook di `PreStop` non vengono eseguiti in modo asincrono dall'evento di stop del container; l'hook |
| 67 | +deve completare la sua esecuzione prima che l'evento TERM possa essere inviato. Se un hook di `PreStop` |
| 68 | +si blocca durante la sua esecuzione, la fase del Pod rimarrà `Terminating` finchè il Pod non sarà rimosso forzatamente |
| 69 | +dopo la scadenza del suo `terminationGracePeriodSeconds`. Questo grace period si applica al tempo totale |
| 70 | +necessario per effettuare sia l'esecuzione dell'hook di `PreStop` che per l'arresto normale del container. |
| 71 | +Se, per esempio, il `terminationGracePeriodSeconds` è di 60, e l'hook impiega 55 secondi per essere completato, |
| 72 | +e il container impiega 10 secondi per fermarsi normalmente dopo aver ricevuto il segnale, allora il container |
| 73 | +verrà terminato prima di poter completare il suo arresto, poiché `terminationGracePeriodSeconds` è inferiore al tempo |
| 74 | +totale (55+10) necessario perché queste due cose accadano. |
| 75 | + |
| 76 | +Se un hook `PostStart` o `PreStop` fallisce, allora il container viene terminato. |
| 77 | + |
| 78 | +Gli utenti dovrebbero mantenere i loro handler degli hook i più leggeri possibili. |
| 79 | +Ci sono casi, tuttavia, in cui i comandi di lunga durata hanno senso, |
| 80 | +come il salvataggio dello stato del container prima della sua fine. |
| 81 | + |
| 82 | +### Garanzia della chiamata dell'hook |
| 83 | + |
| 84 | +La chiamata degli hook avviene *almeno una volta*, il che significa |
| 85 | +che un hook può essere chiamato più volte da un dato evento, come per `PostStart` |
| 86 | +o `PreStop`. |
| 87 | +Sta all'implementazione dell'hook gestire correttamente questo aspetto. |
| 88 | + |
| 89 | +Generalmente, vengono effettuate singole chiamate agli hook. |
| 90 | +Se, per esempio, la destinazione di hook HTTP non è momentaneamente in grado di ricevere traffico, |
| 91 | +non c'è alcun tentativo di re invio. |
| 92 | +In alcuni rari casi, tuttavia, può verificarsi una doppia chiamata. |
| 93 | +Per esempio, se un kubelet si riavvia nel mentre dell'invio di un hook, questo potrebbe essere |
| 94 | +chiamato per una seconda volta dopo che il kubelet è tornato in funzione. |
| 95 | + |
| 96 | +### Debugging Hook handlers |
| 97 | + |
| 98 | +I log di un handler di hook non sono esposti negli eventi del Pod. |
| 99 | +Se un handler fallisce per qualche ragione, trasmette un evento. |
| 100 | +Per il `PostStart`, questo è l'evento di `FailedPostStartHook`, |
| 101 | +e per il `PreStop`, questo è l'evento di `FailedPreStopHook`. |
| 102 | +Puoi vedere questi eventi eseguendo `kubectl describe pod <pod_name>`. |
| 103 | +Ecco alcuni esempi di output di eventi dall'esecuzione di questo comando: |
| 104 | + |
| 105 | +``` |
| 106 | +Events: |
| 107 | + FirstSeen LastSeen Count From SubObjectPath Type Reason Message |
| 108 | + --------- -------- ----- ---- ------------- -------- ------ ------- |
| 109 | + 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned test-1730497541-cq1d2 to gke-test-cluster-default-pool-a07e5d30-siqd |
| 110 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulling pulling image "test:1.0" |
| 111 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Created Created container with docker id 5c6a256a2567; Security:[seccomp=unconfined] |
| 112 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulled Successfully pulled image "test:1.0" |
| 113 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Started Started container with docker id 5c6a256a2567 |
| 114 | + 38s 38s 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Killing Killing container with docker id 5c6a256a2567: PostStart handler: Error executing in Docker Container: 1 |
| 115 | + 37s 37s 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Killing Killing container with docker id 8df9fdfd7054: PostStart handler: Error executing in Docker Container: 1 |
| 116 | + 38s 37s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "main" with RunContainerError: "PostStart handler: Error executing in Docker Container: 1" |
| 117 | + 1m 22s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Warning FailedPostStartHook |
| 118 | +``` |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | +## {{% heading "whatsnext" %}} |
| 123 | + |
| 124 | + |
| 125 | +* Approfondisci [Container environment](/docs/concepts/containers/container-environment/). |
| 126 | +* Esegui un tutorial su come |
| 127 | + [definire degli handlers per i Container lifecycle events](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). |
| 128 | + |
0 commit comments