Dev/KUBERNETES

쿠버네티스에서 애플리케이션의 PID가 1번일 때 그레이스풀 셧다운 과정

Andrea.K 2024. 8. 27. 23:29
반응형

쿠버네티스에서 애플리케이션의 PID가 1번일 때 그레이스풀 셧다운 과정은 다음과 같이 진행됩니다:

  1. 신호 처리:

    • 쿠버네티스는 파드를 종료할 때 먼저 SIGTERM 신호를 보냅니다.
    • PID 1 프로세스는 기본적으로 SIGTERM을 무시하므로, 애플리케이션에서 이 신호를 명시적으로 처리해야 합니다.
  2. 그레이스 기간:

    • 쿠버네티스는 SIGTERM 신호를 보낸 후 기본적으로 30초(설정 가능)의 그레이스 기간을 제공합니다.
    • 이 기간 동안 애플리케이션은 그레이스풀 셧다운을 수행해야 합니다.
  3. 애플리케이션의 책임:

    • 신호 캐치: SIGTERM 신호를 캐치하고 처리하는 로직이 필요합니다.
    • 셧다운 로직 실행: 진행 중인 작업 완료, 리소스 정리 등을 수행합니다.
    • 적시에 종료: 그레이스 기간 내에 종료되어야 합니다.
  4. SIGKILL 처리:

    • 그레이스 기간이 끝나도 프로세스가 종료되지 않으면, 쿠버네티스는 SIGKILL을 보냅니다.
    • SIGKILL은 무시할 수 없으며, 프로세스를 즉시 종료합니다.
  5. 구현 예시 (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() {
        // 여기에 셧다운 로직 구현
        // 예: 진행 중인 작업 완료, 연결 종료, 리소스 정리 등
    }
  6. 주의사항:

    • 신호 처리 필수: PID 1 프로세스는 반드시 SIGTERM을 명시적으로 처리해야 합니다.
    • 타임아웃 관리: 그레이스 기간 내에 종료되도록 내부 타임아웃을 설정하는 것이 좋습니다.
    • 로깅: 셧다운 과정을 로깅하여 문제 발생 시 디버깅에 활용합니다.
  7. 최적 실행:

    • preStop 훅: 쿠버네티스의 preStop 훅을 활용하여 추가적인 종료 준비 작업을 수행할 수 있습니다.
    • 헬스 체크 조정: 종료 중에는 레디니스 프로브를 실패하도록 하여 트래픽을 차단할 수 있습니다.
  8. 잠재적 문제:

    • 신호 처리 누락: SIGTERM을 처리하지 않으면 그레이스풀 셧다운이 실패하고 SIGKILL로 강제 종료될 수 있습니다.
    • 긴 셧다운 시간: 셧다운 과정이 그레이스 기간을 초과하면 강제 종료될 수 있습니다.

PID 1로 실행되는 애플리케이션은 이러한 책임을 직접 관리해야 하므로, 신중한 설계와 구현이 필요합니다. 적절히 구현되면 쿠버네티스 환경에서도 안정적인 그레이스풀 셧다운을 수행할 수 있습니다.

반응형