관리 메뉴

피터의 개발이야기

[Kubernetes] Pod의 종료 사이클과 Graceful Shutdown 본문

Kubernetes/기초공부

[Kubernetes] Pod의 종료 사이클과 Graceful Shutdown

기록하는 백앤드개발자 2022. 6. 26. 16:08
반응형

 

 

ㅁ 개요

 Kubernetes환경에서 graceful shutdown의 적용방법을 공부하면서 Kubernetes환경에서 오케스트레이션 작업 중 Pod가 종료되는 과정이 많다. 로드밸런싱 역할을 하는 Service와 속해 있는 Pod 들이 종료하는 과정을 정리하였습니다.

 

 

Kubernetes의 Pod 종료과정

 

1- Pod가 Terminating 상태로 전환되고 새 트래픽 수신을 중지합니다. 컨테이너는 여전히 Pod 내에서 실행 중입니다.

 

2- preStop hook은 특별한 명령이나 HTTP 요청이 실행되어 Pod 내부의 컨테이너로 전송됩니다. Termination 상태가 된 Pod은 Service의 로드밸런싱 대상에서 제외된다. 로드 밸런싱 대상에서 제외됐으므로 더이상 해당 Pod으로 트래픽이 전달되지 않는다.

 

3- SIGTERM 신호가 Pod로 전송되고 컨테이너가 곧 닫힐 것임을 인식합니다. Pod안에 띄어져있는 애플리케이션이 SIGTERM신호를 받았을 때, Graceful Shutdown을 지원하지 않는 애플리케이션이라면, preStop을 설정해 구현해줘야 한다. Spring Boot는 기본적으로 Graceful Shutdown을 지원하지 않지만, 위에서 설명한 것처럼 설정을 추가하면 Graceful Shutdown을 지원하므로 따로 preStop을 구현할 필요는 없다.

 

4- Kubernetes는 유예 기간(terminationGracePeriodSeconds) 을 기다립니다 . 이 대기는 preStop hook 및 SIGTERM 신호 실행과 병렬입니다(기본값 30초). 따라서 Kubernetes는 이러한 작업이 완료될 때까지 기다리지 않습니다. 이 기간이 끝나면 바로 다음 단계로 넘어갑니다. GracePeriod의 값을 올바르게 설정하는 것이 매우 중요합니다.

만약, GracePeriod 기간동안에 Pod이 모두 종료됐다면, GracePeriod를 모두 기다리지 않고 즉시 종료된다.

또 하나 주의할 점은, preStop의 작업을 기다려주지 않는다는 것이다. grace period 시간이 지나면, preStop에 설정된 작업이 진행중이더라도 강제 종료된다.

 

5- SIGKILL 신호가 Pod로 전송되고 Pod가 제거됩니다. GracePeriod 후에도 컨테이너가 계속 실행 중이면 SIGKILL에 의해 Pod가 강제로 제거되고 종료가 완료됩니다.

 

 

ㅁ 함께 보면 좋은 사이트

 

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

눈에 보이지 않는건 언제나 검증이 어렵고 이해하기 힘들다. Kubernets의 경우 로그 파악하기가 쉽지도 않고, 자동으로 처리해주는 것이 많아 이해하기 어려웠다. Kubernetes의 Pod 종료 사이클과 Spring

jobc.tistory.com

 

 

Graceful Shutdown of Spring Boot Applications in Kubernetes

As Trendyol Delivery team, we manage the deployment of our applications in Kubernetes. We have 3 separate Kubernetes clusters and we…

medium.com

 

 

반응형
Comments