Undgå, at Spring Boot-applikationen lukker, indtil alle aktuelle anmodninger er afsluttet
Du kan øge terminationGracePeriodSeconds
, standard er 30 sekunder. Men desværre er der intet, der forhindrer en klyngeadministrator i at tvinge sletning af din pod, og der er alle mulige årsager til, at hele noden kan forsvinde.
Vi lavede en kombination af ovenstående for at løse vores problem.
- hævede opsigelsenGracePeriodSeconds til det absolutte maksimum, vi forventer at se i produktionen
- tilføjede livenessProbe for at forhindre Traefik-routing til vores pod for tidligt
- introducerede en pre-stop hook, der injicerer en pause og kalder et overvågningsscript:
- Overvåget netstat for ETABLISTERDE forbindelser til vores proces (pid 1) med en udenlandsk adresse på vores klynge Traefik-tjeneste
- sendte TERM til pid 1
Bemærk, at fordi vi sender TERM til pid 1 fra overvågningsscriptet, vil poden afsluttes på dette tidspunkt, og termineringen GracePeriodSeconds bliver aldrig ramt (den er der som en sikkerhedsforanstaltning)
Her er scriptet:
#!/bin/sh
while [ "$(/bin/netstat -ap 2>/dev/null | /bin/grep http-alt.*ESTABLISHED.*1/java | grep -c traefik-ingress-service)" -gt 0 ]
do
sleep 1
done
kill -TERM 1
Her er den nye pod-specifikation:
containers:
- env:
- name: spring_profiles_active
value: dev
image: container.registry.host/project/app:@@[email protected]@
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