본문 바로가기

Programming/Infra

[Kubernetes] Pod의 종료 사이클과 Graceful Shutdown (with nginx & spring boot)

눈에 보이지 않는건 언제나 검증이 어렵고 이해하기 힘들다.

Kubernets의 경우 로그 파악하기가 쉽지도 않고, 자동으로 처리해주는 것이 많아 이해하기 어려웠다.

 

Kubernetes의 Pod 종료 사이클과 Spring Boot, Nginx의 Graceful Shutdown을 이해한대로 정리해보자.

 

쿠버네티스 환경에서는 많은 이유로 충돌이 발생하고, 때때로 Auth Scaling으로 Pod이 늘어나고 줄어드는 경우가 허다하다.

따라서 이러한 쿠버네티스 환경에서 Pod이 Graceful하게 종료되는 것은 중요하다.

 

Graceful Shutdown에 관한 내용은 여기서 확인할 수 있다.

 

Kubernets 환경에서의 Graceful Shutdown

내가 만약 로컬이나 EC2와 같은 서버에 Spring Boot만 띄운 상황이라면 Graceful Shutdown을 구현하는 것은 간단하다.

그냥 Spring Boot 설정에서 Graceful Shutdown 설정(server.shutdown=graceful)을 켜주고 SIGTERM 신호를 전달해 종료시키면, 우아하게 종료된다.

 

하지만, Kubernetes환경의 운용서버는 이렇게 단일 Pod 또는 단일 서버가 띄어져있을리 없다.

보통 로드밸런싱 역할을 하는 Service 리소스가 앞단에 존재하고, 그 Service에 붙어있는 수많은 Pod이 존재할 것이다.

그 많은 Pod이 종료되는 과정과 Graceful Shutdown을 순서대로 살펴보자.

 

 

1. Pod이 SIGTERM 신호를 받는다.

  • 개발자가 직접 pod delete 명령어를 입력하거나, 알수없는 이유로 Pod이 종료될 때 SIGTERM 신호를 받는다.

2. Pod이 SIGTERM 신호를 받으면 Termination 상태로 변경되고, Termination 상태가 된 Pod은 Service의 로드밸런싱 대상에서 제외된다.

  • 로드 밸런싱 대상에서 제외됐으므로 더이상 해당 Pod으로 트래픽이 전달되지 않는다.

3. preStop Hook을 구현됐다면 preStop이 실행된다.

  • Pod안에 띄어져있는 애플리케이션이 SIGTERM신호를 받았을 때, Graceful Shutdown을 지원하지 않는 애플리케이션이라면, preStop을 설정해 구현해줘야 한다.
  • Spring Boot는 기본적으로 Graceful Shutdown을 지원하지 않지만, 위에서 설명한 것처럼 설정을 추가하면 Graceful Shutdown을 지원하므로 따로 preStop을 구현할 필요는 없다.
  • Nginx의 경우에 자동으로 Graceful Shutdown을 지원하지 않으므로, preStop에 nginx -s quit 와 같은 설정이 필요하다.

4. Kubernets는 설정된 grace period동안 기다린다.

  • 헷갈리면 안되는 점이 Kubernetes는 Pod에게 SIGTERM신호를 주고 어떠한 작업을 해주지 않는다. 단지 설정된 grace period동안 기다릴 뿐이다.
  • 만약, grace period 안에 Pod이 모두 정상적으로 종료됐다면, grace period를 모두 기다리지 않고 즉시 종료된다.
  • 또 하나 주의할 점은, preStop의 작업을 기다려주지 않는다는 것이다. grace period 시간이 지나면, preStop에 설정된 작업이 진행중이더라도 강제 종료된다.

5. grace period가 끝나면 Pod에 SIGKILL 신호를 보내 강제 종료시킨다.

 

 

 

여기까지 Pod의 종료 사이클과 Graceful Shutdown을 설정하는 방법을 정리했다. 다음에 기회가 된다면 Pod이 생성되는 사이클도 이해하고 정리하는 시간을...

 

 

 

 

혹시나 잘못된 점이 있다면 댓글 부탁드리겠습니다.

 

 

 

 

참고링크

- https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace