|
| 1 | +--- |
| 2 | +title: Hooks de Ciclo de Vida do Contêiner |
| 3 | +content_type: concept |
| 4 | +weight: 30 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +Essa página descreve como os contêineres gerenciados pelo _kubelet_ podem usar a estrutura de _hook_ de ciclo de vida do contêiner para executar código acionado por eventos durante seu ciclo de vida de gerenciamento. |
| 10 | + |
| 11 | + |
| 12 | +<!-- body --> |
| 13 | + |
| 14 | +## Visão Geral |
| 15 | + |
| 16 | +Análogo a muitas estruturas de linguagem de programação que tem _hooks_ de ciclo de vida de componentes, como angular, |
| 17 | +o Kubernetes fornece aos contêineres _hooks_ de ciclo de vida. |
| 18 | +Os _hooks_ permitem que os contêineres estejam cientes dos eventos em seu ciclo de vida de gerenciamento |
| 19 | +e executem código implementado em um manipulador quando o _hook_ de ciclo de vida correspondente é executado. |
| 20 | + |
| 21 | +## Hooks do contêiner |
| 22 | + |
| 23 | +Existem dois _hooks_ que são expostos para os contêiners: |
| 24 | + |
| 25 | +`PostStart` |
| 26 | + |
| 27 | +Este _hook_ é executado imediatamente após um contêiner ser criado. |
| 28 | +Entretanto, não há garantia que o _hook_ será executado antes do ENTRYPOINT do contêiner. |
| 29 | +Nenhum parâmetro é passado para o manipulador. |
| 30 | + |
| 31 | +`PreStop` |
| 32 | + |
| 33 | +Esse _hook_ é chamado imediatamente antes de um contêiner ser encerrado devido a uma solicitação de API ou um gerenciamento de evento como liveness/startup probe failure, preemption, resource contention e outros. |
| 34 | +Uma chamada ao _hook_ `PreStop` falha se o contêiner já está em um estado finalizado ou concluído e o _hook_ deve ser concluído antes que o sinal TERM seja enviado para parar o contêiner. A contagem regressiva do período de tolerância de término do Pod começa antes que o _hook_ `PreStop` seja executado, portanto, independentemente do resultado do manipulador, o contêiner será encerrado dentro do período de tolerância de encerramento do Pod. Nenhum parâmetro é passado para o manipulador. |
| 35 | + |
| 36 | +Uma descrição mais detalhada do comportamento de término pode ser encontrada em [Término de Pods](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination). |
| 37 | + |
| 38 | +### Implementações de manipulador de hook |
| 39 | + |
| 40 | +Os contêineres podem acessar um _hook_ implementando e registrando um manipulador para esse _hook_. |
| 41 | +Existem dois tipos de manipuladores de _hooks_ que podem ser implementados para contêineres: |
| 42 | + |
| 43 | +* Exec - Executa um comando específico, como `pre-stop.sh`, dentro dos cgroups e Namespaces do contêiner. |
| 44 | +* HTTP - Executa uma requisição HTTP em um endpoint específico do contêiner. |
| 45 | + |
| 46 | +### Execução do manipulador de hook |
| 47 | + |
| 48 | + |
| 49 | +Quando um _hook_ de gerenciamento de ciclo de vida do contêiner é chamado, o sistema de gerenciamento do Kubernetes executa o manipulador de acordo com a ação do _hook_, `httpGet` e `tcpSocket` são executados pelo processo kubelet e `exec` é executado pelo contêiner. |
| 50 | + |
| 51 | +As chamadas do manipulador do _hook_ são síncronas no contexto do Pod que contém o contêiner. |
| 52 | +Isso significa que para um _hook_ `PostStart`, o ENTRYPOINT do contêiner e o _hook_ disparam de forma assíncrona. |
| 53 | +No entanto, se o _hook_ demorar muito para ser executado ou travar, o contêiner não consegue atingir o estado `running`. |
| 54 | + |
| 55 | + |
| 56 | +Os _hooks_ `PreStop` não são executados de forma assíncrona a partir do sinal para parar o contêiner, o _hook_ precisa finalizar a sua execução antes que o sinal TERM possa ser enviado. |
| 57 | +Se um _hook_ `PreStop` travar durante a execução, a fase do Pod será `Terminating` e permanecerá até que o Pod seja morto após seu `terminationGracePeriodSeconds` expirar. Esse período de tolerância se aplica ao tempo total necessário |
| 58 | +para o _hook_ `PreStop`executar e para o contêiner parar normalmente. |
| 59 | +Se por exemplo, o `terminationGracePeriodSeconds` é 60, e o _hook_ leva 55 segundos para ser concluído, e o contêiner leva 10 segundos para parar normalmente após receber o sinal, então o contêiner será morto antes que possa parar |
| 60 | +normalmente, uma vez que o `terminationGracePeriodSeconds` é menor que o tempo total (55 + 10) que é necessário para que essas duas coisas aconteçam. |
| 61 | + |
| 62 | +Se um _hook_ `PostStart` ou `PreStop` falhar, ele mata o contêiner. |
| 63 | + |
| 64 | +Os usuários devem tornar seus _hooks_ o mais leve possíveis. |
| 65 | +Há casos, no entanto, em que comandos de longa duração fazem sentido, como ao salvar o estado |
| 66 | +antes de parar um contêiner. |
| 67 | + |
| 68 | +### Garantias de entrega de _hooks_ |
| 69 | + |
| 70 | +A entrega do _hook_ é destinada a acontecer *pelo menos uma vez*, |
| 71 | +o que quer dizer que um _hook_ pode ser chamado várias vezes para qualquer evento, |
| 72 | +como para `PostStart` ou `PreStop`. |
| 73 | +Depende da implementação do _hook_ lidar com isso corretamente. |
| 74 | + |
| 75 | +Geralmente, apenas entregas únicas são feitas. |
| 76 | +Se, por exemplo, um receptor de _hook_ HTTP estiver inativo e não puder receber tráfego, |
| 77 | +não há tentativa de reenviar. |
| 78 | +Em alguns casos raros, no entanto, pode ocorrer uma entrega dupla. |
| 79 | +Por exemplo, se um kubelet reiniciar no meio do envio de um _hook_, o _hook_ pode ser |
| 80 | +reenviado depois que o kubelet voltar a funcionar. |
| 81 | + |
| 82 | +### Depurando manipuladores de _hooks_ |
| 83 | + |
| 84 | +Os logs para um manipulador de _hook_ não são expostos em eventos de Pod. |
| 85 | +Se um manipulador falhar por algum motivo, ele transmitirá um evento. |
| 86 | +Para `PostStart` é o evento `FailedPostStartHook` e para `PreStop` é o evento |
| 87 | +`FailedPreStopHook`. |
| 88 | +Você pode ver esses eventos executando `kubectl describe pod <nome_do_pod>`. |
| 89 | +Aqui está um exemplo de saída de eventos da execução deste comando: |
| 90 | + |
| 91 | +``` |
| 92 | +Events: |
| 93 | + FirstSeen LastSeen Count From SubObjectPath Type Reason Message |
| 94 | + --------- -------- ----- ---- ------------- -------- ------ ------- |
| 95 | + 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned test-1730497541-cq1d2 to gke-test-cluster-default-pool-a07e5d30-siqd |
| 96 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulling pulling image "test:1.0" |
| 97 | + 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] |
| 98 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Pulled Successfully pulled image "test:1.0" |
| 99 | + 1m 1m 1 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Normal Started Started container with docker id 5c6a256a2567 |
| 100 | + 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 |
| 101 | + 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 |
| 102 | + 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" |
| 103 | + 1m 22s 2 {kubelet gke-test-cluster-default-pool-a07e5d30-siqd} spec.containers{main} Warning FailedPostStartHook |
| 104 | +``` |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | +## {{% heading "whatsnext" %}} |
| 109 | + |
| 110 | + |
| 111 | +* Saiba mais sobre o [Ambiente de contêiner](/docs/concepts/containers/container-environment/). |
| 112 | +* Obtenha experiência prática |
| 113 | + [anexando manipuladores a eventos de ciclo de vida do contêiner](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). |
| 114 | + |
0 commit comments