A importância do Graceful Shutdown em ambientes de contêineres e como implementá-lo no Kubernetes e no Spring Boot

Por Gaspar Barancelli Junior em 04 de abril de 2024

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 terminationGracePeriodSeconds 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.

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:

  1. 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 spring.lifecycle.timeout-per-shutdown-phase 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.

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.

// Compartilhe esse Post