A importância do Graceful Shutdown em ambientes de contêineres e como implementá-lo no Kubernetes e no Spring Boot
O Graceful Shutdown é uma prática importante para garantir que os aplicativos sejam encerrados de forma controlada e sem perda de dados. Isso é especialmente importante em ambientes de contêineres, como o Kubernetes, onde os aplicativos podem ser interrompidos a qualquer momento.
Neste post, vamos explorar como configurar o Graceful Shutdown no Kubernetes e no Spring Boot.
Graceful Shutdown no Kubernetes
O Kubernetes tem suporte nativo para o Graceful Shutdown, permitindo que os aplicativos sejam encerrados de forma controlada e sem perda de dados.
O Kubernetes tem um valor padrão para o Graceful Shutdown, que é de 30 segundos. Isso significa que, se você não especificar um período de tolerância de encerramento no arquivo de manifesto do Kubernetes para um pod, o Kubernetes esperará 30 segundos antes de encerrar o pod completamente.
O período de tolerância de encerramento é definido pela propriedade
no arquivo de manifesto do Kubernetes. Se você definir essa propriedade como zero, o Kubernetes encerrará o pod imediatamente sem esperar por um período de tolerância.terminationGracePeriodSeconds
No entanto, é importante observar que o tempo de encerramento pode variar dependendo do aplicativo e dos recursos que ele usa. Por exemplo, se o aplicativo estiver realizando operações de longa duração ou estiver aguardando solicitações de entrada/saída, pode ser necessário aumentar o tempo de tolerância de encerramento para garantir que as operações sejam concluídas com segurança antes do encerramento completo do pod.
Por isso, é sempre importante configurar o período de tolerância de encerramento de acordo com as necessidades do seu aplicativo e as características dos recursos que ele usa.
Para configurar o Graceful Shutdown no Kubernetes, siga estas etapas:
Adicione a seguinte configuração ao arquivo de manifesto do Kubernetes para o pod correspondente:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
terminationGracePeriodSeconds: 60
Neste exemplo, estamos definindo um período de tolerância de 60 segundos antes que o pod seja completamente encerrado. Durante esse período, o Kubernetes tentará encerrar o pod de forma controlada, permitindo que os aplicativos interrompam suas operações de forma segura.
É possível adicionarum comando de shutdown personalizado ao container do aplicativo:
spec:
containers:
- name: my-app
image: my-app:latest
lifecycle:
preStop:
exec:
command: ["sh", "-c", "kill -SIGTERM $(cat /var/run/my-app.pid)"]
Neste exemplo, estamos adicionando um comando de shutdown personalizado que envia um sinal SIGTERM para o processo do aplicativo.
Graceful Shutdown no Spring Boot
O Spring Boot também tem suporte para o Graceful Shutdown, permitindo que os aplicativos sejam encerrados de forma controlada e sem perda de dados.
Para configurar o Graceful Shutdown no Spring Boot, siga estas etapas:
-
Adicione a dependência do Spring Boot Actuator ao arquivo pom.xml ou build.gradle:
Para Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Para Gradle:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
Adicione a seguinte configuração ao arquivo application.properties ou application.yml:
Para application.properties:
server.shutdown=graceful
Para application.yml:
server:
shutdown: graceful
O Spring Boot tem um tempo padrão para o Graceful Shutdown, que é de 30 segundos. Isso significa que, se você não especificar um tempo limite de encerramento personalizado no arquivo de configuração do Spring Boot, o Spring Boot esperará 30 segundos antes de encerrar o aplicativo completamente.
O tempo limite de encerramento é definido pela propriedade
no arquivo de configuração do Spring Boot. Se você definir essa propriedade como zero, o Spring Boot encerrará o aplicativo imediatamente sem esperar por um período de tolerância.spring.lifecycle.timeout-per-shutdown-phase
No entanto, assim como no Kubernetes, o tempo de encerramento pode variar dependendo do aplicativo.
Por isso, é sempre importante configurar o tempo limite de encerramento de acordo com as necessidades do seu aplicativo e as características dos recursos que ele usa. Felizmente, o Spring Boot torna fácil configurar o tempo limite de encerramento personalizado para o Graceful Shutdown.
Para application.properties:
spring.lifecycle.timeout-per-shutdown-phase=60s
Para application.yml:
spring:
lifecycle:
timeout-per-shutdown-phase: 60s
Neste exemplo, estamos definindo um tempo limite de 60 segundos para a fase de encerramento do aplicativo.
Conclusão
Em resumo, o Graceful Shutdown é uma prática importante que garante que os aplicativos sejam encerrados de forma controlada e sem perda de dados.
No Kubernetes, é possível configurar o período de tolerância de encerramento no arquivo de manifesto do pod, enquanto no Spring Boot, é possível adicionar uma dependência e definir o tempo limite de encerramento no arquivo de configuração do aplicativo.
É sempre importante configurar o tempo limite de encerramento de acordo com as necessidades do seu aplicativo e as características dos recursos que ele usa, garantindo assim a conclusão segura de todas as operações em andamento.