[Kubernetes] Graceful하게 애플리케이션 운영하기 (Graceful Shutdown)

    반응형
    SMALL

     

    [Issue] Graceful하지 못한 애플리케이션 운영

    아래 동영상과 같이 Graceful Shutdown을 적용하지 않으면 애플리케이션이 재시작 또는 삭제되는 과정에서 진행중인 요청이 중단되어 사용자에게 오류가 발생하게된다.

    [Configuration] Graceful Shutdown 설정 (Kubernetes)

    ※ 우선 실습을 위한 애플리케이션은 Spring boot로 작성하였으며, /long-running URI로 접근 시 10초 동안 대기 후 응답을 반환하는 간단한 spring boot 웹 애플리케이션을 작성 후 진행하였다. 

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: graceful-deploy
      namespace: graceful
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: graceful
      template:
        metadata:
          labels:
            app: graceful
            version: v1
        spec:
          containers:
          - name: graceful
            image: 000000000000.dkr.ecr.us-east-2.amazonaws.com/graceful:v1
            ports:
            - containerPort: 8080
            lifecycle:
              preStop:
                exec:
                  command: ["/bin/sh","-c","sleep 20"]
          terminationGracePeriodSeconds: 30

     

    애플리케이션 단에서 처리가 힘들 경우 Deployment 에 lifecycle과 terminationGracePeriodSeconds 옵션을 통해 Kubernetes 환경에서 간단히 해결할 수 있다.

            lifecycle:
              preStop:
                exec:
                  command: ["/bin/sh","-c","sleep 20"]
          terminationGracePeriodSeconds: 30

     

    현재 샘플에서는 sleep을 사용하여 20초 정도 Delay 시켰으나, 다른 방식으로 컨테이너에 호출을해서 대기 시킬 수 있는 API 또는 명령어가 있을 경우 해당 방식으로 사용해도 무방한다.

     

    추가로, 더 안전하게 Graceful Shutdown을 사용하려면 재시작이나 삭제가될 때 더 이상 트래픽이 들어오지 않도록 제한시키는 방법도 있다. (조만간 관련하여 글 올리겠습니다..)

    lifecycle.preStop란? :컨테이너가 종료되기 직전에 실행되는 Hook이다. (exec 명령 실행, HTTP GET 요청 전송 지원)
    동작과정: preStop Hook 실행 -> SIGTERM 시그널 발생 -> 컨테이너 종료
    주의사항: terminationGracePeriodSeconds 시간 내에 완료되어야한다.

    terminationgracePeriodSeconds란? Kubernetes에서 Pod를 안전하게 종료하기 위해 사용하는 설정이다.
    동작과정: SIGTERM 신호 전송 후 지정된 시간 동안 대기한다. 만약 시간 내에 종료되지 않으면 SIGKILL 신호를 강제로 전송한다.

     

     

    반응형
    LIST

    댓글