•
preStop Hook과 terminationGracePeriodSeconds으로 파드가 진행중인 작업을 마치게 종료 설정
컨테이너에서 실행되는 프로세스가 완료된 후 애플리케이션이 정상적으로 종료되는 Graceful Shutdown을 위해서는, 쿠버네티스 파드 설정의 preStop Hook과 terminationGracePeriodSeconds 옵션을 통해 할 수 있다.
preStop Hook
preStop Hook은 파드가 종료를 요청받고 컨테이너가 종료되기 전 실행되는 훅인데, 파드가 종료되기 전 컨테이너에 원하는 커맨드를 실행할 수 있다. 애플리케이션이 일찍 종료되지 않도록 커맨드 부분에 애플리케이션에서 가장 길게 실행되는 프로세스의 완료가 보장되는 최대 시간보다 길게 유휴시간을 갖도록 설정한다. 이 시간을 길게 설정할수록 안정성은 좋아지나 다운되는 시간이 길어지는 트레이드 오프가 생긴다.
terminationGracePeriodSeconds
kubernetes에서 Pod를 안전하게 종료하기 위해 사용하는 설정 값으로, kubelet이 SIGTERM 신호을 보낸 후부터 완전히 종료될 때까지 기다리는 시간(초)이다. 해당 시간이 끝나면 SIGKILL 신호를 보내 Pod를 종료한다.
️ 중요
terminationGracePeriodSeconds 옵션은 preStop 훅과 병렬로 진행되며, 따라서 preStop에서 설정한 시간보다 길게 설정해야 한다. 앞서 50초로 preStop을 설정했다면, preStop 이후 애플리케이션이 SIGTERM 신호로 애플리케이션이 종료되는 시간까지 고려해서 terminationGracePeriodSeconds을 세팅한다. 예를 들어 애플리케이션이 정상적으로 종료되는데 걸리는 시간이 5초라면 terminationGracePeriodSeconds 옵션을 50초보다 긴 55초로 설정하는 등의 전략을 사용할 수 있다. 여러 가지 값들을 설정해 보고 파드를 종료하는 테스트를 통해 최적화하는 것이 좋다.
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
lifecycle:
preStop:
exec:
command:
- sh
- -c
- |
curl localhost:80
sleep 10
curl localhost:80
terminationGracePeriodSeconds: 15
YAML
복사
kubectl apply -f graceful.yaml
k delete pod nginx
# 로그 체크
k logs nginx
Shell
복사
•
추가로, AWS ALB는 idle timeout 시간이 디폴트가 60초이다. 그러므로 AWS ALB를 사용한다면 terminationGracePeriodSeconds을 60 이상으로 설정해야 504 에러를 피할 수 있다.