Dev/KUBERNETES
쿠버네티스에서 애플리케이션의 PID가 1번일 때 그레이스풀 셧다운 과정
Andrea.K
2024. 8. 27. 23:29
반응형
쿠버네티스에서 애플리케이션의 PID가 1번일 때 그레이스풀 셧다운 과정은 다음과 같이 진행됩니다:
신호 처리:
- 쿠버네티스는 파드를 종료할 때 먼저 SIGTERM 신호를 보냅니다.
- PID 1 프로세스는 기본적으로 SIGTERM을 무시하므로, 애플리케이션에서 이 신호를 명시적으로 처리해야 합니다.
그레이스 기간:
- 쿠버네티스는 SIGTERM 신호를 보낸 후 기본적으로 30초(설정 가능)의 그레이스 기간을 제공합니다.
- 이 기간 동안 애플리케이션은 그레이스풀 셧다운을 수행해야 합니다.
애플리케이션의 책임:
- 신호 캐치: SIGTERM 신호를 캐치하고 처리하는 로직이 필요합니다.
- 셧다운 로직 실행: 진행 중인 작업 완료, 리소스 정리 등을 수행합니다.
- 적시에 종료: 그레이스 기간 내에 종료되어야 합니다.
SIGKILL 처리:
- 그레이스 기간이 끝나도 프로세스가 종료되지 않으면, 쿠버네티스는 SIGKILL을 보냅니다.
- SIGKILL은 무시할 수 없으며, 프로세스를 즉시 종료합니다.
구현 예시 (Go):
func main() { // 애플리케이션 시작 go runApplication() // 신호 처리 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) // SIGTERM 대기 <-sigChan log.Println("그레이스풀 셧다운 시작...") // 그레이스풀 셧다운 로직 gracefulShutdown() log.Println("애플리케이션 종료") } func gracefulShutdown() { // 여기에 셧다운 로직 구현 // 예: 진행 중인 작업 완료, 연결 종료, 리소스 정리 등 }
주의사항:
- 신호 처리 필수: PID 1 프로세스는 반드시 SIGTERM을 명시적으로 처리해야 합니다.
- 타임아웃 관리: 그레이스 기간 내에 종료되도록 내부 타임아웃을 설정하는 것이 좋습니다.
- 로깅: 셧다운 과정을 로깅하여 문제 발생 시 디버깅에 활용합니다.
최적 실행:
preStop
훅: 쿠버네티스의preStop
훅을 활용하여 추가적인 종료 준비 작업을 수행할 수 있습니다.- 헬스 체크 조정: 종료 중에는 레디니스 프로브를 실패하도록 하여 트래픽을 차단할 수 있습니다.
잠재적 문제:
- 신호 처리 누락: SIGTERM을 처리하지 않으면 그레이스풀 셧다운이 실패하고 SIGKILL로 강제 종료될 수 있습니다.
- 긴 셧다운 시간: 셧다운 과정이 그레이스 기간을 초과하면 강제 종료될 수 있습니다.
PID 1로 실행되는 애플리케이션은 이러한 책임을 직접 관리해야 하므로, 신중한 설계와 구현이 필요합니다. 적절히 구현되면 쿠버네티스 환경에서도 안정적인 그레이스풀 셧다운을 수행할 수 있습니다.
반응형