Se você tem familiaridade com Kubernetes e precisa executar ações específicas antes que os contêineres da sua aplicação iniciem ou parem, como implantar recursos ou realizar um desligamento graceful, configure o gerenciamento do ciclo de vida da aplicação. Este tópico descreve como configurar PostStart, PreStop e TerminationGracePeriodSeconds para suas aplicações no Serverless App Engine (SAE).
Visão geral
-
Um pod hook (ou container hook), gerenciado pelo componente kubelet do Kubernetes, executa tarefas personalizadas em etapas fundamentais do ciclo de vida de um contêiner. Essas etapas incluem o momento anterior ao início do processo do contêiner (PostStart) e o momento anterior ao seu encerramento (PreStop). Os hooks permitem que o Kubernetes gerencie o ciclo de vida do contêiner com mais flexibilidade e precisão. Para obter mais informações, consulte Container Lifecycle Hooks.
PostStart: Hook de ciclo de vida executado imediatamente após a criação de um contêiner para notificá-lo sobre esse evento. Nenhum parâmetro é passado ao handler do hook. Se o handler falhar, o contêiner será encerrado e reiniciado conforme sua política de reinicialização.
PreStop: Hook de ciclo de vida acionado antes do encerramento de um contêiner, geralmente usado para executar tarefas de limpeza ou realizar um desligamento graceful. O handler do hook deve concluir sua execução antes que o Kubernetes envie um sinal de encerramento (como SIGTERM) ao contêiner. Independentemente do resultado do handler, assim que ele for concluído, o Kubernetes envia o sinal SIGTERM e aguarda um período especificado antes de encerrar o contêiner à força.
TerminationGracePeriodSeconds: Esta configuração define o período de carência para o encerramento de um contêiner, permitindo que ele conclua as operações de limpeza e desligamento antes de ser parado à força. Isso melhora a estabilidade ao evitar problemas como perda de dados, falhas em requisições e indisponibilidade de serviço causados por encerramentos abruptos. Quando combinado com um hook PreStop, possibilita um processo completo de desligamento graceful.
Pontos de entrada
O ponto de entrada varia conforme o cenário:
Crie uma aplicação
Faça logon no console do SAE. No painel de navegação à esquerda, escolha . Selecione uma região e um namespace e clique em Create Application.
Na página do assistente Basic Information, configure os parâmetros necessários e clique em Next: Advanced Settings.
Na página Advanced Settings, localize e expanda a seção Application Lifecycle Management.
Modifique uma aplicação em execução
A reimplantação de uma aplicação a reinicia. Para evitar interrupções no serviço, realize as implantações fora dos horários de pico.
Faça logon no console do SAE. No painel de navegação à esquerda, escolha . Selecione a região e o namespace e clique no nome da sua aplicação.
Na página Basic Information da aplicação, clique em Deploy Application.
Na página Deploy Application, localize e expanda a seção Application Lifecycle Management.
Modifique uma aplicação parada
Faça logon no console do SAE. No painel de navegação à esquerda, escolha . Selecione a região e o namespace e clique no nome da sua aplicação.
Na página Basic Information da aplicação, clique em Modify Application Configurations.
Na página Modify Application Configurations, localize e expanda a seção Application Lifecycle Management.
Procedimento
Na seção Application Lifecycle Management, configure PostStart, PreStop e TerminationGracePeriodSeconds conforme necessário.
Recomendamos configurar todas as três definições para estabelecer um ciclo completo de gerenciamento do ciclo de vida dos seus contêineres, garantindo inicialização e desligamento suaves dos serviços, liberação ordenada de recursos e operações sem tempo de inatividade.
PostStart
Na seção Application Lifecycle Management, configure o hook PostStart na aba PostStart.
O SAE fornece dois interpretadores de shell:
>_ /bin/sh
>_ /bin/bash
Por exemplo, antes que a aplicação inicie, grave o conteúdo Hello from the postStart handler no arquivo /usr/share/message.
Selecione >_/bin/sh e insira o seguinte comando no editor de código: echo "Hello from the postStart handler" > /usr/share/message.
Em um ambiente de produção, configure as definições com base nos requisitos do seu negócio. O exemplo fornecido neste tópico serve apenas para verificação mínima e não deve ser usado em ambiente de produção.
Verifique o resultado:
Após criar ou reimplantar a aplicação, use o Webshell para abrir o terminal da instância e verifique se o arquivo /usr/share/message existe e contém o conteúdo esperado.
[~]$cat /usr/share/message
Hello from the postStart handler
[~]$
PreStop
Na seção Application Lifecycle Management, configure o hook PreStop na aba PreStop.
O SAE fornece dois interpretadores de shell:
>_ /bin/sh
>_ /bin/bash
Por exemplo, antes que o contêiner seja encerrado, execute um script para gravar Perform cleanup no arquivo /cleanup.log e aguarde 100 segundos para verificação.
Em um ambiente de produção, configure as definições com base nos requisitos do seu negócio. O exemplo fornecido neste tópico serve apenas para verificação mínima e não deve ser usado em ambiente de produção.
Selecione >_/bin/sh e insira o seguinte comando no editor de código: echo "Perform cleanup" > /cleanup.log && sleep 100.
Verifique o resultado:
Na página Basic Information da aplicação, clique em Stop Application. Em seguida, use o Webshell para abrir o terminal da instância e verifique se o arquivo /cleanup.log existe e contém o conteúdo esperado.
[/]$cat /cleanup.log
Perform cleanup
[/]$
TerminationGracePeriodSeconds
Na seção Application Lifecycle Management, na aba TerminationGracePeriodSeconds, defina o tempo limite de desligamento graceful como 60 segundos.
Se o tempo limite de desligamento graceful for menor que o tempo necessário para o contêiner encerrar de forma graceful, o contêiner será terminado à força (Signal: SIGKILL, exit code: 137). Esse tempo necessário inclui tanto a execução do hook PreStop quanto o tratamento do sinal SIGTERM pelo contêiner. Por exemplo, se o contêiner precisar de 100 segundos para encerrar de forma graceful, mas o tempo limite estiver definido como 60 segundos, o contêiner será eliminado antes que seu encerramento graceful possa ser concluído.
Verifique o resultado:
Neste exemplo, o tempo limite de desligamento graceful é intencionalmente definido como menor que o tempo de desligamento graceful do contêiner para fins de verificação.
Na página Basic Information da aplicação, clique em Stop Application. Em seguida, use o Webshell para abrir o terminal da instância e verifique se o contêiner reporta o código de saída 137.
Durante o desligamento graceful, o contêiner permanece no estado Terminating até que o tempo limite configurado expire.
[/]${"metadata":{},"status":"Failure","message":"command terminated with non-zero exit code: error executing command [env COLUMNS=137 ROWS=46 LINES=46 /bin/sh -i -c /bin/bash || clear;/bin/sh], exit code 137","reason":"NonZeroExitCode","details":{"causes":[{"reason":"ExitCode","message":"137"}]}}