

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 컨테이너 수명 주기 후크 구성
<a name="lifecycle-hooks"></a>

정상적인 컨테이너 종료 중에는 클라이언트가 가동 중지를 경험하지 않도록 애플리케이션이 종료를 시작하여 `SIGTERM` 신호에 응답해야 합니다. 애플리케이션은 다음과 같은 정리 절차를 실행해야 합니다.
+ 데이터 저장
+ 파일 설명자 닫기
+ 데이터베이스 연결 닫기
+ 진행 중인 요청을 정상적으로 완료
+ 포드 종료 요청을 이행하기 위해 적시에 종료

정리가 완료될 때까지 충분히 긴 유예 기간을 설정합니다. `SIGTERM` 신호에 응답하는 방법을 알아보려면 애플리케이션에 사용하는 프로그래밍 언어에 대한 설명서를 참조하세요.

[컨테이너 수명 주기 후크를](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/) 사용하면 컨테이너가 관리 수명 주기의 이벤트를 인식할 수 있습니다. 컨테이너는 해당 수명 주기 후크가 실행될 때 핸들러에 구현된 코드를 실행할 수 있습니다. 컨테이너 수명 주기 후크는 Kubernetes와 클라우드의 비동기 특성에 대한 해결 방법을 제공합니다. 이 접근 방식은 수신 리소스 전에 종료 포드로 전달되고 새 트래픽을 포드로 보내지 않도록 `iptables` 업데이트되는 연결 손실을 방지할 수 있습니다.

컨테이너 수명 주기, `Endpoint`및 `EndpointSlice`는 다양한 APIs. 이러한 APIs를 오케스트레이션하는 것이 중요합니다. 그러나 포드가 종료되면 Kubernetes API는 kubelet(컨테이너 수명 주기용)과 `EndpointSlice` 컨트롤러 모두에 동시에 알립니다. 다이어그램을 포함한 자세한 내용은 *Amazon EKS 모범 사례 안내서*의 [Gracefully handle the client requests](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_handle_the_client_requests)를 참조하세요.

가 포드로 `kubelet` `SIGTERM` 전송되면 `EndpointSlice` 컨트롤러는 `EndpointSlice` 객체를 종료합니다. 이 종료는 Kubernetes API 서버에 업데이트하도록 각 노드`kube-proxy`의에 알립니다`iptables`. 이러한 작업은 동시에 발생하지만 그 사이에 종속성이나 시퀀스는 없습니다. 컨테이너가 `kube-proxy` 각 노드의가 로컬 `iptables` 규칙을 업데이트하는 것보다 훨씬 일찍 `SIGKILL` 신호를 수신할 가능성이 높습니다. 이 경우 가능한 시나리오는 다음과 같습니다.
+ 애플리케이션이 수신 시 진행 중인 요청 및 연결을 즉시 끊으면 클라이언트`SIGTERM`에 `500` 오류가 표시됩니다.
+ 애플리케이션이 수신 시 모든 진행 중인 요청 및 연결이 완전히 처리되도록 하는 경우 유예 기간 `SIGTERM`동안 `iptables` 규칙이 아직 업데이트되지 않을 수 있으므로 새 클라이언트 요청이 애플리케이션 컨테이너로 계속 전송됩니다. 정리 절차가 컨테이너의 서버 소켓을 닫을 때까지 이러한 새 요청은 새 연결을 초래합니다. 유예 기간이 종료되면가 `SIGTERM` 전송된 후 설정된 새 연결이 조건 없이 삭제됩니다.

이전 시나리오를 해결하기 위해 인앱 통합 또는 PreStop 수명 주기 후크를 구현할 수 있습니다. 다이어그램을 포함한 자세한 내용은 *Amazon EKS 모범 사례 안내서*의 [애플리케이션을 정상적으로 종료](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_shutdown_applications)하기를 참조하세요.

**참고**  
애플리케이션이 정상적으로 종료되는지 또는 `preStop` 후크의 결과에 관계없이 애플리케이션 컨테이너는를 통해 유예 기간이 끝날 때 최종 종료됩니다`SIGKILL`.

`sleep` 명령과 함께 `preStop` 후크를 사용하여 전송을 지연합니다`SIGTERM`. 이렇게 하면 수신 객체가 새 연결을 포드로 라우팅하는 동안 새 연결을 계속 수락하는 데 도움이 됩니다. 다음 예제와 같이 `sleep` 명령의 시간 값을 테스트하여 Kubernetes 및 기타 애플리케이션 종속성의 지연 시간이 고려되는지 확인합니다.

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      lifecycle:
        # This "sleep" preStop hook delays the Pod shutdown until
        # after the Ingress Controller removes the matching Endpoint or EndpointSlice
        preStop:
          exec:
            command:
              - /bin/sleep
              - "20"
              # This period should be turned to Ingress/Service Mesh update latency
```

자세한 내용은 Kubernetes 설명서의 [컨테이너 후크](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks) 및 *Amazon EKS 모범 사례 안내서*의 [애플리케이션을 정상적으로 종료](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html#_gracefully_shutdown_applications)를 참조하세요.