Prevent Spring Boot application closing until all current requests are finished Prevent Spring Boot application closing until all current requests are finished kubernetes kubernetes

Prevent Spring Boot application closing until all current requests are finished


You could increase the terminationGracePeriodSeconds, the default is 30 seconds. But unfortunately, there's nothing to prevent a cluster admin from force deleting your pod, and there's all sorts of reasons the whole node could go away.


We did a combination of the above to resolve our problem.

  • increased the terminationGracePeriodSeconds to the absolute maximum we expect to see in production
  • added livenessProbe to prevent Traefik routing to our pod too soon
  • introduced a pre-stop hook injecting a pause and invoking a monitoring script:
    1. Monitored netstat for ESTABLISHED connections to our process (pid 1) with a Foreign Address of our cluster Traefik service
    2. sent TERM to pid 1

Note that because we send TERM to pid 1 from the monitoring script the pod will terminate at this point and the terminationGracePeriodSeconds never gets hit (it's there as a precaution)

Here's the script:

#!/bin/shwhile [ "$(/bin/netstat -ap 2>/dev/null | /bin/grep http-alt.*ESTABLISHED.*1/java | grep -c traefik-ingress-service)" -gt 0 ]do  sleep 1donekill -TERM 1

Here's the new pod spec:

containers:  - env:    - name: spring_profiles_active      value: dev    image: container.registry.host/project/app:@@version@@    imagePullPolicy: Always    lifecycle:      preStop:        exec:          command:          - /bin/sh          - -c          - sleep 5 && /monitoring.sh    livenessProbe:      httpGet:        path: /actuator/health        port: 8080      initialDelaySeconds: 60      periodSeconds: 20      timeoutSeconds: 3    name: app    ports:    - containerPort: 8080    readinessProbe:      httpGet:        path: /actuator/health        port: 8080      initialDelaySeconds: 60    resources:      limits:        cpu: 2        memory: 2Gi      requests:        cpu: 2        memory: 2Gi  imagePullSecrets:  - name: app-secret  serviceAccountName: vault-auth  terminationGracePeriodSeconds: 86400


Try to Gracefully Shutdown your Spring Boot Application.

This might help :

https://dzone.com/articles/graceful-shutdown-spring-boot-applications

This implementation will make sure that none of your active connections are killed and application will gracefully wait for them to finish before the shutdown.