기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
컨테이너 수명 주기 후크 구성
정상적인 컨테이너 종료 중에는 클라이언트가 가동 중지를 경험하지 않도록 애플리케이션이 종료를 시작하여 SIGTERM
신호에 응답해야 합니다. 애플리케이션은 다음과 같은 정리 절차를 실행해야 합니다.
데이터 저장
파일 설명자 닫기
데이터베이스 연결 닫기
진행 중인 요청을 정상적으로 완료
포드 종료 요청을 이행하기 위해 적시에 종료
정리가 완료될 때까지 충분히 긴 유예 기간을 설정합니다. SIGTERM
신호에 응답하는 방법을 알아보려면 애플리케이션에 사용하는 프로그래밍 언어에 대한 설명서를 참조하세요.
컨테이너 수명 주기 후크를iptables
업데이트되는 연결 손실을 방지할 수 있습니다.
컨테이너 수명 주기와 엔드포인트 및 EndpointSlice는 다양한 APIs. 이러한 APIs를 오케스트레이션하는 것이 중요합니다. 그러나 포드가 종료되면 Kubernetes API는 kubelet(컨테이너 수명 주기용)과 EndpointSlice
컨트롤러 모두에 동시에 알립니다. 다이어그램을 포함한 자세한 내용은 EKS 모범 사례 안내서의 Gracefully handle the client requests
가 포드로 kubelet
SIGTERM
전송되면 EndpointSlice
컨트롤러가 EndpointSlice
객체를 종료합니다. 이 종료는 Kubernetes API 서버에 각 노드kube-proxy
의에 업데이트를 알리도록 알립니다iptables
. 이러한 작업은 동시에 발생하지만 그 사이에 종속성이나 시퀀스는 없습니다. 컨테이너가 kube-proxy
각 노드의가 로컬 iptables
규칙을 업데이트하는 것보다 훨씬 일찍 SIGKILL
신호를 수신할 가능성이 높습니다. 이 경우 가능한 시나리오는 다음과 같습니다.
-
클라이언트 수신 시 애플리케이션이 진행 중인 요청 및 연결을 즉시 끊
SIGTERM,
으면500
오류가 표시됩니다. -
애플리케이션이 수신 시 모든 진행 중인 요청 및 연결이 완전히 처리되도록 하는 경우 유예 기간
SIGTERM
동안iptables
규칙이 아직 업데이트되지 않을 수 있으므로 새 클라이언트 요청이 애플리케이션 컨테이너로 계속 전송됩니다. 정리 절차가 컨테이너의 서버 소켓을 닫을 때까지 이러한 새 요청은 새 연결을 초래합니다. 유예 기간이 종료되면가SIGTERM
전송된 후 설정된 새 연결이 조건 없이 삭제됩니다.
이전 시나리오를 해결하기 위해 인앱 통합 또는 PreStop 수명 주기 후크를 구현할 수 있습니다. 다이어그램을 포함한 자세한 내용은 EKS 모범 사례 안내서의 애플리케이션을 정상적으로 종료
참고: 애플리케이션이 정상적으로 종료되는지 또는 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
자세한 내용은 컨테이너 후크